123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- // Copyright Louis Dionne 2013-2017
- // 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 <boost/hana/assert.hpp>
- #include <boost/hana/at_key.hpp>
- #include <boost/hana/equal.hpp>
- #include <boost/hana/map.hpp>
- #include <boost/hana/pair.hpp>
- #include <laws/base.hpp>
- #include <support/constexpr_move_only.hpp>
- #include <support/minimal_product.hpp>
- #include <support/tracked_move_only.hpp>
- #include <string>
- #include <vector>
- namespace hana = boost::hana;
- template <int i>
- using pair = ::product_t<hana::test::ct_eq<i>, hana::test::ct_eq<-i>>;
- // Check with move-only literal types.
- constexpr bool in_constexpr_context() {
- hana::map<hana::pair<ConstexprMoveOnly<2>, ConstexprMoveOnly<20>>,
- hana::pair<ConstexprMoveOnly<3>, ConstexprMoveOnly<30>>> map{
- hana::make_pair(ConstexprMoveOnly<2>{}, ConstexprMoveOnly<20>{}),
- hana::make_pair(ConstexprMoveOnly<3>{}, ConstexprMoveOnly<30>{})
- };
- (void)map;
- return true;
- }
- static_assert(in_constexpr_context(), "");
- int main() {
- // Basic check with non trivial runtime state
- {
- std::vector<std::string> v{"Hello", "world", "!"};
- hana::map<
- hana::pair<hana::test::ct_eq<1>, std::string>,
- hana::pair<hana::test::ct_eq<2>, std::vector<std::string>>
- > map{
- hana::make_pair(hana::test::ct_eq<1>{}, std::string{"Hello world!"}),
- hana::make_pair(hana::test::ct_eq<2>{}, v)
- };
- BOOST_HANA_RUNTIME_CHECK(
- hana::at_key(map, hana::test::ct_eq<1>{}) == std::string{"Hello world!"}
- );
- BOOST_HANA_RUNTIME_CHECK(
- hana::at_key(map, hana::test::ct_eq<2>{}) == v
- );
- }
- {
- hana::map<> map{};
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map()
- ));
- }
- {
- hana::map<pair<0>> map{pair<0>{}};
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>> map{pair<0>{}, pair<1>{}};
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>> map{pair<0>{}, pair<1>{}, pair<2>{}};
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>, pair<3>> map{
- pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}
- };
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>, pair<3>, pair<4>> map{
- pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}
- };
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>, pair<3>, pair<4>, pair<5>> map{
- pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}, pair<5>{}
- };
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}, pair<4>{}, pair<5>{})
- ));
- }
- // Use parenthesis syntax instead of braces
- {
- hana::map<> map = hana::map<>();
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map()
- ));
- }
- {
- hana::map<pair<0>> map(
- pair<0>{}
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>> map(
- pair<0>{}, pair<1>{}
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>> map(
- pair<0>{}, pair<1>{}, pair<2>{}
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{})
- ));
- }
- {
- hana::map<pair<0>, pair<1>, pair<2>, pair<3>> map(
- pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{}
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- map,
- hana::make_map(pair<0>{}, pair<1>{}, pair<2>{}, pair<3>{})
- ));
- }
- // Check with move-only types
- {
- hana::map<hana::pair<TrackedMoveOnly<1>, TrackedMoveOnly<10>>,
- hana::pair<TrackedMoveOnly<2>, TrackedMoveOnly<20>>> map{
- hana::make_pair(TrackedMoveOnly<1>{}, TrackedMoveOnly<10>{}),
- hana::make_pair(TrackedMoveOnly<2>{}, TrackedMoveOnly<20>{})
- };
- }
- // The following used to fail when we did not constrain the
- // constructor properly:
- {
- hana::map<pair<1>> map{};
- hana::test::_injection<0> f{};
- auto x = f(map);
- }
- }
|