/* @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( map(), map(p<1, 1>), map(p<1, 2>), map(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(map()), list() )); BOOST_HANA_CONSTANT_CHECK(equal( keys(map(p<1, 1>)), list(key<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( keys(map(p<1, 1>, p<2, 2>)), list(key<1>, key<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( keys(map(p<1, 1>, p<2, 2>, p<3, 3>)), list(key<1>, key<2>, key<3>) )); } // values { BOOST_HANA_CONSTANT_CHECK(equal( values(map()), list() )); BOOST_HANA_CONSTANT_CHECK(equal( values(map(p<1, 1>)), list(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(map(p<1, 1>, p<2, 2>)), list(val<1>, val<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(map(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>)), map(pair(test::member1, test::x<1>), pair(test::member2, test::x<2>)) )); } // Foldable -> Map { BOOST_HANA_CONSTANT_CHECK(equal( to(foldable()), map() )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>)), map(p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>, p<2, 2>)), map(p<1, 1>, p<2, 2>) )); BOOST_HANA_CONSTANT_CHECK(equal( to(foldable(p<1, 1>, p<2, 2>, p<3, 3>)), map(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(map(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(map(), map())); BOOST_HANA_CONSTANT_CHECK(not_(equal(map(p<1, 1>), map()))); BOOST_HANA_CONSTANT_CHECK(not_(equal(map(), map(p<1, 1>)))); BOOST_HANA_CONSTANT_CHECK(equal( map(p<1, 1>), map(p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>), map(p<1, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>), map(p<2, 1>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>), map(p<1, 1>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(equal( map(p<1, 1>, p<2, 2>), map(p<1, 1>, p<2, 2>) )); BOOST_HANA_CONSTANT_CHECK(equal( map(p<1, 1>, p<2, 2>), map(p<2, 2>, p<1, 1>) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>, p<2, 2>), map(p<9, 1>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>, p<2, 2>), map(p<1, 9>, p<2, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>, p<2, 2>), map(p<1, 1>, p<9, 2>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>, p<2, 2>), map(p<1, 1>, p<2, 9>)) )); BOOST_HANA_CONSTANT_CHECK(not_(equal( map(p<1, 1>, p<2, 2>), map(p<1, 1>, p<2, 2>, p<3, 3>)) )); } } // Searchable { // any_of { BOOST_HANA_CONSTANT_CHECK(not_(any_of(map(), equal.to(key<1>)))); BOOST_HANA_CONSTANT_CHECK(any_of(map(p<1, 1>), equal.to(key<1>))); BOOST_HANA_CONSTANT_CHECK(not_(any_of(map(p<1, 1>), equal.to(key<2>)))); BOOST_HANA_CONSTANT_CHECK(any_of(map(p<1, 1>, p<2, 2>), equal.to(key<1>))); BOOST_HANA_CONSTANT_CHECK(any_of(map(p<1, 1>, p<2, 2>), equal.to(key<2>))); BOOST_HANA_CONSTANT_CHECK(not_(any_of(map(p<1, 1>, p<2, 2>), equal.to(key<3>)))); } // find { BOOST_HANA_CONSTANT_CHECK(equal( find(map(), equal.to(key<1>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>), equal.to(key<1>)), just(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>), equal.to(key<2>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), equal.to(key<1>)), just(val<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), equal.to(key<2>)), just(val<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), equal.to(key<3>)), nothing )); } } }