// Copyright 2006-2010 Daniel James. // Copyright (C) 2022-2023 Christian Mazakas // 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) #if !defined(PIECEWISE_TEST_NAME) #include "../helpers/unordered.hpp" #include "../helpers/test.hpp" #include "../objects/test.hpp" #include "../helpers/random_values.hpp" #include "../helpers/tracker.hpp" #include "../helpers/equivalent.hpp" #include "../helpers/invariants.hpp" #include "../helpers/input_iterator.hpp" #include "../helpers/helpers.hpp" #include #include namespace insert_tests { test::seed_t initialize_seed(243432); template void unique_insert_tests1(X*, test::random_generator generator) { test::check_instances check_; typedef typename X::iterator iterator; typedef test::ordered ordered; UNORDERED_SUB_TEST("insert(value) tests for containers with unique keys") { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); std::pair r1 = x.insert(*it); std::pair r2 = tracker.insert(*it); BOOST_TEST(r1.second == r2.second); BOOST_TEST(*r1.first == *r2.first); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert(rvalue) tests for containers with unique keys") { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::value_type value = *it; std::pair r1 = x.insert(std::move(value)); std::pair r2 = tracker.insert(*it); BOOST_TEST(r1.second == r2.second); BOOST_TEST(*r1.first == *r2.first); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } } template void equivalent_insert_tests1(X*, test::random_generator generator) { test::check_instances check_; UNORDERED_SUB_TEST( "insert(value) tests for containers with equivalent keys") { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::iterator r1 = x.insert(*it); typename test::ordered::iterator r2 = tracker.insert(*it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } UNORDERED_SUB_TEST( "insert(rvalue) tests for containers with equivalent keys") { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::value_type value = *it; typename X::iterator r1 = x.insert(std::move(value)); typename test::ordered::iterator r2 = tracker.insert(*it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } } template void insert_tests2(X*, test::random_generator generator) { typedef typename test::ordered tracker_type; typedef typename X::iterator iterator; typedef typename X::const_iterator const_iterator; typedef typename tracker_type::iterator tracker_iterator; UNORDERED_SUB_TEST("insert(begin(), value) tests") { test::check_instances check_; X x; tracker_type tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator r1 = x.insert(x.begin(), *it); tracker_iterator r2 = tracker.insert(tracker.begin(), *it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert(end(), value) tests") { test::check_instances check_; X x; X const& x_const = x; tracker_type tracker = test::create_ordered(x); test::random_values v(100, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); const_iterator r1 = x.insert(x_const.end(), *it); tracker_iterator r2 = tracker.insert(tracker.end(), *it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert(pos, value) tests") { test::check_instances check_; X x; const_iterator pos = x.begin(); tracker_type tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); pos = x.insert(pos, *it); tracker_iterator r2 = tracker.insert(tracker.begin(), *it); BOOST_TEST(*pos == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert(pos, rvalue) tests") { test::check_instances check_; X x; const_iterator pos = x.begin(); tracker_type tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::value_type value = *it; pos = x.insert(pos, std::move(value)); tracker_iterator r2 = tracker.insert(tracker.begin(), *it); BOOST_TEST(*pos == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert single item range tests") { test::check_instances check_; X x; tracker_type tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); x.insert(it, test::next(it)); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert range tests") { test::check_instances check_; X x; test::random_values v(1000, generator); x.insert(v.begin(), v.end()); test::check_container(x, v); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert range with rehash tests") { test::check_instances check_; X x; test::random_values v(1000, generator); x.insert(*v.begin()); x.clear(); x.insert(v.begin(), v.end()); test::check_container(x, v); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert input iterator range tests") { test::check_instances check_; X x; test::random_values v(1000, generator); typename test::random_values::const_iterator begin = v.begin(), end = v.end(); x.insert(test::input_iterator(begin), test::input_iterator(end)); test::check_container(x, v); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert copy iterator range tests") { test::check_instances check_; X x; test::random_values v(1000, generator); x.insert(test::copy_iterator(v.begin()), test::copy_iterator(v.end())); test::check_container(x, v); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert copy iterator range test 2") { test::check_instances check_; X x; test::random_values v1(500, generator); test::random_values v2(500, generator); x.insert(test::copy_iterator(v1.begin()), test::copy_iterator(v1.end())); x.insert(test::copy_iterator(v2.begin()), test::copy_iterator(v2.end())); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert various ranges") { for (int i = 0; i < 100; ++i) { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end();) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename test::random_values::iterator next = it; for (std::size_t j = test::random_value(20); j > 0; ++j) { ++next; if (next == v.end()) { break; } } x.insert(it, next); tracker.insert(it, next); it = next; tracker.compare(x); // Slow, but I can't see any other way. if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } } } template void unique_emplace_tests1(X*, test::random_generator generator) { typedef typename X::iterator iterator; typedef test::ordered ordered; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); std::pair r1 = x.emplace(*it); std::pair r2 = tracker.insert(*it); BOOST_TEST(r1.second == r2.second); BOOST_TEST(*r1.first == *r2.first); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } template void equivalent_emplace_tests1(X*, test::random_generator generator) { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::iterator r1 = x.emplace(*it); typename test::ordered::iterator r2 = tracker.insert(*it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } template void move_emplace_tests(X*, test::random_generator generator) { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::value_type value = *it; x.emplace(std::move(value)); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } template void default_emplace_tests(X*, test::random_generator) { bool is_unique = test::has_unique_keys::value; X x; x.emplace(); BOOST_TEST(x.size() == 1); x.emplace(); BOOST_TEST(x.size() == (is_unique ? 1u : 2u)); x.emplace(); BOOST_TEST(x.size() == (is_unique ? 1u : 3u)); typename X::value_type y; BOOST_TEST(x.count(test::get_key(y)) == (is_unique ? 1u : 3u)); BOOST_TEST(*x.equal_range(test::get_key(y)).first == y); x.emplace(y); BOOST_TEST(x.size() == (is_unique ? 1u : 4u)); BOOST_TEST(x.count(test::get_key(y)) == (is_unique ? 1u : 4u)); BOOST_TEST(*x.equal_range(test::get_key(y)).first == y); x.clear(); BOOST_TEST(x.empty()); x.emplace(y); BOOST_TEST(x.size() == 1); x.emplace(y); BOOST_TEST(x.size() == (is_unique ? 1u : 2u)); BOOST_TEST(x.count(test::get_key(y)) == (is_unique ? 1u : 2u)); BOOST_TEST(*x.equal_range(test::get_key(y)).first == y); } template void map_tests(X*, test::random_generator generator) { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); x[it->first] = it->second; tracker[it->first] = it->second; tracker.compare_key(x, *it); if (static_cast(x.size()) <= b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } template void map_tests2(X*, test::random_generator generator) { typedef typename X::iterator iterator; UNORDERED_SUB_TEST("insert_or_assign") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); std::pair r = x.insert_or_assign(it->first, it->second); BOOST_TEST(*r.first == *it); tracker[it->first] = it->second; tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert_or_assign(begin)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator r = x.insert_or_assign(x.begin(), it->first, it->second); BOOST_TEST(*r == *it); tracker[it->first] = it->second; tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert_or_assign(end)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator r = x.insert_or_assign(x.end(), it->first, it->second); BOOST_TEST(*r == *it); tracker[it->first] = it->second; tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } tracker.compare(x); test::check_equivalent_keys(x); } UNORDERED_SUB_TEST("insert_or_assign(last)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); iterator last = x.begin(); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator r = x.insert_or_assign(last, it->first, it->second); BOOST_TEST(*r == *it); tracker[it->first] = it->second; tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); last = r; } tracker.compare(x); test::check_equivalent_keys(x); } } template void set_tests(X*, test::random_generator) { // prove that our insert(iterator, iterator) implementation honors // Cpp17EmplaceConstructible // X x; std::vector v; v.reserve(1000); for (unsigned i = 0; i < 1000; ++i) { v.push_back(static_cast(i)); } x.insert(v.begin(), v.end()); BOOST_TEST_EQ(x.size(), 1000u); } struct pointer_constructible { int x; pointer_constructible(int x_) : x(x_) {} pointer_constructible(pointer_constructible const& p) : x(p.x) {} pointer_constructible(pointer_constructible* const&) : x(-1) {} pointer_constructible(pointer_constructible*&&) : x(-1) {} }; struct pointer_constructible_hash { typedef void is_transparent; std::size_t operator()(pointer_constructible const& p) const { return boost::hash()(p.x); } }; struct pointer_constructible_equal_to { typedef void is_transparent; bool operator()( pointer_constructible const& lhs, pointer_constructible const& rhs) const { return lhs.x == rhs.x; } }; template static void set_tests2(X*) { X set, set2; pointer_constructible pc(1337); pointer_constructible* const addr_pc = &pc; set.insert(pc); // 1337 set.insert(&pc); // -1 set.insert(addr_pc); // -1 BOOST_TEST_EQ(set.size(), 2u); BOOST_TEST(set.find(pc) != set.end()); BOOST_TEST(set.find(-1) != set.end()); BOOST_TEST(set.find(-2) == set.end()); set2 = set; BOOST_TEST_EQ(set2.size(), 2u); BOOST_TEST(set2.find(pc) != set2.end()); BOOST_TEST(set2.find(-1) != set2.end()); BOOST_TEST(set2.find(-2) == set2.end()); set.rehash(set.bucket_count() + 1); BOOST_TEST_EQ(set.size(), 2u); BOOST_TEST(set.find(pc) != set.end()); BOOST_TEST(set.find(-1) != set.end()); BOOST_TEST(set.find(-2) == set.end()); } template void try_emplace_tests(X*, test::random_generator generator) { typedef typename X::iterator iterator; UNORDERED_SUB_TEST("try_emplace(key, value)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator pos = x.find(it->first); bool found = pos != x.end(); std::pair r = x.try_emplace(it->first, it->second); if (found) { BOOST_TEST(pos == r.first); BOOST_TEST(!r.second); } else { BOOST_TEST(r.second); } BOOST_TEST_EQ(r.first->first, it->first); BOOST_TEST_EQ(r.first->second, it->second); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } typedef typename X::iterator iterator; UNORDERED_SUB_TEST("try_emplace(begin(), key, value)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator pos = x.find(it->first); bool found = pos != x.end(); typename X::iterator r = x.try_emplace(r.begin(), it->first, it->second); if (found) { BOOST_TEST(pos == r); } BOOST_TEST_EQ(r->first, it->first); BOOST_TEST_EQ(r->second, it->second); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } typedef typename X::iterator iterator; UNORDERED_SUB_TEST("try_emplace(end(), key, value)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator pos = x.find(it->first); bool found = pos != x.end(); typename X::iterator r = x.try_emplace(r.end(), it->first, it->second); if (found) { BOOST_TEST(pos == r); } BOOST_TEST_EQ(r->first, it->first); BOOST_TEST_EQ(r->second, it->second); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } typedef typename X::iterator iterator; UNORDERED_SUB_TEST("try_emplace(pos, key, value)") { test::check_instances check_; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000, generator); for (typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator pos = x.find(it->first); bool found = pos != x.end(); typename X::iterator r = x.try_emplace(pos, it->first, it->second); if (found) { BOOST_TEST(pos == r); } BOOST_TEST_EQ(r->first, it->first); BOOST_TEST_EQ(r->second, it->second); tracker.insert(*it); tracker.compare_key(x, *it); if (static_cast(x.size()) < b * static_cast(old_bucket_count)) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } } // Some tests for when the range's value type doesn't match the container's // value type. template void map_insert_range_test1(X*, test::random_generator generator) { test::check_instances check_; typedef test::list< std::pair > list; test::random_values v(1000, generator); list l(v.begin(), v.end()); X x; x.insert(l.begin(), l.end()); test::check_equivalent_keys(x); } template void map_insert_range_test2(X*, test::random_generator generator) { test::check_instances check_; typedef test::list< std::pair > list; test::random_values< boost::unordered_map > v(1000, generator); list l(v.begin(), v.end()); X x; x.insert(l.begin(), l.end()); test::check_equivalent_keys(x); } using test::default_generator; using test::generate_collisions; using test::limited_range; #ifdef BOOST_UNORDERED_FOA_TESTS boost::unordered_flat_set >* test_set_std_alloc; boost::unordered_node_set >* test_node_set_std_alloc; boost::unordered_flat_set >* test_set; boost::unordered_node_set >* test_node_set; boost::unordered_flat_map >* test_map; boost::unordered_node_map >* test_node_map; boost::unordered_flat_set >* test_pc_set; boost::unordered_node_set >* test_pc_node_set; UNORDERED_TEST(unique_insert_tests1, ((test_set_std_alloc)(test_node_set_std_alloc) (test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( insert_tests2, ((test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(unique_emplace_tests1, ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(move_emplace_tests, ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(default_emplace_tests, ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_tests, ((test_map)(test_node_map)) ((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( map_tests2, ((test_map)(test_node_map))((default_generator)(generate_collisions))) UNORDERED_TEST(map_insert_range_test1, ((test_map)(test_node_map))((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_insert_range_test2, ((test_map)(test_node_map))((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( set_tests, ((test_set_std_alloc)(test_set)(test_node_set))((default_generator))) UNORDERED_TEST(set_tests2, ((test_pc_set)(test_pc_node_set))) #else boost::unordered_set >* test_set_std_alloc; boost::unordered_multimap >* test_multimap_std_alloc; boost::unordered_set >* test_set; boost::unordered_multiset >* test_multiset; boost::unordered_map >* test_map; boost::unordered_multimap >* test_multimap; boost::unordered_set >* test_pc_set; UNORDERED_TEST(unique_insert_tests1, ((test_set_std_alloc)(test_set)(test_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(equivalent_insert_tests1, ((test_multimap_std_alloc)(test_multiset)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(insert_tests2, ((test_multimap_std_alloc)(test_set)(test_multiset)(test_map)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(unique_emplace_tests1, ((test_set_std_alloc)(test_set)(test_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(equivalent_emplace_tests1, ((test_multimap_std_alloc)(test_multiset)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(move_emplace_tests, ((test_set_std_alloc)(test_multimap_std_alloc)(test_set)(test_map)(test_multiset)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(default_emplace_tests, ((test_set_std_alloc)(test_multimap_std_alloc)(test_set)(test_map)(test_multiset)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_tests, ((test_map))((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( map_tests2, ((test_map))((default_generator)(generate_collisions))) UNORDERED_TEST(map_insert_range_test1, ((test_multimap_std_alloc)(test_map)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_insert_range_test2, ((test_multimap_std_alloc)(test_map)(test_multimap))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( set_tests, ((test_set_std_alloc)(test_set)(test_multiset))((default_generator))) UNORDERED_TEST(set_tests2, ((test_pc_set))) #endif struct initialize_from_two_ints { int a, b; friend std::size_t hash_value(initialize_from_two_ints const& x) { return static_cast(x.a + x.b); } bool operator==(initialize_from_two_ints const& x) const { return a == x.a && b == x.b; } }; template