Skip to content

Commit

Permalink
Add experimental views
Browse files Browse the repository at this point in the history
Closes #193
  • Loading branch information
ldionne committed Jan 15, 2016
1 parent a250583 commit 9b93fb0
Show file tree
Hide file tree
Showing 26 changed files with 1,964 additions and 0 deletions.
512 changes: 512 additions & 0 deletions include/boost/hana/experimental/view.hpp

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions test/experimental/view/empty/is_empty.cpp
@@ -0,0 +1,18 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/is_empty.hpp>
namespace hana = boost::hana;


int main() {
{
auto empty = hana::experimental::empty_view();
BOOST_HANA_CONSTANT_CHECK(hana::is_empty(empty));
}
}
23 changes: 23 additions & 0 deletions test/experimental/view/empty/length.cpp
@@ -0,0 +1,23 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/length.hpp>
namespace hana = boost::hana;


int main() {
{
auto empty = hana::experimental::empty_view();
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(empty),
hana::size_c<0>
));
}
}
26 changes: 26 additions & 0 deletions test/experimental/view/empty/unpack.cpp
@@ -0,0 +1,26 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/unpack.hpp>

#include <laws/base.hpp>
namespace hana = boost::hana;


int main() {
auto f = hana::test::_injection<0>{};

{
auto empty = hana::experimental::empty_view();
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(empty, f),
f()
));
}
}
99 changes: 99 additions & 0 deletions test/experimental/view/joined/at.cpp
@@ -0,0 +1,99 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/at.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/integral_constant.hpp>

#include <laws/base.hpp>
#include <test/seq.hpp>
namespace hana = boost::hana;
using hana::test::ct_eq;


int main() {
auto container = hana::test::seq;

{
auto storage1 = container(ct_eq<0>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
}{
auto storage1 = container();
auto storage2 = container(ct_eq<0>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
}

{
auto storage1 = container(ct_eq<0>{}, ct_eq<1>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<1>),
ct_eq<1>{}
));
}{
auto storage1 = container(ct_eq<0>{});
auto storage2 = container(ct_eq<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<1>),
ct_eq<1>{}
));
}{
auto storage1 = container();
auto storage2 = container(ct_eq<0>{}, ct_eq<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<1>),
ct_eq<1>{}
));
}

{
auto storage1 = container(ct_eq<0>{}, ct_eq<1>{});
auto storage2 = container(ct_eq<2>{}, ct_eq<3>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<0>),
ct_eq<0>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<1>),
ct_eq<1>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<2>),
ct_eq<2>{}
));
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::at(joined, hana::size_c<3>),
ct_eq<3>{}
));
}
}
45 changes: 45 additions & 0 deletions test/experimental/view/joined/is_empty.cpp
@@ -0,0 +1,45 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/is_empty.hpp>
#include <boost/hana/not.hpp>

#include <test/seq.hpp>
namespace hana = boost::hana;


template <int> struct undefined { };

int main() {
auto container = hana::test::seq;

{
auto storage1 = container();
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::is_empty(joined));
}
{
auto storage1 = container(undefined<0>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(joined)));
}
{
auto storage1 = container(undefined<0>{});
auto storage2 = container(undefined<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(joined)));
}
{
auto storage1 = container();
auto storage2 = container(undefined<0>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::not_(hana::is_empty(joined)));
}
}
91 changes: 91 additions & 0 deletions test/experimental/view/joined/length.cpp
@@ -0,0 +1,91 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/length.hpp>

#include <test/seq.hpp>
namespace hana = boost::hana;


template <int> struct undefined { };

int main() {
auto container = hana::test::seq;

{
auto storage1 = container();
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<0>
));
}

{
auto storage1 = container(undefined<0>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<1>
));
}

{
auto storage1 = container();
auto storage2 = container(undefined<0>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<1>
));
}

{
auto storage1 = container(undefined<0>{});
auto storage2 = container(undefined<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<2>
));
}

{
auto storage1 = container(undefined<0>{});
auto storage2 = container(undefined<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<2>
));
}

{
auto storage1 = container(undefined<0>{}, undefined<1>{});
auto storage2 = container(undefined<2>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<3>
));
}

{
auto storage1 = container(undefined<0>{}, undefined<1>{}, undefined<2>{});
auto storage2 = container(undefined<3>{}, undefined<4>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::length(joined),
hana::size_c<5>
));
}
}
83 changes: 83 additions & 0 deletions test/experimental/view/joined/unpack.cpp
@@ -0,0 +1,83 @@
/*
@copyright Louis Dionne 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/

#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/experimental/view.hpp>
#include <boost/hana/unpack.hpp>

#include <laws/base.hpp>
#include <test/seq.hpp>
namespace hana = boost::hana;
using hana::test::ct_eq;


int main() {
auto container = hana::test::seq;
auto f = hana::test::_injection<0>{};

{
auto storage1 = container();
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f()
));
}

{
auto storage1 = container(ct_eq<0>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{})
));
}{
auto storage1 = container();
auto storage2 = container(ct_eq<0>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{})
));
}{
auto storage1 = container(ct_eq<0>{});
auto storage2 = container(ct_eq<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{}, ct_eq<1>{})
));
}

{
auto storage1 = container(ct_eq<0>{}, ct_eq<1>{});
auto storage2 = container();
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{}, ct_eq<1>{})
));
}{
auto storage1 = container();
auto storage2 = container(ct_eq<0>{}, ct_eq<1>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{}, ct_eq<1>{})
));
}{
auto storage1 = container(ct_eq<0>{}, ct_eq<1>{});
auto storage2 = container(ct_eq<2>{}, ct_eq<3>{});
auto joined = hana::experimental::joined(storage1, storage2);
BOOST_HANA_CONSTANT_CHECK(hana::equal(
hana::unpack(joined, f),
f(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})
));
}
}

0 comments on commit 9b93fb0

Please sign in to comment.