/* @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 // tested instances #include #include using namespace boost::hana; namespace boost { namespace hana { namespace test { template auto instances> = tuple( type, type ); template auto objects> = tuple( cnumeric, cnumeric, cnumeric, cnumeric ); }}} namespace boost { namespace hana { template struct enabled_operators> : Logical { }; }} int main() { test::check_datatype>(); // Constant { // value { static_assert(value(test::cnumeric) == 0, ""); static_assert(value(test::cnumeric) == 1, ""); } } // Logical { struct invalid { }; constexpr auto true_ = test::cnumeric; constexpr auto false_ = test::cnumeric; constexpr auto x = test::cnumeric; constexpr auto y = 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_, x, y), x )); BOOST_HANA_CONSTANT_CHECK(equal( if_(false_, x, y), y )); } // eval_if { auto t = [=](auto) { return x; }; auto e = [=](auto) { return y; }; BOOST_HANA_CONSTANT_CHECK(equal( eval_if(true_, t, invalid{}), x )); BOOST_HANA_CONSTANT_CHECK(equal( eval_if(false_, invalid{}, e), y )); } // while_ { //! @todo implement this } // until { using test::x; auto equal_to = curry<2>(equal); struct { } invalid{}; auto f = test::injection([]{}); BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(x<0>), x<0>, invalid), x<0> )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(f(x<0>)), x<0>, f), f(x<0>) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(f(f(x<0>))), x<0>, f), f(f(x<0>)) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(f(f(f(x<0>)))), x<0>, f), f(f(f(x<0>))) )); BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(f(f(f(f(x<0>))))), x<0>, f), f(f(f(f(x<0>)))) )); // Make sure it can be called with an lvalue state: auto state = x<0>; BOOST_HANA_CONSTANT_CHECK(equal( until(equal_to(f(f(f(f(x<0>))))), state, f), f(f(f(f(x<0>)))) )); } // operators { using namespace boost::hana::operators; BOOST_HANA_CONSTANT_CHECK(equal( !true_, not_(true_) )); BOOST_HANA_CONSTANT_CHECK(equal( true_ && true_, and_(true_, true_) )); BOOST_HANA_CONSTANT_CHECK(equal( false_ || false_, or_(false_, false_) )); } } }