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)
6 #if !defined(PIECEWISE_TEST_NAME)
9 #include "../helpers/prefix.hpp"
10 #include <boost/unordered_set.hpp>
11 #include <boost/unordered_map.hpp>
12 #include "../helpers/postfix.hpp"
15 #include "../helpers/test.hpp"
16 #include "../objects/test.hpp"
17 #include "../helpers/random_values.hpp"
18 #include "../helpers/tracker.hpp"
19 #include "../helpers/equivalent.hpp"
20 #include "../helpers/invariants.hpp"
21 #include "../helpers/input_iterator.hpp"
22 #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 UNORDERED_SUB_TEST("insert(value) tests for containers with unique keys")
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
=
45 it
!= v
.end(); ++it
) {
47 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
48 float b
= x
.max_load_factor();
50 std::pair
<iterator
, bool> r1
= x
.insert(*it
);
51 std::pair
<BOOST_DEDUCED_TYPENAME
ordered::iterator
, bool> r2
=
54 BOOST_TEST(r1
.second
== r2
.second
);
55 BOOST_TEST(*r1
.first
== *r2
.first
);
57 tracker
.compare_key(x
, *it
);
59 if (static_cast<double>(x
.size()) <=
60 b
* static_cast<double>(old_bucket_count
))
61 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
64 test::check_equivalent_keys(x
);
67 UNORDERED_SUB_TEST("insert(rvalue) tests for containers with unique keys")
70 test::ordered
<X
> tracker
= test::create_ordered(x
);
72 test::random_values
<X
> v(1000, generator
);
74 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
76 it
!= v
.end(); ++it
) {
78 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
79 float b
= x
.max_load_factor();
81 typename
X::value_type value
= *it
;
82 std::pair
<iterator
, bool> r1
= x
.insert(boost::move(value
));
83 std::pair
<BOOST_DEDUCED_TYPENAME
ordered::iterator
, bool> r2
=
86 BOOST_TEST(r1
.second
== r2
.second
);
87 BOOST_TEST(*r1
.first
== *r2
.first
);
89 tracker
.compare_key(x
, *it
);
91 if (static_cast<double>(x
.size()) <=
92 b
* static_cast<double>(old_bucket_count
))
93 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
96 test::check_equivalent_keys(x
);
101 void equivalent_insert_tests1(X
*, test::random_generator generator
)
103 test::check_instances check_
;
106 "insert(value) tests for containers with equivalent keys")
109 test::ordered
<X
> tracker
= test::create_ordered(x
);
111 test::random_values
<X
> v(1000, generator
);
112 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
114 it
!= v
.end(); ++it
) {
115 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
116 float b
= x
.max_load_factor();
118 BOOST_DEDUCED_TYPENAME
X::iterator r1
= x
.insert(*it
);
119 BOOST_DEDUCED_TYPENAME
test::ordered
<X
>::iterator r2
=
122 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
);
131 test::check_equivalent_keys(x
);
135 "insert(rvalue) tests for containers with equivalent keys")
138 test::ordered
<X
> tracker
= test::create_ordered(x
);
140 test::random_values
<X
> v(1000, generator
);
141 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
143 it
!= v
.end(); ++it
) {
144 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
145 float b
= x
.max_load_factor();
147 typename
X::value_type value
= *it
;
148 BOOST_DEDUCED_TYPENAME
X::iterator r1
= x
.insert(boost::move(value
));
149 BOOST_DEDUCED_TYPENAME
test::ordered
<X
>::iterator r2
=
152 BOOST_TEST(*r1
== *r2
);
154 tracker
.compare_key(x
, *it
);
156 if (static_cast<double>(x
.size()) <=
157 b
* static_cast<double>(old_bucket_count
))
158 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
161 test::check_equivalent_keys(x
);
165 template <class X
> void insert_tests2(X
*, test::random_generator generator
)
167 typedef BOOST_DEDUCED_TYPENAME
test::ordered
<X
> tracker_type
;
168 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
169 typedef BOOST_DEDUCED_TYPENAME
X::const_iterator const_iterator
;
170 typedef BOOST_DEDUCED_TYPENAME
tracker_type::iterator tracker_iterator
;
172 UNORDERED_SUB_TEST("insert(begin(), value) tests")
174 test::check_instances check_
;
177 tracker_type tracker
= test::create_ordered(x
);
179 test::random_values
<X
> v(1000, generator
);
180 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
182 it
!= v
.end(); ++it
) {
183 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
184 float b
= x
.max_load_factor();
186 iterator r1
= x
.insert(x
.begin(), *it
);
187 tracker_iterator r2
= tracker
.insert(tracker
.begin(), *it
);
188 BOOST_TEST(*r1
== *r2
);
189 tracker
.compare_key(x
, *it
);
191 if (static_cast<double>(x
.size()) <=
192 b
* static_cast<double>(old_bucket_count
))
193 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
197 test::check_equivalent_keys(x
);
200 UNORDERED_SUB_TEST("insert(end(), value) tests")
202 test::check_instances check_
;
205 X
const& x_const
= x
;
206 tracker_type tracker
= test::create_ordered(x
);
208 test::random_values
<X
> v(100, generator
);
209 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
211 it
!= v
.end(); ++it
) {
212 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
213 float b
= x
.max_load_factor();
215 const_iterator r1
= x
.insert(x_const
.end(), *it
);
216 tracker_iterator r2
= tracker
.insert(tracker
.end(), *it
);
217 BOOST_TEST(*r1
== *r2
);
218 tracker
.compare_key(x
, *it
);
220 if (static_cast<double>(x
.size()) <=
221 b
* static_cast<double>(old_bucket_count
))
222 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
226 test::check_equivalent_keys(x
);
229 UNORDERED_SUB_TEST("insert(pos, value) tests")
231 test::check_instances check_
;
234 const_iterator pos
= x
.begin();
235 tracker_type tracker
= test::create_ordered(x
);
237 test::random_values
<X
> v(1000, generator
);
238 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
240 it
!= v
.end(); ++it
) {
241 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
242 float b
= x
.max_load_factor();
244 pos
= x
.insert(pos
, *it
);
245 tracker_iterator r2
= tracker
.insert(tracker
.begin(), *it
);
246 BOOST_TEST(*pos
== *r2
);
247 tracker
.compare_key(x
, *it
);
249 if (static_cast<double>(x
.size()) <=
250 b
* static_cast<double>(old_bucket_count
))
251 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
255 test::check_equivalent_keys(x
);
258 UNORDERED_SUB_TEST("insert(pos, rvalue) tests")
260 test::check_instances check_
;
263 const_iterator pos
= x
.begin();
264 tracker_type tracker
= test::create_ordered(x
);
266 test::random_values
<X
> v(1000, generator
);
267 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
269 it
!= v
.end(); ++it
) {
270 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
271 float b
= x
.max_load_factor();
273 typename
X::value_type value
= *it
;
274 pos
= x
.insert(pos
, boost::move(value
));
275 tracker_iterator r2
= tracker
.insert(tracker
.begin(), *it
);
276 BOOST_TEST(*pos
== *r2
);
277 tracker
.compare_key(x
, *it
);
279 if (static_cast<double>(x
.size()) <=
280 b
* static_cast<double>(old_bucket_count
))
281 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
285 test::check_equivalent_keys(x
);
288 UNORDERED_SUB_TEST("insert single item range tests")
290 test::check_instances check_
;
293 tracker_type tracker
= test::create_ordered(x
);
295 test::random_values
<X
> v(1000, generator
);
296 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
298 it
!= v
.end(); ++it
) {
299 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
300 float b
= x
.max_load_factor();
302 x
.insert(it
, test::next(it
));
304 tracker
.compare_key(x
, *it
);
306 if (static_cast<double>(x
.size()) <=
307 b
* static_cast<double>(old_bucket_count
))
308 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
312 test::check_equivalent_keys(x
);
315 UNORDERED_SUB_TEST("insert range tests")
317 test::check_instances check_
;
321 test::random_values
<X
> v(1000, generator
);
322 x
.insert(v
.begin(), v
.end());
324 test::check_container(x
, v
);
325 test::check_equivalent_keys(x
);
328 UNORDERED_SUB_TEST("insert range with rehash tests")
330 test::check_instances check_
;
334 test::random_values
<X
> v(1000, generator
);
336 x
.insert(*v
.begin());
339 x
.insert(v
.begin(), v
.end());
341 test::check_container(x
, v
);
342 test::check_equivalent_keys(x
);
345 UNORDERED_SUB_TEST("insert input iterator range tests")
347 test::check_instances check_
;
351 test::random_values
<X
> v(1000, generator
);
352 BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::const_iterator begin
=
356 x
.insert(test::input_iterator(begin
), test::input_iterator(end
));
357 test::check_container(x
, v
);
359 test::check_equivalent_keys(x
);
362 UNORDERED_SUB_TEST("insert copy iterator range tests")
364 test::check_instances check_
;
368 test::random_values
<X
> v(1000, generator
);
369 x
.insert(test::copy_iterator(v
.begin()), test::copy_iterator(v
.end()));
370 test::check_container(x
, v
);
372 test::check_equivalent_keys(x
);
375 UNORDERED_SUB_TEST("insert copy iterator range test 2")
377 test::check_instances check_
;
381 test::random_values
<X
> v1(500, generator
);
382 test::random_values
<X
> v2(500, generator
);
383 x
.insert(test::copy_iterator(v1
.begin()), test::copy_iterator(v1
.end()));
384 x
.insert(test::copy_iterator(v2
.begin()), test::copy_iterator(v2
.end()));
386 test::check_equivalent_keys(x
);
389 UNORDERED_SUB_TEST("insert various ranges")
391 for (int i
= 0; i
< 100; ++i
) {
393 test::ordered
<X
> tracker
= test::create_ordered(x
);
395 test::random_values
<X
> v(1000, generator
);
397 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
400 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
=
402 float b
= x
.max_load_factor();
404 BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator next
= it
;
405 for (std::size_t j
= test::random_value(20); j
> 0; ++j
) {
407 if (next
== v
.end()) {
413 tracker
.insert(it
, next
);
416 tracker
.compare(x
); // Slow, but I can't see any other way.
418 if (static_cast<double>(x
.size()) <=
419 b
* static_cast<double>(old_bucket_count
))
420 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
423 test::check_equivalent_keys(x
);
429 void unique_emplace_tests1(X
*, test::random_generator generator
)
431 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
432 typedef test::ordered
<X
> ordered
;
435 test::ordered
<X
> tracker
= test::create_ordered(x
);
437 test::random_values
<X
> v(1000, generator
);
439 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
= v
.begin();
440 it
!= v
.end(); ++it
) {
442 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
443 float b
= x
.max_load_factor();
445 std::pair
<iterator
, bool> r1
= x
.emplace(*it
);
446 std::pair
<BOOST_DEDUCED_TYPENAME
ordered::iterator
, bool> r2
=
449 BOOST_TEST(r1
.second
== r2
.second
);
450 BOOST_TEST(*r1
.first
== *r2
.first
);
452 tracker
.compare_key(x
, *it
);
454 if (static_cast<double>(x
.size()) <=
455 b
* static_cast<double>(old_bucket_count
))
456 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
460 test::check_equivalent_keys(x
);
464 void equivalent_emplace_tests1(X
*, test::random_generator generator
)
467 test::ordered
<X
> tracker
= test::create_ordered(x
);
469 test::random_values
<X
> v(1000, generator
);
470 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
= v
.begin();
471 it
!= v
.end(); ++it
) {
472 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
473 float b
= x
.max_load_factor();
475 BOOST_DEDUCED_TYPENAME
X::iterator r1
= x
.emplace(*it
);
476 BOOST_DEDUCED_TYPENAME
test::ordered
<X
>::iterator r2
=
479 BOOST_TEST(*r1
== *r2
);
481 tracker
.compare_key(x
, *it
);
483 if (static_cast<double>(x
.size()) <=
484 b
* static_cast<double>(old_bucket_count
))
485 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
489 test::check_equivalent_keys(x
);
493 void move_emplace_tests(X
*, test::random_generator generator
)
496 test::ordered
<X
> tracker
= test::create_ordered(x
);
498 test::random_values
<X
> v(1000, generator
);
500 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
= v
.begin();
501 it
!= v
.end(); ++it
) {
503 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
504 float b
= x
.max_load_factor();
506 typename
X::value_type value
= *it
;
507 x
.emplace(boost::move(value
));
509 tracker
.compare_key(x
, *it
);
511 if (static_cast<double>(x
.size()) <=
512 b
* static_cast<double>(old_bucket_count
))
513 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
517 test::check_equivalent_keys(x
);
520 template <class X
> void default_emplace_tests(X
*, test::random_generator
)
522 #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
523 bool is_unique
= test::has_unique_keys
<X
>::value
;
528 BOOST_TEST(x
.size() == 1);
530 BOOST_TEST(x
.size() == (is_unique
? 1u : 2u));
532 BOOST_TEST(x
.size() == (is_unique
? 1u : 3u));
534 typename
X::value_type y
;
535 BOOST_TEST(x
.count(test::get_key
<X
>(y
)) == (is_unique
? 1u : 3u));
536 BOOST_TEST(*x
.equal_range(test::get_key
<X
>(y
)).first
== y
);
539 BOOST_TEST(x
.size() == (is_unique
? 1u : 4u));
540 BOOST_TEST(x
.count(test::get_key
<X
>(y
)) == (is_unique
? 1u : 4u));
541 BOOST_TEST(*x
.equal_range(test::get_key
<X
>(y
)).first
== y
);
544 BOOST_TEST(x
.empty());
546 BOOST_TEST(x
.size() == 1);
548 BOOST_TEST(x
.size() == (is_unique
? 1u : 2u));
550 BOOST_TEST(x
.count(test::get_key
<X
>(y
)) == (is_unique
? 1u : 2u));
551 BOOST_TEST(*x
.equal_range(test::get_key
<X
>(y
)).first
== y
);
555 template <class X
> void map_tests(X
*, test::random_generator generator
)
558 test::ordered
<X
> tracker
= test::create_ordered(x
);
560 test::random_values
<X
> v(1000, generator
);
561 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
= v
.begin();
562 it
!= v
.end(); ++it
) {
563 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
564 float b
= x
.max_load_factor();
566 x
[it
->first
] = it
->second
;
567 tracker
[it
->first
] = it
->second
;
569 tracker
.compare_key(x
, *it
);
571 if (static_cast<double>(x
.size()) <=
572 b
* static_cast<double>(old_bucket_count
))
573 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
577 test::check_equivalent_keys(x
);
580 template <class X
> void map_tests2(X
*, test::random_generator generator
)
582 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
584 UNORDERED_SUB_TEST("insert_or_assign")
586 test::check_instances check_
;
589 test::ordered
<X
> tracker
= test::create_ordered(x
);
591 test::random_values
<X
> v(1000, generator
);
592 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
594 it
!= v
.end(); ++it
) {
595 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
596 float b
= x
.max_load_factor();
598 std::pair
<iterator
, bool> r
= x
.insert_or_assign(it
->first
, it
->second
);
599 BOOST_TEST(*r
.first
== *it
);
601 tracker
[it
->first
] = it
->second
;
602 tracker
.compare_key(x
, *it
);
604 if (static_cast<double>(x
.size()) <
605 b
* static_cast<double>(old_bucket_count
))
606 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
610 test::check_equivalent_keys(x
);
613 UNORDERED_SUB_TEST("insert_or_assign(begin)")
615 test::check_instances check_
;
618 test::ordered
<X
> tracker
= test::create_ordered(x
);
620 test::random_values
<X
> v(1000, generator
);
621 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
623 it
!= v
.end(); ++it
) {
624 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
625 float b
= x
.max_load_factor();
627 iterator r
= x
.insert_or_assign(x
.begin(), it
->first
, it
->second
);
628 BOOST_TEST(*r
== *it
);
630 tracker
[it
->first
] = it
->second
;
631 tracker
.compare_key(x
, *it
);
633 if (static_cast<double>(x
.size()) <
634 b
* static_cast<double>(old_bucket_count
))
635 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
639 test::check_equivalent_keys(x
);
642 UNORDERED_SUB_TEST("insert_or_assign(end)")
644 test::check_instances check_
;
647 test::ordered
<X
> tracker
= test::create_ordered(x
);
649 test::random_values
<X
> v(1000, generator
);
650 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
652 it
!= v
.end(); ++it
) {
653 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
654 float b
= x
.max_load_factor();
656 iterator r
= x
.insert_or_assign(x
.end(), it
->first
, it
->second
);
657 BOOST_TEST(*r
== *it
);
659 tracker
[it
->first
] = it
->second
;
660 tracker
.compare_key(x
, *it
);
662 if (static_cast<double>(x
.size()) <
663 b
* static_cast<double>(old_bucket_count
))
664 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
668 test::check_equivalent_keys(x
);
671 UNORDERED_SUB_TEST("insert_or_assign(last)")
673 test::check_instances check_
;
676 test::ordered
<X
> tracker
= test::create_ordered(x
);
677 iterator last
= x
.begin();
679 test::random_values
<X
> v(1000, generator
);
680 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
682 it
!= v
.end(); ++it
) {
683 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
684 float b
= x
.max_load_factor();
686 iterator r
= x
.insert_or_assign(last
, it
->first
, it
->second
);
687 BOOST_TEST(*r
== *it
);
689 tracker
[it
->first
] = it
->second
;
690 tracker
.compare_key(x
, *it
);
692 if (static_cast<double>(x
.size()) <
693 b
* static_cast<double>(old_bucket_count
))
694 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
700 test::check_equivalent_keys(x
);
705 void try_emplace_tests(X
*, test::random_generator generator
)
707 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
709 UNORDERED_SUB_TEST("try_emplace(key, value)")
711 test::check_instances check_
;
714 test::ordered
<X
> tracker
= test::create_ordered(x
);
716 test::random_values
<X
> v(1000, generator
);
717 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
719 it
!= v
.end(); ++it
) {
720 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
721 float b
= x
.max_load_factor();
723 iterator pos
= x
.find(it
->first
);
724 bool found
= pos
!= x
.end();
726 std::pair
<typename
X::iterator
, bool> r
=
727 x
.try_emplace(it
->first
, it
->second
);
729 BOOST_TEST(pos
== r
.first
);
730 BOOST_TEST(!r
.second
);
732 BOOST_TEST(r
.second
);
734 BOOST_TEST_EQ(r
.first
->first
, it
->first
);
735 BOOST_TEST_EQ(r
.first
->second
, it
->second
);
738 tracker
.compare_key(x
, *it
);
740 if (static_cast<double>(x
.size()) <
741 b
* static_cast<double>(old_bucket_count
))
742 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
745 test::check_equivalent_keys(x
);
748 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
750 UNORDERED_SUB_TEST("try_emplace(begin(), key, value)")
752 test::check_instances check_
;
755 test::ordered
<X
> tracker
= test::create_ordered(x
);
757 test::random_values
<X
> v(1000, generator
);
758 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
760 it
!= v
.end(); ++it
) {
761 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
762 float b
= x
.max_load_factor();
764 iterator pos
= x
.find(it
->first
);
765 bool found
= pos
!= x
.end();
767 typename
X::iterator r
=
768 x
.try_emplace(r
.begin(), it
->first
, it
->second
);
770 BOOST_TEST(pos
== r
);
772 BOOST_TEST_EQ(r
->first
, it
->first
);
773 BOOST_TEST_EQ(r
->second
, it
->second
);
776 tracker
.compare_key(x
, *it
);
778 if (static_cast<double>(x
.size()) <
779 b
* static_cast<double>(old_bucket_count
))
780 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
783 test::check_equivalent_keys(x
);
786 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
788 UNORDERED_SUB_TEST("try_emplace(end(), key, value)")
790 test::check_instances check_
;
793 test::ordered
<X
> tracker
= test::create_ordered(x
);
795 test::random_values
<X
> v(1000, generator
);
796 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
798 it
!= v
.end(); ++it
) {
799 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
800 float b
= x
.max_load_factor();
802 iterator pos
= x
.find(it
->first
);
803 bool found
= pos
!= x
.end();
805 typename
X::iterator r
= x
.try_emplace(r
.end(), it
->first
, it
->second
);
807 BOOST_TEST(pos
== r
);
809 BOOST_TEST_EQ(r
->first
, it
->first
);
810 BOOST_TEST_EQ(r
->second
, it
->second
);
813 tracker
.compare_key(x
, *it
);
815 if (static_cast<double>(x
.size()) <
816 b
* static_cast<double>(old_bucket_count
))
817 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
820 test::check_equivalent_keys(x
);
823 typedef BOOST_DEDUCED_TYPENAME
X::iterator iterator
;
825 UNORDERED_SUB_TEST("try_emplace(pos, key, value)")
827 test::check_instances check_
;
830 test::ordered
<X
> tracker
= test::create_ordered(x
);
832 test::random_values
<X
> v(1000, generator
);
833 for (BOOST_DEDUCED_TYPENAME
test::random_values
<X
>::iterator it
=
835 it
!= v
.end(); ++it
) {
836 BOOST_DEDUCED_TYPENAME
X::size_type old_bucket_count
= x
.bucket_count();
837 float b
= x
.max_load_factor();
839 iterator pos
= x
.find(it
->first
);
840 bool found
= pos
!= x
.end();
842 typename
X::iterator r
= x
.try_emplace(pos
, it
->first
, it
->second
);
844 BOOST_TEST(pos
== r
);
846 BOOST_TEST_EQ(r
->first
, it
->first
);
847 BOOST_TEST_EQ(r
->second
, it
->second
);
850 tracker
.compare_key(x
, *it
);
852 if (static_cast<double>(x
.size()) <
853 b
* static_cast<double>(old_bucket_count
))
854 BOOST_TEST(x
.bucket_count() == old_bucket_count
);
857 test::check_equivalent_keys(x
);
861 // Some tests for when the range's value type doesn't match the container's
865 void map_insert_range_test1(X
*, test::random_generator generator
)
867 test::check_instances check_
;
869 typedef test::list
<std::pair
<BOOST_DEDUCED_TYPENAME
X::key_type
,
870 BOOST_DEDUCED_TYPENAME
X::mapped_type
> >
872 test::random_values
<X
> v(1000, generator
);
873 list
l(v
.begin(), v
.end());
876 x
.insert(l
.begin(), l
.end());
878 test::check_equivalent_keys(x
);
882 void map_insert_range_test2(X
*, test::random_generator generator
)
884 test::check_instances check_
;
886 typedef test::list
<std::pair
<BOOST_DEDUCED_TYPENAME
X::key_type
const,
887 test::implicitly_convertible
> >
889 test::random_values
<boost::unordered_map
<BOOST_DEDUCED_TYPENAME
X::key_type
,
890 test::implicitly_convertible
> >
892 list
l(v
.begin(), v
.end());
895 x
.insert(l
.begin(), l
.end());
897 test::check_equivalent_keys(x
);
900 boost::unordered_set
<test::movable
, test::hash
, test::equal_to
,
901 std::allocator
<test::movable
> >* test_set_std_alloc
;
902 boost::unordered_multimap
<test::object
, test::object
, test::hash
,
903 test::equal_to
, std::allocator
<test::object
> >* test_multimap_std_alloc
;
905 boost::unordered_set
<test::object
, test::hash
, test::equal_to
,
906 test::allocator1
<test::object
> >* test_set
;
907 boost::unordered_multiset
<test::movable
, test::hash
, test::equal_to
,
908 test::allocator2
<test::movable
> >* test_multiset
;
909 boost::unordered_map
<test::movable
, test::movable
, test::hash
, test::equal_to
,
910 test::allocator2
<test::movable
> >* test_map
;
911 boost::unordered_multimap
<test::object
, test::object
, test::hash
,
912 test::equal_to
, test::allocator1
<test::object
> >* test_multimap
;
914 using test::default_generator
;
915 using test::generate_collisions
;
916 using test::limited_range
;
918 UNORDERED_TEST(unique_insert_tests1
,
919 ((test_set_std_alloc
)(test_set
)(test_map
))(
920 (default_generator
)(generate_collisions
)(limited_range
)))
922 UNORDERED_TEST(equivalent_insert_tests1
,
923 ((test_multimap_std_alloc
)(test_multiset
)(test_multimap
))(
924 (default_generator
)(generate_collisions
)(limited_range
)))
926 UNORDERED_TEST(insert_tests2
,
927 ((test_multimap_std_alloc
)(test_set
)(test_multiset
)(test_map
)(
928 test_multimap
))((default_generator
)(generate_collisions
)(limited_range
)))
930 UNORDERED_TEST(unique_emplace_tests1
,
931 ((test_set_std_alloc
)(test_set
)(test_map
))(
932 (default_generator
)(generate_collisions
)(limited_range
)))
934 UNORDERED_TEST(equivalent_emplace_tests1
,
935 ((test_multimap_std_alloc
)(test_multiset
)(test_multimap
))(
936 (default_generator
)(generate_collisions
)(limited_range
)))
938 UNORDERED_TEST(move_emplace_tests
,
939 ((test_set_std_alloc
)(test_multimap_std_alloc
)(test_set
)(test_map
)(
940 test_multiset
)(test_multimap
))(
941 (default_generator
)(generate_collisions
)(limited_range
)))
943 UNORDERED_TEST(default_emplace_tests
,
944 ((test_set_std_alloc
)(test_multimap_std_alloc
)(test_set
)(test_map
)(
945 test_multiset
)(test_multimap
))(
946 (default_generator
)(generate_collisions
)(limited_range
)))
948 UNORDERED_TEST(map_tests
,
949 ((test_map
))((default_generator
)(generate_collisions
)(limited_range
)))
952 map_tests2
, ((test_map
))((default_generator
)(generate_collisions
)))
954 UNORDERED_TEST(map_insert_range_test1
,
955 ((test_multimap_std_alloc
)(test_map
)(test_multimap
))(
956 (default_generator
)(generate_collisions
)(limited_range
)))
958 UNORDERED_TEST(map_insert_range_test2
,
959 ((test_multimap_std_alloc
)(test_map
)(test_multimap
))(
960 (default_generator
)(generate_collisions
)(limited_range
)))
962 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
964 struct initialize_from_two_ints
968 friend std::size_t hash_value(initialize_from_two_ints
const& x
)
970 return static_cast<std::size_t>(x
.a
+ x
.b
);
973 bool operator==(initialize_from_two_ints
const& x
) const
975 return a
== x
.a
&& b
== x
.b
;
979 UNORDERED_AUTO_TEST (insert_initializer_list_set
) {
980 boost::unordered_set
<int> set
;
981 set
.insert({1, 2, 3, 1});
982 BOOST_TEST_EQ(set
.size(), 3u);
983 BOOST_TEST(set
.find(1) != set
.end());
984 BOOST_TEST(set
.find(4) == set
.end());
986 boost::unordered_set
<initialize_from_two_ints
> set2
;
988 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5))
989 set2
.insert({{1, 2}});
993 BOOST_TEST(set2
.size() == 1);
994 BOOST_TEST(set2
.find({1, 2}) != set2
.end());
995 BOOST_TEST(set2
.find({2, 1}) == set2
.end());
997 set2
.insert({{3, 4}, {5, 6}, {7, 8}});
998 BOOST_TEST(set2
.size() == 4);
999 BOOST_TEST(set2
.find({1, 2}) != set2
.end());
1000 BOOST_TEST(set2
.find({3, 4}) != set2
.end());
1001 BOOST_TEST(set2
.find({5, 6}) != set2
.end());
1002 BOOST_TEST(set2
.find({7, 8}) != set2
.end());
1003 BOOST_TEST(set2
.find({8, 7}) == set2
.end());
1005 set2
.insert({{2, 1}, {3, 4}});
1006 BOOST_TEST(set2
.size() == 5);
1007 BOOST_TEST(set2
.find({1, 2}) != set2
.end());
1008 BOOST_TEST(set2
.find({2, 1}) != set2
.end());
1009 BOOST_TEST(set2
.find({3, 4}) != set2
.end());
1010 BOOST_TEST(set2
.find({5, 6}) != set2
.end());
1011 BOOST_TEST(set2
.find({7, 8}) != set2
.end());
1012 BOOST_TEST(set2
.find({8, 7}) == set2
.end());
1015 #if !BOOST_WORKAROUND(BOOST_MSVC, == 1800)
1017 UNORDERED_AUTO_TEST (insert_initializer_list_multiset
) {
1018 boost::unordered_multiset
<std::string
> multiset
;
1019 // multiset.insert({});
1020 BOOST_TEST(multiset
.empty());
1021 multiset
.insert({"a"});
1022 BOOST_TEST_EQ(multiset
.size(), 1u);
1023 BOOST_TEST(multiset
.find("a") != multiset
.end());
1024 BOOST_TEST(multiset
.find("b") == multiset
.end());
1025 multiset
.insert({"a", "b"});
1026 BOOST_TEST(multiset
.size() == 3);
1027 BOOST_TEST_EQ(multiset
.count("a"), 2u);
1028 BOOST_TEST_EQ(multiset
.count("b"), 1u);
1029 BOOST_TEST_EQ(multiset
.count("c"), 0u);
1034 UNORDERED_AUTO_TEST (insert_initializer_list_map
) {
1035 boost::unordered_map
<std::string
, std::string
> map
;
1037 BOOST_TEST(map
.empty());
1038 map
.insert({{"a", "b"}, {"a", "b"}, {"d", ""}});
1039 BOOST_TEST_EQ(map
.size(), 2u);
1042 UNORDERED_AUTO_TEST (insert_initializer_list_multimap
) {
1043 boost::unordered_multimap
<std::string
, std::string
> multimap
;
1044 // multimap.insert({});
1045 BOOST_TEST(multimap
.empty());
1046 multimap
.insert({{"a", "b"}, {"a", "b"}, {"d", ""}});
1047 BOOST_TEST_EQ(multimap
.size(), 3u);
1048 BOOST_TEST_EQ(multimap
.count("a"), 2u);
1053 struct overloaded_constructor
1055 overloaded_constructor(int x1_
= 1, int x2_
= 2, int x3_
= 3, int x4_
= 4)
1056 : x1(x1_
), x2(x2_
), x3(x3_
), x4(x4_
)
1062 bool operator==(overloaded_constructor
const& rhs
) const
1064 return x1
== rhs
.x1
&& x2
== rhs
.x2
&& x3
== rhs
.x3
&& x4
== rhs
.x4
;
1067 friend std::size_t hash_value(overloaded_constructor
const& x
)
1069 std::size_t hash
= 0;
1070 boost::hash_combine(hash
, x
.x1
);
1071 boost::hash_combine(hash
, x
.x2
);
1072 boost::hash_combine(hash
, x
.x3
);
1073 boost::hash_combine(hash
, x
.x4
);
1078 UNORDERED_AUTO_TEST (map_emplace_test
) {
1080 boost::unordered_map
<int, overloaded_constructor
, test::hash
,
1082 test::allocator1
<std::pair
<int const, overloaded_constructor
> > >
1085 #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
1088 x
.find(0) != x
.end() && x
.find(0)->second
== overloaded_constructor());
1093 x
.find(2) != x
.end() && x
.find(2)->second
== overloaded_constructor(3));
1097 x
.find(5) != x
.end() && x
.find(5)->second
== overloaded_constructor());
1101 boost::unordered_multimap
<int, overloaded_constructor
, test::hash
,
1103 test::allocator1
<std::pair
<int const, overloaded_constructor
> > >
1106 #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
1109 x
.find(0) != x
.end() && x
.find(0)->second
== overloaded_constructor());
1114 x
.find(2) != x
.end() && x
.find(2)->second
== overloaded_constructor(3));
1118 UNORDERED_AUTO_TEST (set_emplace_test
) {
1119 boost::unordered_set
<overloaded_constructor
> x
;
1120 overloaded_constructor check
;
1122 #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
1124 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1129 check
= overloaded_constructor(1);
1130 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1134 check
= overloaded_constructor(2, 3);
1135 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1139 check
= overloaded_constructor(4, 5, 6);
1140 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1143 x
.emplace(7, 8, 9, 10);
1144 check
= overloaded_constructor(7, 8, 9, 10);
1145 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1148 struct derived_from_piecewise_construct_t
1149 : boost::unordered::piecewise_construct_t
1153 derived_from_piecewise_construct_t
piecewise_rvalue()
1155 return derived_from_piecewise_construct_t();
1158 struct convertible_to_piecewise
1160 operator boost::unordered::piecewise_construct_t() const
1162 return boost::unordered::piecewise_construct
;
1166 UNORDERED_AUTO_TEST (map_emplace_test2
) {
1167 // Emulating piecewise construction with boost::tuple bypasses the
1168 // allocator's construct method, but still uses test destroy method.
1169 test::detail::disable_construction_tracking _scoped
;
1172 boost::unordered_map
<overloaded_constructor
, overloaded_constructor
,
1173 boost::hash
<overloaded_constructor
>,
1174 std::equal_to
<overloaded_constructor
>,
1176 std::pair
<overloaded_constructor
const, overloaded_constructor
> > >
1179 x
.emplace(boost::unordered::piecewise_construct
, boost::make_tuple(),
1180 boost::make_tuple());
1182 x
.find(overloaded_constructor()) != x
.end() &&
1183 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1186 convertible_to_piecewise(), boost::make_tuple(1), boost::make_tuple());
1188 x
.find(overloaded_constructor(1)) != x
.end() &&
1189 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1191 x
.emplace(piecewise_rvalue(), boost::make_tuple(2, 3),
1192 boost::make_tuple(4, 5, 6));
1193 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1194 x
.find(overloaded_constructor(2, 3))->second
==
1195 overloaded_constructor(4, 5, 6));
1197 derived_from_piecewise_construct_t d
;
1198 x
.emplace(d
, boost::make_tuple(9, 3, 1), boost::make_tuple(10));
1199 BOOST_TEST(x
.find(overloaded_constructor(9, 3, 1)) != x
.end() &&
1200 x
.find(overloaded_constructor(9, 3, 1))->second
==
1201 overloaded_constructor(10));
1205 x
.try_emplace(overloaded_constructor());
1207 x
.find(overloaded_constructor()) != x
.end() &&
1208 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1212 x
.find(overloaded_constructor(1)) != x
.end() &&
1213 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1215 x
.try_emplace(overloaded_constructor(2, 3), 4, 5, 6);
1216 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1217 x
.find(overloaded_constructor(2, 3))->second
==
1218 overloaded_constructor(4, 5, 6));
1222 x
.try_emplace(x
.begin(), overloaded_constructor());
1224 x
.find(overloaded_constructor()) != x
.end() &&
1225 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1227 x
.try_emplace(x
.end(), 1);
1229 x
.find(overloaded_constructor(1)) != x
.end() &&
1230 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1232 x
.try_emplace(x
.begin(), overloaded_constructor(2, 3), 4, 5, 6);
1233 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1234 x
.find(overloaded_constructor(2, 3))->second
==
1235 overloaded_constructor(4, 5, 6));
1239 boost::unordered_multimap
<overloaded_constructor
, overloaded_constructor
,
1240 boost::hash
<overloaded_constructor
>,
1241 std::equal_to
<overloaded_constructor
>,
1243 std::pair
<overloaded_constructor
const, overloaded_constructor
> > >
1246 x
.emplace(boost::unordered::piecewise_construct
, boost::make_tuple(),
1247 boost::make_tuple());
1249 x
.find(overloaded_constructor()) != x
.end() &&
1250 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1253 convertible_to_piecewise(), boost::make_tuple(1), boost::make_tuple());
1255 x
.find(overloaded_constructor(1)) != x
.end() &&
1256 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1258 x
.emplace(piecewise_rvalue(), boost::make_tuple(2, 3),
1259 boost::make_tuple(4, 5, 6));
1260 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1261 x
.find(overloaded_constructor(2, 3))->second
==
1262 overloaded_constructor(4, 5, 6));
1264 derived_from_piecewise_construct_t d
;
1265 x
.emplace(d
, boost::make_tuple(9, 3, 1), boost::make_tuple(10));
1266 BOOST_TEST(x
.find(overloaded_constructor(9, 3, 1)) != x
.end() &&
1267 x
.find(overloaded_constructor(9, 3, 1))->second
==
1268 overloaded_constructor(10));
1272 UNORDERED_AUTO_TEST (set_emplace_test2
) {
1273 boost::unordered_set
<
1274 std::pair
<overloaded_constructor
, overloaded_constructor
> >
1276 std::pair
<overloaded_constructor
, overloaded_constructor
> check
;
1278 x
.emplace(boost::unordered::piecewise_construct
, boost::make_tuple(),
1279 boost::make_tuple());
1280 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1283 x
.emplace(boost::unordered::piecewise_construct
, boost::make_tuple(1),
1284 boost::make_tuple(2, 3));
1286 std::make_pair(overloaded_constructor(1), overloaded_constructor(2, 3));
1287 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1290 // Use the preprocessor to generate tests using different combinations of
1291 // boost/std piecewise_construct_t/tuple.
1293 #define PIECEWISE_TEST_NAME boost_tuple_piecewise_tests
1294 #define PIECEWISE_NAMESPACE boost::unordered
1295 #define TUPLE_NAMESPACE boost
1296 #define EMULATING_PIECEWISE_CONSTRUCTION 1
1297 #include "./insert_tests.cpp"
1299 #if BOOST_UNORDERED_HAVE_PIECEWISE_CONSTRUCT
1301 #define PIECEWISE_TEST_NAME boost_tuple_std_piecewise_tests
1302 #define PIECEWISE_NAMESPACE std
1303 #define TUPLE_NAMESPACE boost
1304 #define EMULATING_PIECEWISE_CONSTRUCTION 1
1305 #include "./insert_tests.cpp"
1309 #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
1311 #define PIECEWISE_TEST_NAME std_tuple_boost_piecewise_tests
1312 #define PIECEWISE_NAMESPACE boost::unordered
1313 #define TUPLE_NAMESPACE std
1314 #define EMULATING_PIECEWISE_CONSTRUCTION 0
1315 #include "./insert_tests.cpp"
1319 #if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
1320 BOOST_UNORDERED_HAVE_PIECEWISE_CONSTRUCT
1322 #define PIECEWISE_TEST_NAME std_piecewise_tests
1323 #define PIECEWISE_NAMESPACE std
1324 #define TUPLE_NAMESPACE std
1325 #define EMULATING_PIECEWISE_CONSTRUCTION 0
1326 #include "./insert_tests.cpp"
1333 #else // PIECEWISE_TEST_NAME
1335 UNORDERED_AUTO_TEST (PIECEWISE_TEST_NAME
) {
1336 #if EMULATING_PIECEWISE_CONSTRUCTION
1337 test::detail::disable_construction_tracking _scoped
;
1341 boost::unordered_map
<overloaded_constructor
, overloaded_constructor
,
1342 boost::hash
<overloaded_constructor
>,
1343 std::equal_to
<overloaded_constructor
>,
1345 std::pair
<overloaded_constructor
const, overloaded_constructor
> > >
1348 x
.emplace(PIECEWISE_NAMESPACE::piecewise_construct
,
1349 TUPLE_NAMESPACE::make_tuple(), TUPLE_NAMESPACE::make_tuple());
1351 x
.find(overloaded_constructor()) != x
.end() &&
1352 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1354 x
.emplace(convertible_to_piecewise(), TUPLE_NAMESPACE::make_tuple(1),
1355 TUPLE_NAMESPACE::make_tuple());
1357 x
.find(overloaded_constructor(1)) != x
.end() &&
1358 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1360 x
.emplace(piecewise_rvalue(), TUPLE_NAMESPACE::make_tuple(2, 3),
1361 TUPLE_NAMESPACE::make_tuple(4, 5, 6));
1362 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1363 x
.find(overloaded_constructor(2, 3))->second
==
1364 overloaded_constructor(4, 5, 6));
1366 derived_from_piecewise_construct_t d
;
1368 d
, TUPLE_NAMESPACE::make_tuple(9, 3, 1), TUPLE_NAMESPACE::make_tuple(10));
1369 BOOST_TEST(x
.find(overloaded_constructor(9, 3, 1)) != x
.end() &&
1370 x
.find(overloaded_constructor(9, 3, 1))->second
==
1371 overloaded_constructor(10));
1375 x
.try_emplace(overloaded_constructor());
1377 x
.find(overloaded_constructor()) != x
.end() &&
1378 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1382 x
.find(overloaded_constructor(1)) != x
.end() &&
1383 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1385 x
.try_emplace(overloaded_constructor(2, 3), 4, 5, 6);
1386 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1387 x
.find(overloaded_constructor(2, 3))->second
==
1388 overloaded_constructor(4, 5, 6));
1391 boost::unordered_multimap
<overloaded_constructor
, overloaded_constructor
,
1392 boost::hash
<overloaded_constructor
>,
1393 std::equal_to
<overloaded_constructor
>,
1395 std::pair
<overloaded_constructor
const, overloaded_constructor
> > >
1398 x
.emplace(PIECEWISE_NAMESPACE::piecewise_construct
,
1399 TUPLE_NAMESPACE::make_tuple(), TUPLE_NAMESPACE::make_tuple());
1401 x
.find(overloaded_constructor()) != x
.end() &&
1402 x
.find(overloaded_constructor())->second
== overloaded_constructor());
1404 x
.emplace(convertible_to_piecewise(), TUPLE_NAMESPACE::make_tuple(1),
1405 TUPLE_NAMESPACE::make_tuple());
1407 x
.find(overloaded_constructor(1)) != x
.end() &&
1408 x
.find(overloaded_constructor(1))->second
== overloaded_constructor());
1410 x
.emplace(piecewise_rvalue(), TUPLE_NAMESPACE::make_tuple(2, 3),
1411 TUPLE_NAMESPACE::make_tuple(4, 5, 6));
1412 BOOST_TEST(x
.find(overloaded_constructor(2, 3)) != x
.end() &&
1413 x
.find(overloaded_constructor(2, 3))->second
==
1414 overloaded_constructor(4, 5, 6));
1416 derived_from_piecewise_construct_t d
;
1418 d
, TUPLE_NAMESPACE::make_tuple(9, 3, 1), TUPLE_NAMESPACE::make_tuple(10));
1419 BOOST_TEST(x
.find(overloaded_constructor(9, 3, 1)) != x
.end() &&
1420 x
.find(overloaded_constructor(9, 3, 1))->second
==
1421 overloaded_constructor(10));
1425 UNORDERED_AUTO_TEST (BOOST_PP_CAT(PIECEWISE_TEST_NAME
, 2)) {
1426 #if EMULATING_PIECEWISE_CONSTRUCTION
1427 test::detail::disable_construction_tracking _scoped
;
1430 boost::unordered_set
<
1431 std::pair
<overloaded_constructor
, overloaded_constructor
> >
1433 std::pair
<overloaded_constructor
, overloaded_constructor
> check
;
1435 x
.emplace(PIECEWISE_NAMESPACE::piecewise_construct
,
1436 TUPLE_NAMESPACE::make_tuple(), TUPLE_NAMESPACE::make_tuple());
1437 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1440 x
.emplace(PIECEWISE_NAMESPACE::piecewise_construct
,
1441 TUPLE_NAMESPACE::make_tuple(1), TUPLE_NAMESPACE::make_tuple(2, 3));
1443 std::make_pair(overloaded_constructor(1), overloaded_constructor(2, 3));
1444 BOOST_TEST(x
.find(check
) != x
.end() && *x
.find(check
) == check
);
1447 #undef PIECEWISE_TEST_NAME
1448 #undef PIECEWISE_NAMESPACE
1449 #undef TUPLE_NAMESPACE
1450 #undef EMULATING_PIECEWISE_CONSTRUCTION