/* @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 #include #include #include #include #include #include #include #include #include #include using namespace boost::hana; struct invalid { }; using test::ct_eq; int main() { auto ints = make( test::cnumeric, test::cnumeric, test::cnumeric, test::cnumeric, test::cnumeric ); (void)ints; #if BOOST_HANA_TEST_PART == 1 ////////////////////////////////////////////////////////////////////////// // Constant ////////////////////////////////////////////////////////////////////////// { // value static_assert(value(test::cnumeric) == 0, ""); static_assert(value(test::cnumeric) == 1, ""); // laws test::TestConstant>{ints, tuple_t}; } ////////////////////////////////////////////////////////////////////////// // Enumerable, Monoid, Group, Ring, IntegralDomain ////////////////////////////////////////////////////////////////////////// { test::TestEnumerable>{ints}; test::TestMonoid>{ints}; test::TestGroup>{ints}; test::TestRing>{ints}; test::TestIntegralDomain>{ints}; } #elif BOOST_HANA_TEST_PART == 2 ////////////////////////////////////////////////////////////////////////// // Comparable ////////////////////////////////////////////////////////////////////////// test::TestComparable>{ints}; #elif BOOST_HANA_TEST_PART == 3 ////////////////////////////////////////////////////////////////////////// // Orderable ////////////////////////////////////////////////////////////////////////// test::TestOrderable>{ints}; #elif BOOST_HANA_TEST_PART == 4 ////////////////////////////////////////////////////////////////////////// // Logical ////////////////////////////////////////////////////////////////////////// { constexpr auto true_ = test::cnumeric; constexpr auto false_ = test::cnumeric; // not_ { BOOST_HANA_CONSTANT_CHECK(equal(not_(true_), false_)); } // and_ { BOOST_HANA_CONSTANT_CHECK(equal( and_(true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(true_, true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(true_, false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(false_, invalid{}), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(true_, true_, true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(true_, true_, false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(true_, false_, invalid{}), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( and_(false_, invalid{}, invalid{}), false_ )); } // or_ { BOOST_HANA_CONSTANT_CHECK(equal( or_(true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_, false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_, true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(true_, invalid{}), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_, false_, false_), false_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_, false_, true_), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(false_, true_, invalid{}), true_ )); BOOST_HANA_CONSTANT_CHECK(equal( or_(true_, invalid{}, invalid{}), true_ )); } // if_ { BOOST_HANA_CONSTANT_CHECK(equal( if_(true_, ct_eq<3>{}, ct_eq<4>{}), ct_eq<3>{} )); BOOST_HANA_CONSTANT_CHECK(equal( if_(false_, ct_eq<3>{}, ct_eq<4>{}), ct_eq<4>{} )); } // eval_if { auto t = [](auto) { return ct_eq<2>{}; }; auto e = [](auto) { return ct_eq<3>{}; }; BOOST_HANA_CONSTANT_CHECK(equal( eval_if(true_, t, invalid{}), ct_eq<2>{} )); BOOST_HANA_CONSTANT_CHECK(equal( eval_if(false_, invalid{}, e), ct_eq<3>{} )); } // while_ { test::_injection<0> f{}; BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(ct_eq<0>{}), ct_eq<0>{}, invalid{}), ct_eq<0>{} )); BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(f(ct_eq<0>{})), ct_eq<0>{}, f), f(ct_eq<0>{}) )); BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(f(f(ct_eq<0>{}))), ct_eq<0>{}, f), f(f(ct_eq<0>{})) )); BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(f(f(f(ct_eq<0>{})))), ct_eq<0>{}, f), f(f(f(ct_eq<0>{}))) )); BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(f(f(f(f(ct_eq<0>{}))))), ct_eq<0>{}, f), f(f(f(f(ct_eq<0>{})))) )); // Make sure it can be called with an lvalue state: auto state = ct_eq<0>{}; BOOST_HANA_CONSTANT_CHECK(equal( while_(not_equal.to(f(f(f(f(ct_eq<0>{}))))), state, f), f(f(f(f(ct_eq<0>{})))) )); } // until { test::_injection<0> f{}; BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(ct_eq<0>{}), ct_eq<0>{}, invalid{}), ct_eq<0>{} )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(f(ct_eq<0>{})), ct_eq<0>{}, f), f(ct_eq<0>{}) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(f(f(ct_eq<0>{}))), ct_eq<0>{}, f), f(f(ct_eq<0>{})) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(f(f(f(ct_eq<0>{})))), ct_eq<0>{}, f), f(f(f(ct_eq<0>{}))) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(f(f(f(f(ct_eq<0>{}))))), ct_eq<0>{}, f), f(f(f(f(ct_eq<0>{})))) )); // Make sure it can be called with an lvalue state: auto state = ct_eq<0>{}; BOOST_HANA_CONSTANT_CHECK(equal( until(equal.to(f(f(f(f(ct_eq<0>{}))))), state, f), f(f(f(f(ct_eq<0>{})))) )); } // laws test::TestLogical>{make( test::cnumeric, test::cnumeric )}; } #endif }