/* @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 // instances #include #include using namespace boost::hana; template auto key = test::x; template auto value = test::x<-i>; template auto p = test::minimal_product(key, value); namespace boost { namespace hana { namespace test { template <> auto instances = tuple( type, type ); template <> auto objects = tuple( 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(value<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(map(p<1, 1>, p<2, 2>)), list(value<1>, value<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( values(map(p<1, 1>, p<2, 2>, p<3, 3>)), list(value<1>, value<2>, value<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 -> List { 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 { auto is = [](auto x) { return [=](auto y) { return equal(x, y); }; }; // any { BOOST_HANA_CONSTANT_CHECK(not_(any(map(), is(key<1>)))); BOOST_HANA_CONSTANT_CHECK(any(map(p<1, 1>), is(key<1>))); BOOST_HANA_CONSTANT_CHECK(not_(any(map(p<1, 1>), is(key<2>)))); BOOST_HANA_CONSTANT_CHECK(any(map(p<1, 1>, p<2, 2>), is(key<1>))); BOOST_HANA_CONSTANT_CHECK(any(map(p<1, 1>, p<2, 2>), is(key<2>))); BOOST_HANA_CONSTANT_CHECK(not_(any(map(p<1, 1>, p<2, 2>), is(key<3>)))); } // find { BOOST_HANA_CONSTANT_CHECK(equal( find(map(), is(key<1>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>), is(key<1>)), just(value<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>), is(key<2>)), nothing )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), is(key<1>)), just(value<1>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), is(key<2>)), just(value<2>) )); BOOST_HANA_CONSTANT_CHECK(equal( find(map(p<1, 1>, p<2, 2>), is(key<3>)), nothing )); } } }