// Copyright 2006-2009 Daniel James. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // This test creates the containers with members that meet their minimum // requirements. Makes sure everything compiles and is defined correctly. // clang-format off #include "../helpers/prefix.hpp" #include #include "../helpers/postfix.hpp" // clang-format on #include "../helpers/test.hpp" #include "../objects/minimal.hpp" #include "./compile_tests.hpp" // Explicit instantiation to catch compile-time errors #define INSTANTIATE(type) \ template class boost::unordered::detail::instantiate_##type INSTANTIATE(map), std::equal_to, test::minimal::allocator >; INSTANTIATE(multimap), std::equal_to, test::minimal::allocator >; INSTANTIATE( map), test::minimal::equal_to, test::minimal::allocator >; INSTANTIATE(multimap), test::minimal::equal_to, test::minimal::allocator >; UNORDERED_AUTO_TEST(test0) { test::minimal::constructor_param x; typedef std::pair value_type; value_type value(x, x); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_map.\n"; boost::unordered_map int_map; boost::unordered_map, std::equal_to, test::minimal::cxx11_allocator > > int_map2; boost::unordered_map, test::minimal::equal_to, test::minimal::allocator > map; container_test(int_map, std::pair(0, 0)); container_test(int_map2, std::pair(0, 0)); container_test(map, value); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_multimap.\n"; boost::unordered_multimap int_multimap; boost::unordered_multimap, std::equal_to, test::minimal::cxx11_allocator > > int_multimap2; boost::unordered_multimap, test::minimal::equal_to, test::minimal::allocator > multimap; container_test(int_multimap, std::pair(0, 0)); container_test(int_multimap2, std::pair(0, 0)); container_test(multimap, value); } UNORDERED_AUTO_TEST(equality_tests) { typedef std::pair value_type; boost::unordered_map int_map; boost::unordered_map, std::equal_to, test::minimal::cxx11_allocator > > int_map2; boost::unordered_map, test::minimal::equal_to< test::minimal::copy_constructible_equality_comparable>, test::minimal::allocator > map; equality_test(int_map); equality_test(int_map2); equality_test(map); boost::unordered_multimap int_multimap; boost::unordered_multimap, std::equal_to, test::minimal::cxx11_allocator > > int_multimap2; boost::unordered_multimap< test::minimal::copy_constructible_equality_comparable, test::minimal::copy_constructible_equality_comparable, test::minimal::hash, test::minimal::equal_to< test::minimal::copy_constructible_equality_comparable>, test::minimal::allocator > multimap; equality_test(int_multimap); equality_test(int_multimap2); equality_test(multimap); } UNORDERED_AUTO_TEST(test1) { boost::hash hash; std::equal_to equal_to; int value = 0; std::pair map_value(0, 0); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_map.\n"; boost::unordered_map map; boost::unordered_map, std::equal_to, test::minimal::cxx11_allocator > > map2; unordered_unique_test(map, map_value); unordered_map_test(map, value, value); unordered_copyable_test(map, value, map_value, hash, equal_to); unordered_map_functions(map, value, value); unordered_unique_test(map2, map_value); unordered_map_test(map2, value, value); unordered_copyable_test(map2, value, map_value, hash, equal_to); unordered_map_functions(map2, value, value); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_multimap.\n"; boost::unordered_multimap multimap; boost::unordered_multimap, std::equal_to, test::minimal::cxx11_allocator > > multimap2; unordered_equivalent_test(multimap, map_value); unordered_map_test(multimap, value, value); unordered_copyable_test(multimap, value, map_value, hash, equal_to); unordered_equivalent_test(multimap2, map_value); unordered_map_test(multimap2, value, value); unordered_copyable_test(multimap2, value, map_value, hash, equal_to); } UNORDERED_AUTO_TEST(test2) { test::minimal::constructor_param x; test::minimal::assignable assignable(x); test::minimal::copy_constructible copy_constructible(x); test::minimal::hash hash(x); test::minimal::equal_to equal_to(x); typedef std::pair map_value_type; map_value_type map_value(assignable, assignable); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_map.\n"; boost::unordered_map, test::minimal::equal_to, test::minimal::allocator > map; unordered_unique_test(map, map_value); unordered_map_test(map, assignable, assignable); unordered_copyable_test(map, assignable, map_value, hash, equal_to); unordered_map_member_test(map, map_value); boost::unordered_map, test::minimal::equal_to, test::minimal::allocator > map2; test::minimal::default_assignable default_assignable; unordered_map_functions(map2, assignable, default_assignable); BOOST_LIGHTWEIGHT_TEST_OSTREAM << "Test unordered_multimap.\n"; boost::unordered_multimap, test::minimal::equal_to, test::minimal::allocator > multimap; unordered_equivalent_test(multimap, map_value); unordered_map_test(multimap, assignable, assignable); unordered_copyable_test(multimap, assignable, map_value, hash, equal_to); unordered_map_member_test(multimap, map_value); } // Test for ambiguity when using key convertible from iterator // See LWG2059 struct lwg2059_key { int value; template lwg2059_key(T v) : value(v) {} }; std::size_t hash_value(lwg2059_key x) { return static_cast(x.value); } bool operator==(lwg2059_key x, lwg2059_key y) { return x.value == y.value; } UNORDERED_AUTO_TEST(lwg2059) { { boost::unordered_map x; x.emplace(lwg2059_key(10), 5); x.erase(x.begin()); } { boost::unordered_multimap x; x.emplace(lwg2059_key(10), 5); x.erase(x.begin()); } } RUN_TESTS()