/* @copyright Louis Dionne 2014 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 #include #include #include #include #include #include #include #include #include using namespace boost::hana; template constexpr auto ord = test::cnumeric; namespace boost { namespace hana { namespace test { template <> auto objects = make( make() , make(ord<0>) , make(ord<0>, ord<1>) , make(ord<0>, ord<1>, ord<2>) , make(ord<0>, ord<1>, ord<2>, ord<3>) , make(ord<0>, ord<1>, ord<2>, ord<3>, ord<4>) , make(ord<0>, ord<1>, ord<2>, ord<3>, ord<4>, ord<5>) ); template <> auto instances = make( type ); }}} struct x0; struct x1; struct x2; struct x3; int main() { test::check_datatype(); using test::x; // move-only friendliness and reference semantics { struct movable { movable() = default; movable(movable const&) = delete; movable(movable&&) = default; }; { auto xs = make(movable{}); auto by_val = [](auto) { }; by_val(std::move(xs)); by_val(head(std::move(xs))); by_val(at_c<0>(std::move(xs))); by_val(last(std::move(xs))); } { auto const& xs = make(movable{}); auto by_const_ref = [](auto const&) { }; by_const_ref(xs); by_const_ref(head(xs)); by_const_ref(at_c<0>(xs)); by_const_ref(last(xs)); } { auto xs = make(movable{}); auto by_ref = [](auto&) { }; by_ref(xs); by_ref(head(xs)); by_ref(at_c<0>(xs)); by_ref(last(xs)); } } // `decltype(tuple_t)` should inherit `_tuple_t` { static_assert(std::is_base_of< _tuple_t, decltype(tuple_t) >{}, ""); } // Comparable { // equal { // tuple_t BOOST_HANA_CONSTANT_CHECK(equal(tuple_t<>, tuple_t<>)); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t<>))); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t<>, tuple_t))); BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t))); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t))); BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); // tuple_c BOOST_HANA_CONSTANT_CHECK(equal(tuple_c, tuple_c)); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_c, tuple_c))); BOOST_HANA_CONSTANT_CHECK(equal(tuple_c, tuple_c)); BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_c, tuple_c))); BOOST_HANA_CONSTANT_CHECK(equal(tuple_c, tuple_c)); BOOST_HANA_CONSTANT_CHECK(equal(tuple_c, tuple_c)); } } // Foldable { // unpack { auto f = test::injection([]{}); // tuple BOOST_HANA_CONSTANT_CHECK(equal( unpack(make(), f), f() )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(make(x<0>), f), f(x<0>) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(make(x<0>, x<1>), f), f(x<0>, x<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(make(x<0>, x<1>, x<2>), f), f(x<0>, x<1>, x<2>) )); // tuple_t BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple_t<>, f), f() )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple_t, f), f(type) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple_t, f), f(type, type) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple_t, f), f(type, type, type) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple_t, f), f(type, type, type, type) )); } } // Iterable { /////////////////// // tuple_t ////////////////// // head { BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); } // is_empty { BOOST_HANA_CONSTANT_CHECK(is_empty(tuple_t<>)); BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_t))); BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_t))); } // tail { BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t<>)); BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t)); BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t)); } ////////////////// // tuple_c ///////////////// // head { BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); } // is_empty { BOOST_HANA_CONSTANT_CHECK(is_empty(tuple_c)); BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); } // tail { BOOST_HANA_CONSTANT_CHECK(equal( tail(tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( tail(tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( tail(tuple_c), tuple_c )); } // operators { BOOST_HANA_CONSTANT_CHECK(equal( make(x<0>, x<1>)[size_t<0>], x<0> )); BOOST_HANA_CONSTANT_CHECK(equal( tuple_t[size_t<0>], type )); BOOST_HANA_CONSTANT_CHECK(equal( tuple_t[size_t<1>], type )); } } // MonadPlus { // prepend { BOOST_HANA_CONSTANT_CHECK(equal( prepend(long_<0>, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(uint<0>, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(llong<0>, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(ulong<0>, tuple_c), tuple_c )); } // nil { BOOST_HANA_CONSTANT_CHECK(equal( nil(), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( nil(), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( nil(), tuple_c )); } } }