2 // Copyright 2006-2010 Daniel James.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #include "../helpers/prefix.hpp"
8 #include <boost/unordered_set.hpp>
9 #include <boost/unordered_map.hpp>
10 #include "../helpers/postfix.hpp"
13 #include "../helpers/test.hpp"
14 #include "../objects/test.hpp"
15 #include "../helpers/random_values.hpp"
16 #include "../helpers/tracker.hpp"
17 #include "../helpers/equivalent.hpp"
18 #include "../helpers/invariants.hpp"
19 #include "../helpers/input_iterator.hpp"
20 #include "../helpers/helpers.hpp"
24 namespace insert_tests {
26 test::seed_t initialize_seed(243432);
29 void unique_insert_tests1(X*, test::random_generator generator)
31 test::check_instances check_;
33 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
34 typedef test::ordered<X> ordered;
36 std::cerr << "insert(value) tests for containers with unique keys.\n";
39 test::ordered<X> tracker = test::create_ordered(x);
41 test::random_values<X> v(1000, generator);
43 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
44 it != v.end(); ++it) {
46 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
47 float b = x.max_load_factor();
49 std::pair<iterator, bool> r1 = x.insert(*it);
50 std::pair<BOOST_DEDUCED_TYPENAME ordered::iterator, bool> r2 =
53 BOOST_TEST(r1.second == r2.second);
54 BOOST_TEST(*r1.first == *r2.first);
56 tracker.compare_key(x, *it);
58 if (static_cast<double>(x.size()) <=
59 b * static_cast<double>(old_bucket_count))
60 BOOST_TEST(x.bucket_count() == old_bucket_count);
63 test::check_equivalent_keys(x);
67 void equivalent_insert_tests1(X*, test::random_generator generator)
69 std::cerr << "insert(value) tests for containers with equivalent keys.\n";
71 test::check_instances check_;
74 test::ordered<X> tracker = test::create_ordered(x);
76 test::random_values<X> v(1000, generator);
77 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
78 it != v.end(); ++it) {
79 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
80 float b = x.max_load_factor();
82 BOOST_DEDUCED_TYPENAME X::iterator r1 = x.insert(*it);
83 BOOST_DEDUCED_TYPENAME test::ordered<X>::iterator r2 =
86 BOOST_TEST(*r1 == *r2);
88 tracker.compare_key(x, *it);
90 if (static_cast<double>(x.size()) <=
91 b * static_cast<double>(old_bucket_count))
92 BOOST_TEST(x.bucket_count() == old_bucket_count);
95 test::check_equivalent_keys(x);
98 template <class X> void insert_tests2(X*, test::random_generator generator)
100 typedef BOOST_DEDUCED_TYPENAME test::ordered<X> tracker_type;
101 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
102 typedef BOOST_DEDUCED_TYPENAME X::const_iterator const_iterator;
103 typedef BOOST_DEDUCED_TYPENAME tracker_type::iterator tracker_iterator;
105 std::cerr << "insert(begin(), value) tests.\n";
108 test::check_instances check_;
111 tracker_type tracker = test::create_ordered(x);
113 test::random_values<X> v(1000, generator);
114 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
116 it != v.end(); ++it) {
117 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
119 float b = x.max_load_factor();
121 iterator r1 = x.insert(x.begin(), *it);
122 tracker_iterator r2 = tracker.insert(tracker.begin(), *it);
123 BOOST_TEST(*r1 == *r2);
124 tracker.compare_key(x, *it);
126 if (static_cast<double>(x.size()) <=
127 b * static_cast<double>(old_bucket_count))
128 BOOST_TEST(x.bucket_count() == old_bucket_count);
132 test::check_equivalent_keys(x);
135 std::cerr << "insert(end(), value) tests.\n";
138 test::check_instances check_;
141 X const& x_const = x;
142 tracker_type tracker = test::create_ordered(x);
144 test::random_values<X> v(100, generator);
145 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
147 it != v.end(); ++it) {
148 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
150 float b = x.max_load_factor();
152 const_iterator r1 = x.insert(x_const.end(), *it);
153 tracker_iterator r2 = tracker.insert(tracker.end(), *it);
154 BOOST_TEST(*r1 == *r2);
155 tracker.compare_key(x, *it);
157 if (static_cast<double>(x.size()) <=
158 b * static_cast<double>(old_bucket_count))
159 BOOST_TEST(x.bucket_count() == old_bucket_count);
163 test::check_equivalent_keys(x);
166 std::cerr << "insert(pos, value) tests.\n";
169 test::check_instances check_;
172 const_iterator pos = x.begin();
173 tracker_type tracker = test::create_ordered(x);
175 test::random_values<X> v(1000, generator);
176 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
178 it != v.end(); ++it) {
179 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
181 float b = x.max_load_factor();
183 pos = x.insert(pos, *it);
184 tracker_iterator r2 = tracker.insert(tracker.begin(), *it);
185 BOOST_TEST(*pos == *r2);
186 tracker.compare_key(x, *it);
188 if (static_cast<double>(x.size()) <=
189 b * static_cast<double>(old_bucket_count))
190 BOOST_TEST(x.bucket_count() == old_bucket_count);
194 test::check_equivalent_keys(x);
197 std::cerr << "insert single item range tests.\n";
200 test::check_instances check_;
203 tracker_type tracker = test::create_ordered(x);
205 test::random_values<X> v(1000, generator);
206 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
208 it != v.end(); ++it) {
209 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
211 float b = x.max_load_factor();
213 x.insert(it, test::next(it));
215 tracker.compare_key(x, *it);
217 if (static_cast<double>(x.size()) <=
218 b * static_cast<double>(old_bucket_count))
219 BOOST_TEST(x.bucket_count() == old_bucket_count);
223 test::check_equivalent_keys(x);
226 std::cerr << "insert range tests.\n";
229 test::check_instances check_;
233 test::random_values<X> v(1000, generator);
234 x.insert(v.begin(), v.end());
236 test::check_container(x, v);
237 test::check_equivalent_keys(x);
240 std::cerr << "insert range with rehash tests.\n";
243 test::check_instances check_;
247 test::random_values<X> v(1000, generator);
249 x.insert(*v.begin());
252 x.insert(v.begin(), v.end());
254 test::check_container(x, v);
255 test::check_equivalent_keys(x);
258 std::cerr << "insert input iterator range tests.\n";
261 test::check_instances check_;
265 test::random_values<X> v(1000, generator);
266 BOOST_DEDUCED_TYPENAME test::random_values<X>::const_iterator
269 x.insert(test::input_iterator(begin), test::input_iterator(end));
270 test::check_container(x, v);
272 test::check_equivalent_keys(x);
275 std::cerr << "insert copy iterator range tests.\n";
278 test::check_instances check_;
282 test::random_values<X> v(1000, generator);
283 x.insert(test::copy_iterator(v.begin()), test::copy_iterator(v.end()));
284 test::check_container(x, v);
286 test::check_equivalent_keys(x);
289 std::cerr << "insert copy iterator range test 2.\n";
292 test::check_instances check_;
296 test::random_values<X> v1(500, generator);
297 test::random_values<X> v2(500, generator);
299 test::copy_iterator(v1.begin()), test::copy_iterator(v1.end()));
301 test::copy_iterator(v2.begin()), test::copy_iterator(v2.end()));
303 test::check_equivalent_keys(x);
306 std::cerr << "insert various ranges.\n";
309 for (int i = 0; i < 100; ++i) {
311 test::ordered<X> tracker = test::create_ordered(x);
313 test::random_values<X> v(1000, generator);
315 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
318 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
320 float b = x.max_load_factor();
322 BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator next =
324 for (std::size_t j = test::random_value(20); j > 0; ++j) {
326 if (next == v.end()) {
332 tracker.insert(it, next);
335 tracker.compare(x); // Slow, but I can't see any other way.
337 if (static_cast<double>(x.size()) <=
338 b * static_cast<double>(old_bucket_count))
339 BOOST_TEST(x.bucket_count() == old_bucket_count);
342 test::check_equivalent_keys(x);
348 void unique_emplace_tests1(X*, test::random_generator generator)
350 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
351 typedef test::ordered<X> ordered;
353 std::cerr << "emplace(value) tests for containers with unique keys.\n";
356 test::ordered<X> tracker = test::create_ordered(x);
358 test::random_values<X> v(1000, generator);
360 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
361 it != v.end(); ++it) {
363 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
364 float b = x.max_load_factor();
366 std::pair<iterator, bool> r1 = x.emplace(*it);
367 std::pair<BOOST_DEDUCED_TYPENAME ordered::iterator, bool> r2 =
370 BOOST_TEST(r1.second == r2.second);
371 BOOST_TEST(*r1.first == *r2.first);
373 tracker.compare_key(x, *it);
375 if (static_cast<double>(x.size()) <=
376 b * static_cast<double>(old_bucket_count))
377 BOOST_TEST(x.bucket_count() == old_bucket_count);
381 test::check_equivalent_keys(x);
385 void equivalent_emplace_tests1(X*, test::random_generator generator)
387 std::cerr << "emplace(value) tests for containers with equivalent keys.\n";
390 test::ordered<X> tracker = test::create_ordered(x);
392 test::random_values<X> v(1000, generator);
393 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
394 it != v.end(); ++it) {
395 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
396 float b = x.max_load_factor();
398 BOOST_DEDUCED_TYPENAME X::iterator r1 = x.emplace(*it);
399 BOOST_DEDUCED_TYPENAME test::ordered<X>::iterator r2 =
402 BOOST_TEST(*r1 == *r2);
404 tracker.compare_key(x, *it);
406 if (static_cast<double>(x.size()) <=
407 b * static_cast<double>(old_bucket_count))
408 BOOST_TEST(x.bucket_count() == old_bucket_count);
412 test::check_equivalent_keys(x);
415 template <class X> void move_emplace_tests(X*, test::random_generator generator)
418 << "emplace(move(value)) tests for containers with unique keys.\n";
421 test::ordered<X> tracker = test::create_ordered(x);
423 test::random_values<X> v(1000, generator);
425 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
426 it != v.end(); ++it) {
428 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
429 float b = x.max_load_factor();
431 typename X::value_type value = *it;
432 x.emplace(boost::move(value));
434 tracker.compare_key(x, *it);
436 if (static_cast<double>(x.size()) <=
437 b * static_cast<double>(old_bucket_count))
438 BOOST_TEST(x.bucket_count() == old_bucket_count);
442 test::check_equivalent_keys(x);
445 template <class X> void default_emplace_tests(X*, test::random_generator)
447 #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100))
448 std::cerr << "emplace() tests.\n";
449 bool is_unique = test::has_unique_keys<X>::value;
454 BOOST_TEST(x.size() == 1);
456 BOOST_TEST(x.size() == (is_unique ? 1u : 2u));
458 BOOST_TEST(x.size() == (is_unique ? 1u : 3u));
460 typename X::value_type y;
461 BOOST_TEST(x.count(test::get_key<X>(y)) == (is_unique ? 1u : 3u));
462 BOOST_TEST(*x.equal_range(test::get_key<X>(y)).first == y);
465 BOOST_TEST(x.size() == (is_unique ? 1u : 4u));
466 BOOST_TEST(x.count(test::get_key<X>(y)) == (is_unique ? 1u : 4u));
467 BOOST_TEST(*x.equal_range(test::get_key<X>(y)).first == y);
470 BOOST_TEST(x.empty());
472 BOOST_TEST(x.size() == 1);
474 BOOST_TEST(x.size() == (is_unique ? 1u : 2u));
476 BOOST_TEST(x.count(test::get_key<X>(y)) == (is_unique ? 1u : 2u));
477 BOOST_TEST(*x.equal_range(test::get_key<X>(y)).first == y);
481 template <class X> void map_tests(X*, test::random_generator generator)
483 std::cerr << "map tests.\n";
486 test::ordered<X> tracker = test::create_ordered(x);
488 test::random_values<X> v(1000, generator);
489 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
490 it != v.end(); ++it) {
491 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count = x.bucket_count();
492 float b = x.max_load_factor();
494 x[it->first] = it->second;
495 tracker[it->first] = it->second;
497 tracker.compare_key(x, *it);
499 if (static_cast<double>(x.size()) <=
500 b * static_cast<double>(old_bucket_count))
501 BOOST_TEST(x.bucket_count() == old_bucket_count);
505 test::check_equivalent_keys(x);
508 template <class X> void map_tests2(X*, test::random_generator generator)
510 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
511 std::cerr << "insert_or_assign\n";
514 test::check_instances check_;
517 test::ordered<X> tracker = test::create_ordered(x);
519 test::random_values<X> v(1000, generator);
520 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
522 it != v.end(); ++it) {
523 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
525 float b = x.max_load_factor();
527 std::pair<iterator, bool> r =
528 x.insert_or_assign(it->first, it->second);
529 BOOST_TEST(*r.first == *it);
531 tracker[it->first] = it->second;
532 tracker.compare_key(x, *it);
534 if (static_cast<double>(x.size()) <
535 b * static_cast<double>(old_bucket_count))
536 BOOST_TEST(x.bucket_count() == old_bucket_count);
540 test::check_equivalent_keys(x);
543 std::cerr << "insert_or_assign(begin)\n";
546 test::check_instances check_;
549 test::ordered<X> tracker = test::create_ordered(x);
551 test::random_values<X> v(1000, generator);
552 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
554 it != v.end(); ++it) {
555 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
557 float b = x.max_load_factor();
559 iterator r = x.insert_or_assign(x.begin(), it->first, it->second);
560 BOOST_TEST(*r == *it);
562 tracker[it->first] = it->second;
563 tracker.compare_key(x, *it);
565 if (static_cast<double>(x.size()) <
566 b * static_cast<double>(old_bucket_count))
567 BOOST_TEST(x.bucket_count() == old_bucket_count);
571 test::check_equivalent_keys(x);
574 std::cerr << "insert_or_assign(end)\n";
577 test::check_instances check_;
580 test::ordered<X> tracker = test::create_ordered(x);
582 test::random_values<X> v(1000, generator);
583 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
585 it != v.end(); ++it) {
586 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
588 float b = x.max_load_factor();
590 iterator r = x.insert_or_assign(x.end(), it->first, it->second);
591 BOOST_TEST(*r == *it);
593 tracker[it->first] = it->second;
594 tracker.compare_key(x, *it);
596 if (static_cast<double>(x.size()) <
597 b * static_cast<double>(old_bucket_count))
598 BOOST_TEST(x.bucket_count() == old_bucket_count);
602 test::check_equivalent_keys(x);
605 std::cerr << "insert_or_assign(last)\n";
608 test::check_instances check_;
611 test::ordered<X> tracker = test::create_ordered(x);
612 iterator last = x.begin();
614 test::random_values<X> v(1000, generator);
615 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
617 it != v.end(); ++it) {
618 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
620 float b = x.max_load_factor();
622 iterator r = x.insert_or_assign(last, it->first, it->second);
623 BOOST_TEST(*r == *it);
625 tracker[it->first] = it->second;
626 tracker.compare_key(x, *it);
628 if (static_cast<double>(x.size()) <
629 b * static_cast<double>(old_bucket_count))
630 BOOST_TEST(x.bucket_count() == old_bucket_count);
636 test::check_equivalent_keys(x);
640 template <class X> void try_emplace_tests(X*, test::random_generator generator)
642 std::cerr << "try_emplace(key, value)\n";
644 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
647 test::check_instances check_;
650 test::ordered<X> tracker = test::create_ordered(x);
652 test::random_values<X> v(1000, generator);
653 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
655 it != v.end(); ++it) {
656 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
658 float b = x.max_load_factor();
660 iterator pos = x.find(it->first);
661 bool found = pos != x.end();
663 std::pair<typename X::iterator, bool> r =
664 x.try_emplace(it->first, it->second);
666 BOOST_TEST(pos == r.first);
667 BOOST_TEST(!r.second);
669 BOOST_TEST(r.second);
671 BOOST_TEST_EQ(r.first->first, it->first);
672 BOOST_TEST_EQ(r.first->second, it->second);
675 tracker.compare_key(x, *it);
677 if (static_cast<double>(x.size()) <
678 b * static_cast<double>(old_bucket_count))
679 BOOST_TEST(x.bucket_count() == old_bucket_count);
682 test::check_equivalent_keys(x);
685 std::cerr << "try_emplace(begin(), key, value)\n";
687 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
690 test::check_instances check_;
693 test::ordered<X> tracker = test::create_ordered(x);
695 test::random_values<X> v(1000, generator);
696 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
698 it != v.end(); ++it) {
699 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
701 float b = x.max_load_factor();
703 iterator pos = x.find(it->first);
704 bool found = pos != x.end();
706 typename X::iterator r =
707 x.try_emplace(r.begin(), it->first, it->second);
709 BOOST_TEST(pos == r);
711 BOOST_TEST_EQ(r->first, it->first);
712 BOOST_TEST_EQ(r->second, it->second);
715 tracker.compare_key(x, *it);
717 if (static_cast<double>(x.size()) <
718 b * static_cast<double>(old_bucket_count))
719 BOOST_TEST(x.bucket_count() == old_bucket_count);
722 test::check_equivalent_keys(x);
725 std::cerr << "try_emplace(end(), key, value)\n";
727 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
730 test::check_instances check_;
733 test::ordered<X> tracker = test::create_ordered(x);
735 test::random_values<X> v(1000, generator);
736 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
738 it != v.end(); ++it) {
739 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
741 float b = x.max_load_factor();
743 iterator pos = x.find(it->first);
744 bool found = pos != x.end();
746 typename X::iterator r =
747 x.try_emplace(r.end(), it->first, it->second);
749 BOOST_TEST(pos == r);
751 BOOST_TEST_EQ(r->first, it->first);
752 BOOST_TEST_EQ(r->second, it->second);
755 tracker.compare_key(x, *it);
757 if (static_cast<double>(x.size()) <
758 b * static_cast<double>(old_bucket_count))
759 BOOST_TEST(x.bucket_count() == old_bucket_count);
762 test::check_equivalent_keys(x);
765 std::cerr << "try_emplace(pos, key, value)\n";
767 typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
770 test::check_instances check_;
773 test::ordered<X> tracker = test::create_ordered(x);
775 test::random_values<X> v(1000, generator);
776 for (BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it =
778 it != v.end(); ++it) {
779 BOOST_DEDUCED_TYPENAME X::size_type old_bucket_count =
781 float b = x.max_load_factor();
783 iterator pos = x.find(it->first);
784 bool found = pos != x.end();
786 typename X::iterator r = x.try_emplace(pos, it->first, it->second);
788 BOOST_TEST(pos == r);
790 BOOST_TEST_EQ(r->first, it->first);
791 BOOST_TEST_EQ(r->second, it->second);
794 tracker.compare_key(x, *it);
796 if (static_cast<double>(x.size()) <
797 b * static_cast<double>(old_bucket_count))
798 BOOST_TEST(x.bucket_count() == old_bucket_count);
801 test::check_equivalent_keys(x);
805 // Some tests for when the range's value type doesn't match the container's
809 void map_insert_range_test1(X*, test::random_generator generator)
811 std::cerr << "map_insert_range_test1\n";
813 test::check_instances check_;
815 typedef test::list<std::pair<BOOST_DEDUCED_TYPENAME X::key_type,
816 BOOST_DEDUCED_TYPENAME X::mapped_type> >
818 test::random_values<X> v(1000, generator);
819 list l(v.begin(), v.end());
822 x.insert(l.begin(), l.end());
824 test::check_equivalent_keys(x);
828 void map_insert_range_test2(X*, test::random_generator generator)
830 std::cerr << "map_insert_range_test2\n";
832 test::check_instances check_;
834 typedef test::list<std::pair<BOOST_DEDUCED_TYPENAME X::key_type const,
835 test::implicitly_convertible> >
837 test::random_values<boost::unordered_map<BOOST_DEDUCED_TYPENAME X::key_type,
838 test::implicitly_convertible> >
840 list l(v.begin(), v.end());
843 x.insert(l.begin(), l.end());
845 test::check_equivalent_keys(x);
848 boost::unordered_set<test::movable, test::hash, test::equal_to,
849 std::allocator<test::movable> >* test_set_std_alloc;
850 boost::unordered_multimap<test::object, test::object, test::hash,
851 test::equal_to, std::allocator<test::object> >* test_multimap_std_alloc;
853 boost::unordered_set<test::object, test::hash, test::equal_to,
854 test::allocator1<test::object> >* test_set;
855 boost::unordered_multiset<test::movable, test::hash, test::equal_to,
856 test::allocator2<test::movable> >* test_multiset;
857 boost::unordered_map<test::movable, test::movable, test::hash, test::equal_to,
858 test::allocator2<test::movable> >* test_map;
859 boost::unordered_multimap<test::object, test::object, test::hash,
860 test::equal_to, test::allocator1<test::object> >* test_multimap;
862 using test::default_generator;
863 using test::generate_collisions;
864 using test::limited_range;
866 UNORDERED_TEST(unique_insert_tests1,
867 ((test_set_std_alloc)(test_set)(test_map))(
868 (default_generator)(generate_collisions)(limited_range)))
870 UNORDERED_TEST(equivalent_insert_tests1,
871 ((test_multimap_std_alloc)(test_multiset)(test_multimap))(
872 (default_generator)(generate_collisions)(limited_range)))
875 insert_tests2, ((test_multimap_std_alloc)(test_set)(test_multiset)(
876 test_map)(test_multimap))(
877 (default_generator)(generate_collisions)(limited_range)))
879 UNORDERED_TEST(unique_emplace_tests1,
880 ((test_set_std_alloc)(test_set)(test_map))(
881 (default_generator)(generate_collisions)(limited_range)))
883 UNORDERED_TEST(equivalent_emplace_tests1,
884 ((test_multimap_std_alloc)(test_multiset)(test_multimap))(
885 (default_generator)(generate_collisions)(limited_range)))
887 UNORDERED_TEST(move_emplace_tests,
888 ((test_set_std_alloc)(test_multimap_std_alloc)(test_set)(test_map)(
889 test_multiset)(test_multimap))(
890 (default_generator)(generate_collisions)(limited_range)))
892 UNORDERED_TEST(default_emplace_tests,
893 ((test_set_std_alloc)(test_multimap_std_alloc)(test_set)(test_map)(
894 test_multiset)(test_multimap))(
895 (default_generator)(generate_collisions)(limited_range)))
897 UNORDERED_TEST(map_tests,
898 ((test_map))((default_generator)(generate_collisions)(limited_range)))
901 map_tests2, ((test_map))((default_generator)(generate_collisions)))
903 UNORDERED_TEST(map_insert_range_test1,
904 ((test_multimap_std_alloc)(test_map)(test_multimap))(
905 (default_generator)(generate_collisions)(limited_range)))
907 UNORDERED_TEST(map_insert_range_test2,
908 ((test_multimap_std_alloc)(test_map)(test_multimap))(
909 (default_generator)(generate_collisions)(limited_range)))
911 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
913 struct initialize_from_two_ints
917 friend std::size_t hash_value(initialize_from_two_ints const& x)
919 return static_cast<std::size_t>(x.a + x.b);
922 bool operator==(initialize_from_two_ints const& x) const
924 return a == x.a && b == x.b;
928 UNORDERED_AUTO_TEST(insert_initializer_list_set)
930 boost::unordered_set<int> set;
931 set.insert({1, 2, 3, 1});
932 BOOST_TEST_EQ(set.size(), 3u);
933 BOOST_TEST(set.find(1) != set.end());
934 BOOST_TEST(set.find(4) == set.end());
936 boost::unordered_set<initialize_from_two_ints> set2;
938 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5))
939 set2.insert({{1, 2}});
943 BOOST_TEST(set2.size() == 1);
944 BOOST_TEST(set2.find({1, 2}) != set2.end());
945 BOOST_TEST(set2.find({2, 1}) == set2.end());
947 set2.insert({{3, 4}, {5, 6}, {7, 8}});
948 BOOST_TEST(set2.size() == 4);
949 BOOST_TEST(set2.find({1, 2}) != set2.end());
950 BOOST_TEST(set2.find({3, 4}) != set2.end());
951 BOOST_TEST(set2.find({5, 6}) != set2.end());
952 BOOST_TEST(set2.find({7, 8}) != set2.end());
953 BOOST_TEST(set2.find({8, 7}) == set2.end());
955 set2.insert({{2, 1}, {3, 4}});
956 BOOST_TEST(set2.size() == 5);
957 BOOST_TEST(set2.find({1, 2}) != set2.end());
958 BOOST_TEST(set2.find({2, 1}) != set2.end());
959 BOOST_TEST(set2.find({3, 4}) != set2.end());
960 BOOST_TEST(set2.find({5, 6}) != set2.end());
961 BOOST_TEST(set2.find({7, 8}) != set2.end());
962 BOOST_TEST(set2.find({8, 7}) == set2.end());
965 #if !BOOST_WORKAROUND(BOOST_MSVC, == 1800)
967 UNORDERED_AUTO_TEST(insert_initializer_list_multiset)
969 boost::unordered_multiset<std::string> multiset;
970 // multiset.insert({});
971 BOOST_TEST(multiset.empty());
972 multiset.insert({"a"});
973 BOOST_TEST_EQ(multiset.size(), 1u);
974 BOOST_TEST(multiset.find("a") != multiset.end());
975 BOOST_TEST(multiset.find("b") == multiset.end());
976 multiset.insert({"a", "b"});
977 BOOST_TEST(multiset.size() == 3);
978 BOOST_TEST_EQ(multiset.count("a"), 2u);
979 BOOST_TEST_EQ(multiset.count("b"), 1u);
980 BOOST_TEST_EQ(multiset.count("c"), 0u);
985 UNORDERED_AUTO_TEST(insert_initializer_list_map)
987 boost::unordered_map<std::string, std::string> map;
989 BOOST_TEST(map.empty());
990 map.insert({{"a", "b"}, {"a", "b"}, {"d", ""}});
991 BOOST_TEST_EQ(map.size(), 2u);
994 UNORDERED_AUTO_TEST(insert_initializer_list_multimap)
996 boost::unordered_multimap<std::string, std::string> multimap;
997 // multimap.insert({});
998 BOOST_TEST(multimap.empty());
999 multimap.insert({{"a", "b"}, {"a", "b"}, {"d", ""}});
1000 BOOST_TEST_EQ(multimap.size(), 3u);
1001 BOOST_TEST_EQ(multimap.count("a"), 2u);
1006 struct overloaded_constructor
1008 overloaded_constructor(int x1_ = 1, int x2_ = 2, int x3_ = 3, int x4_ = 4)
1009 : x1(x1_), x2(x2_), x3(x3_), x4(x4_)
1015 bool operator==(overloaded_constructor const& rhs) const
1017 return x1 == rhs.x1 && x2 == rhs.x2 && x3 == rhs.x3 && x4 == rhs.x4;
1020 friend std::size_t hash_value(overloaded_constructor const& x)
1022 std::size_t hash = 0;
1023 boost::hash_combine(hash, x.x1);
1024 boost::hash_combine(hash, x.x2);
1025 boost::hash_combine(hash, x.x3);
1026 boost::hash_combine(hash, x.x4);
1031 UNORDERED_AUTO_TEST(map_emplace_test)
1033 boost::unordered_map<int, overloaded_constructor> x;
1035 #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100))
1038 x.find(0) != x.end() && x.find(0)->second == overloaded_constructor());
1043 x.find(2) != x.end() && x.find(2)->second == overloaded_constructor(3));
1047 x.find(5) != x.end() && x.find(5)->second == overloaded_constructor());
1050 UNORDERED_AUTO_TEST(set_emplace_test)
1052 boost::unordered_set<overloaded_constructor> x;
1053 overloaded_constructor check;
1055 #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100))
1057 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1062 check = overloaded_constructor(1);
1063 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1067 check = overloaded_constructor(2, 3);
1068 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1072 check = overloaded_constructor(4, 5, 6);
1073 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1076 x.emplace(7, 8, 9, 10);
1077 check = overloaded_constructor(7, 8, 9, 10);
1078 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1081 struct derived_from_piecewise_construct_t
1082 : boost::unordered::piecewise_construct_t
1086 derived_from_piecewise_construct_t piecewise_rvalue()
1088 return derived_from_piecewise_construct_t();
1091 struct convertible_to_piecewise
1093 operator boost::unordered::piecewise_construct_t() const
1095 return boost::unordered::piecewise_construct;
1099 UNORDERED_AUTO_TEST(map_emplace_test2)
1101 boost::unordered_map<overloaded_constructor, overloaded_constructor> x;
1103 x.emplace(boost::unordered::piecewise_construct, boost::make_tuple(),
1104 boost::make_tuple());
1106 x.find(overloaded_constructor()) != x.end() &&
1107 x.find(overloaded_constructor())->second == overloaded_constructor());
1110 convertible_to_piecewise(), boost::make_tuple(1), boost::make_tuple());
1112 x.find(overloaded_constructor(1)) != x.end() &&
1113 x.find(overloaded_constructor(1))->second == overloaded_constructor());
1115 x.emplace(piecewise_rvalue(), boost::make_tuple(2, 3),
1116 boost::make_tuple(4, 5, 6));
1117 BOOST_TEST(x.find(overloaded_constructor(2, 3)) != x.end() &&
1118 x.find(overloaded_constructor(2, 3))->second ==
1119 overloaded_constructor(4, 5, 6));
1121 derived_from_piecewise_construct_t d;
1122 x.emplace(d, boost::make_tuple(9, 3, 1), boost::make_tuple(10));
1123 BOOST_TEST(x.find(overloaded_constructor(9, 3, 1)) != x.end() &&
1124 x.find(overloaded_constructor(9, 3, 1))->second ==
1125 overloaded_constructor(10));
1129 x.try_emplace(overloaded_constructor());
1131 x.find(overloaded_constructor()) != x.end() &&
1132 x.find(overloaded_constructor())->second == overloaded_constructor());
1136 x.find(overloaded_constructor(1)) != x.end() &&
1137 x.find(overloaded_constructor(1))->second == overloaded_constructor());
1139 x.try_emplace(overloaded_constructor(2, 3), 4, 5, 6);
1140 BOOST_TEST(x.find(overloaded_constructor(2, 3)) != x.end() &&
1141 x.find(overloaded_constructor(2, 3))->second ==
1142 overloaded_constructor(4, 5, 6));
1145 UNORDERED_AUTO_TEST(set_emplace_test2)
1147 boost::unordered_set<
1148 std::pair<overloaded_constructor, overloaded_constructor> >
1150 std::pair<overloaded_constructor, overloaded_constructor> check;
1152 x.emplace(boost::unordered::piecewise_construct, boost::make_tuple(),
1153 boost::make_tuple());
1154 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);
1157 x.emplace(boost::unordered::piecewise_construct, boost::make_tuple(1),
1158 boost::make_tuple(2, 3));
1160 std::make_pair(overloaded_constructor(1), overloaded_constructor(2, 3));
1162 BOOST_TEST(x.find(check) != x.end() && *x.find(check) == check);