/* @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 // instances #include #include using namespace boost::hana; template auto key = test::x; template auto val = test::x<-i>; template auto p = test::minimal_product(key, val); namespace boost { namespace hana { namespace test { template <> auto instances = make( type, type ); template <> auto objects = make( make(), make(p<1, 1>), make(p<1, 2>), make(p<1, 1>, p<2, 2>) ); }}} int main() { test::check_datatype(); // Map interface { auto list = test::seq; auto foldable = test::seq; auto record = test::minimal_record; using L = test::Seq; using test::x; // keys { BOOST_HANA_CONSTANT_CHECK(equal( keys(make()), list() )); BOOST_HANA_CONSTANT_CHECK(equal( keys(make(p<1, 1>)), list(key<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( keys(make(p<1, 1>, p<2, 2>)), list(key<1>, key<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( keys(make(p<1, 1>, p<2, 2>, p<3, 3>)), list(key<1>, key<2>, key<3>) )); } // values { BOOST_HANA_CONSTANT_CHECK(equal( values(make()), list() )); BOOST_HANA_CONSTANT_CHECK(equal( values(make(p<1, 1>)), list(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(make(p<1, 1>, p<2, 2>)), list(val<1>, val<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(make(p<1, 1>, p<2, 2>, p<3, 3>)), list(val<1>, val<2>, val<3>) )); } // Conversions { // Record -> Map { BOOST_HANA_CONSTANT_CHECK(equal( to(record(test::x<1>, test::x<2>)), make(pair(test::member1, test::x<1>), pair(test::member2, test::x<2>)) )); } // Foldable -> Map { BOOST_HANA_CONSTANT_CHECK(equal( to(foldable()), make() )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>)), make(p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>, p<2, 2>)), make(p<1, 1>, p<2, 2>) )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>, p<2, 2>, p<3, 3>)), make(p<1, 1>, p<2, 2>, p<3, 3>) )); } // Map -> Sequence { BOOST_HANA_CONSTEXPR_LAMBDA auto check = [=](auto ...xs) { BOOST_HANA_CONSTANT_CHECK( elem(permutations(list(xs...)), to(make(xs...))) ); }; check(); check(p<1, 1>); check(p<1, 1>, p<2, 2>); check(p<1, 1>, p<2, 2>, p<3, 3>); check(p<1, 1>, p<2, 2>, p<3, 3>, p<4, 4>); } } } // Comparable { // equal { BOOST_HANA_CONSTANT_CHECK(equal( make(), make() )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>), make()) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(), make(p<1, 1>) ))); BOOST_HANA_CONSTANT_CHECK(equal( make(p<1, 1>), make(p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>), make(p<1, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>), make(p<2, 1>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>), make(p<1, 1>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(equal( make(p<1, 1>, p<2, 2>), make(p<1, 1>, p<2, 2>) )); BOOST_HANA_CONSTANT_CHECK(equal( make(p<1, 1>, p<2, 2>), make(p<2, 2>, p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>, p<2, 2>), make(p<9, 1>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>, p<2, 2>), make(p<1, 9>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>, p<2, 2>), make(p<1, 1>, p<9, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>, p<2, 2>), make(p<1, 1>, p<2, 9>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( make(p<1, 1>, p<2, 2>), make(p<1, 1>, p<2, 2>, p<3, 3>)) )); } } // Searchable { // any_of { BOOST_HANA_CONSTANT_CHECK( not_(any_of(make(), equal.to(key<1>))) ); BOOST_HANA_CONSTANT_CHECK( any_of(make(p<1, 1>), equal.to(key<1>)) ); BOOST_HANA_CONSTANT_CHECK( not_(any_of(make(p<1, 1>), equal.to(key<2>))) ); BOOST_HANA_CONSTANT_CHECK( any_of(make(p<1, 1>, p<2, 2>), equal.to(key<1>)) ); BOOST_HANA_CONSTANT_CHECK( any_of(make(p<1, 1>, p<2, 2>), equal.to(key<2>)) ); BOOST_HANA_CONSTANT_CHECK( not_(any_of(make(p<1, 1>, p<2, 2>), equal.to(key<3>))) ); } // find { BOOST_HANA_CONSTANT_CHECK(equal( find(make(), equal.to(key<1>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(make(p<1, 1>), equal.to(key<1>)), just(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(make(p<1, 1>), equal.to(key<2>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(make(p<1, 1>, p<2, 2>), equal.to(key<1>)), just(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(make(p<1, 1>, p<2, 2>), equal.to(key<2>)), just(val<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(make(p<1, 1>, p<2, 2>), equal.to(key<3>)), nothing )); } } }