/* @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 using namespace boost::hana; namespace boost { namespace hana { namespace test { template <> auto objects = tuple( tuple() , tuple(x<0>) , tuple(x<0>, x<1>) , tuple(x<0>, x<1>, x<2>) , tuple(x<0>, x<1>, x<2>, x<3>) , tuple(x<0>, x<1>, x<2>, x<3>, x<4>) , tuple(x<0>, x<1>, x<2>, x<3>, x<4>, x<5>) ); template <> auto instances = tuple( type , type , type , type ); }}} namespace check_adl { template struct invalid { static_assert(b, "invalid must not be instantiated"); }; template void adl(T) { } void foo() { // ADL kicks in but `invalid<>` must not instantiated adl(tuple_t>); } } 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 = tuple(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 = tuple(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 = tuple(movable{}); auto by_ref = [](auto&) { }; by_ref(xs); by_ref(head(xs)); by_ref(at_c<0>(xs)); by_ref(last(xs)); } } // Comparable { // equal { 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)); } } // Foldable { // unpack { auto f = test::injection([]{}); // tuple BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple(), f), f() )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple(x<0>), f), f(x<0>) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple(x<0>, x<1>), f), f(x<0>, x<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple(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 ////////////////// // operators { BOOST_HANA_CONSTANT_CHECK(equal( tuple(x<0>, x<1>)[int_<0>], x<0> )); } /////////////////// // 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 )); } } // MonadPlus { // prepend { BOOST_HANA_CONSTANT_CHECK(equal( prepend(integral_constant, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(integral_constant, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(integral_constant, tuple_c), tuple_c )); BOOST_HANA_CONSTANT_CHECK(equal( prepend(integral_constant, 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 )); } } }