/* @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 #include #include #include #include #include using namespace boost::hana; template using eq = test::ct_eq; template using ord = test::ct_ord; struct x0; struct x1; struct x2; struct x3; int main() { ////////////////////////////////////////////////////////////////////////// // Setup for the laws below ////////////////////////////////////////////////////////////////////////// auto eq_tuples = make( make() , make(eq<0>{}) , make(eq<0>{}, eq<1>{}) , make(eq<0>{}, eq<1>{}, eq<2>{}) , make(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{}) , make(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{}, eq<4>{}) ); auto ord_tuples = 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>{}) ); ////////////////////////////////////////////////////////////////////////// // 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)); test::TestComparable{eq_tuples}; } ////////////////////////////////////////////////////////////////////////// // Orderable ////////////////////////////////////////////////////////////////////////// { test::TestOrderable{ord_tuples}; } }