1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
13 // class Alloc = allocator<pair<const Key, T>>>
14 // class unordered_multimap
16 // void swap(unordered_multimap& __u);
18 #include <unordered_map>
23 #include "test_macros.h"
24 #include "../../test_compare.h"
25 #include "../../test_hash.h"
26 #include "test_allocator.h"
28 #include "min_allocator.h"
33 typedef test_hash<std::hash<int> > Hash;
34 typedef test_compare<std::equal_to<int> > Compare;
35 typedef test_allocator<std::pair<const int, std::string> > Alloc;
36 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
37 typedef std::pair<int, std::string> P;
38 C c1(0, Hash(1), Compare(1), Alloc(1, 1));
39 C c2(0, Hash(2), Compare(2), Alloc(1, 2));
40 c2.max_load_factor(2);
43 LIBCPP_ASSERT(c1.bucket_count() == 0);
44 assert(c1.size() == 0);
45 assert(c1.hash_function() == Hash(2));
46 assert(c1.key_eq() == Compare(2));
47 assert(c1.get_allocator().get_id() == 1);
48 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
49 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
50 assert(c1.max_load_factor() == 2);
52 LIBCPP_ASSERT(c2.bucket_count() == 0);
53 assert(c2.size() == 0);
54 assert(c2.hash_function() == Hash(1));
55 assert(c2.key_eq() == Compare(1));
56 assert(c2.get_allocator().get_id() == 2);
57 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
58 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
59 assert(c2.max_load_factor() == 1);
62 typedef test_hash<std::hash<int> > Hash;
63 typedef test_compare<std::equal_to<int> > Compare;
64 typedef test_allocator<std::pair<const int, std::string> > Alloc;
65 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
66 typedef std::pair<int, std::string> P;
78 C c1(0, Hash(1), Compare(1), Alloc(1, 1));
79 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2));
80 c2.max_load_factor(2);
83 assert(c1.bucket_count() >= 8);
84 assert(c1.size() == 8);
85 assert(c1.find(10)->second == "ten");
86 assert(c1.find(20)->second == "twenty");
87 assert(c1.find(30)->second == "thirty");
88 assert(c1.find(40)->second == "forty");
89 assert(c1.find(50)->second == "fifty");
90 assert(c1.find(60)->second == "sixty");
91 assert(c1.find(70)->second == "seventy");
92 assert(c1.find(80)->second == "eighty");
93 assert(c1.hash_function() == Hash(2));
94 assert(c1.key_eq() == Compare(2));
95 assert(c1.get_allocator().get_id() == 1);
96 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
97 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
98 assert(c1.max_load_factor() == 2);
100 LIBCPP_ASSERT(c2.bucket_count() == 0);
101 assert(c2.size() == 0);
102 assert(c2.hash_function() == Hash(1));
103 assert(c2.key_eq() == Compare(1));
104 assert(c2.get_allocator().get_id() == 2);
105 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
106 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
107 assert(c2.max_load_factor() == 1);
110 typedef test_hash<std::hash<int> > Hash;
111 typedef test_compare<std::equal_to<int> > Compare;
112 typedef test_allocator<std::pair<const int, std::string> > Alloc;
113 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
114 typedef std::pair<int, std::string> P;
124 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1));
125 C c2(0, Hash(2), Compare(2), Alloc(1, 2));
126 c2.max_load_factor(2);
129 LIBCPP_ASSERT(c1.bucket_count() == 0);
130 assert(c1.size() == 0);
131 assert(c1.hash_function() == Hash(2));
132 assert(c1.key_eq() == Compare(2));
133 assert(c1.get_allocator().get_id() == 1);
134 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
135 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
136 assert(c1.max_load_factor() == 2);
138 assert(c2.bucket_count() >= 6);
139 assert(c2.size() == 6);
140 assert(c2.find(1)->second == "one");
141 assert(next(c2.find(1))->second == "four");
142 assert(c2.find(2)->second == "two");
143 assert(next(c2.find(2))->second == "four");
144 assert(c2.find(3)->second == "three");
145 assert(c2.find(4)->second == "four");
146 assert(c2.hash_function() == Hash(1));
147 assert(c2.key_eq() == Compare(1));
148 assert(c2.get_allocator().get_id() == 2);
149 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
150 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
151 assert(c2.max_load_factor() == 1);
154 typedef test_hash<std::hash<int> > Hash;
155 typedef test_compare<std::equal_to<int> > Compare;
156 typedef test_allocator<std::pair<const int, std::string> > Alloc;
157 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
158 typedef std::pair<int, std::string> P;
179 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1));
180 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2));
181 c2.max_load_factor(2);
184 assert(c1.bucket_count() >= 8);
185 assert(c1.size() == 8);
186 assert(c1.find(10)->second == "ten");
187 assert(c1.find(20)->second == "twenty");
188 assert(c1.find(30)->second == "thirty");
189 assert(c1.find(40)->second == "forty");
190 assert(c1.find(50)->second == "fifty");
191 assert(c1.find(60)->second == "sixty");
192 assert(c1.find(70)->second == "seventy");
193 assert(c1.find(80)->second == "eighty");
194 assert(c1.hash_function() == Hash(2));
195 assert(c1.key_eq() == Compare(2));
196 assert(c1.get_allocator().get_id() == 1);
197 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
198 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
199 assert(c1.max_load_factor() == 2);
201 assert(c2.bucket_count() >= 6);
202 assert(c2.size() == 6);
203 assert(c2.find(1)->second == "one");
204 assert(next(c2.find(1))->second == "four");
205 assert(c2.find(2)->second == "two");
206 assert(next(c2.find(2))->second == "four");
207 assert(c2.find(3)->second == "three");
208 assert(c2.find(4)->second == "four");
209 assert(c2.hash_function() == Hash(1));
210 assert(c2.key_eq() == Compare(1));
211 assert(c2.get_allocator().get_id() == 2);
212 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
213 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
214 assert(c2.max_load_factor() == 1);
218 typedef test_hash<std::hash<int> > Hash;
219 typedef test_compare<std::equal_to<int> > Compare;
220 typedef other_allocator<std::pair<const int, std::string> > Alloc;
221 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
222 typedef std::pair<int, std::string> P;
223 C c1(0, Hash(1), Compare(1), Alloc(1));
224 C c2(0, Hash(2), Compare(2), Alloc(2));
225 c2.max_load_factor(2);
228 LIBCPP_ASSERT(c1.bucket_count() == 0);
229 assert(c1.size() == 0);
230 assert(c1.hash_function() == Hash(2));
231 assert(c1.key_eq() == Compare(2));
232 assert(c1.get_allocator() == Alloc(2));
233 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
234 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
235 assert(c1.max_load_factor() == 2);
237 LIBCPP_ASSERT(c2.bucket_count() == 0);
238 assert(c2.size() == 0);
239 assert(c2.hash_function() == Hash(1));
240 assert(c2.key_eq() == Compare(1));
241 assert(c2.get_allocator() == Alloc(1));
242 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
243 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
244 assert(c2.max_load_factor() == 1);
247 typedef test_hash<std::hash<int> > Hash;
248 typedef test_compare<std::equal_to<int> > Compare;
249 typedef other_allocator<std::pair<const int, std::string> > Alloc;
250 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
251 typedef std::pair<int, std::string> P;
263 C c1(0, Hash(1), Compare(1), Alloc(1));
264 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2));
265 c2.max_load_factor(2);
268 assert(c1.bucket_count() >= 8);
269 assert(c1.size() == 8);
270 assert(c1.find(10)->second == "ten");
271 assert(c1.find(20)->second == "twenty");
272 assert(c1.find(30)->second == "thirty");
273 assert(c1.find(40)->second == "forty");
274 assert(c1.find(50)->second == "fifty");
275 assert(c1.find(60)->second == "sixty");
276 assert(c1.find(70)->second == "seventy");
277 assert(c1.find(80)->second == "eighty");
278 assert(c1.hash_function() == Hash(2));
279 assert(c1.key_eq() == Compare(2));
280 assert(c1.get_allocator() == Alloc(2));
281 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
282 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
283 assert(c1.max_load_factor() == 2);
285 LIBCPP_ASSERT(c2.bucket_count() == 0);
286 assert(c2.size() == 0);
287 assert(c2.hash_function() == Hash(1));
288 assert(c2.key_eq() == Compare(1));
289 assert(c2.get_allocator() == Alloc(1));
290 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
291 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
292 assert(c2.max_load_factor() == 1);
295 typedef test_hash<std::hash<int> > Hash;
296 typedef test_compare<std::equal_to<int> > Compare;
297 typedef other_allocator<std::pair<const int, std::string> > Alloc;
298 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
299 typedef std::pair<int, std::string> P;
309 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1));
310 C c2(0, Hash(2), Compare(2), Alloc(2));
311 c2.max_load_factor(2);
314 LIBCPP_ASSERT(c1.bucket_count() == 0);
315 assert(c1.size() == 0);
316 assert(c1.hash_function() == Hash(2));
317 assert(c1.key_eq() == Compare(2));
318 assert(c1.get_allocator() == Alloc(2));
319 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
320 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
321 assert(c1.max_load_factor() == 2);
323 assert(c2.bucket_count() >= 6);
324 assert(c2.size() == 6);
325 assert(c2.find(1)->second == "one");
326 assert(next(c2.find(1))->second == "four");
327 assert(c2.find(2)->second == "two");
328 assert(next(c2.find(2))->second == "four");
329 assert(c2.find(3)->second == "three");
330 assert(c2.find(4)->second == "four");
331 assert(c2.hash_function() == Hash(1));
332 assert(c2.key_eq() == Compare(1));
333 assert(c2.get_allocator() == Alloc(1));
334 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
335 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
336 assert(c2.max_load_factor() == 1);
339 typedef test_hash<std::hash<int> > Hash;
340 typedef test_compare<std::equal_to<int> > Compare;
341 typedef other_allocator<std::pair<const int, std::string> > Alloc;
342 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
343 typedef std::pair<int, std::string> P;
364 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1));
365 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2));
366 c2.max_load_factor(2);
369 assert(c1.bucket_count() >= 8);
370 assert(c1.size() == 8);
371 assert(c1.find(10)->second == "ten");
372 assert(c1.find(20)->second == "twenty");
373 assert(c1.find(30)->second == "thirty");
374 assert(c1.find(40)->second == "forty");
375 assert(c1.find(50)->second == "fifty");
376 assert(c1.find(60)->second == "sixty");
377 assert(c1.find(70)->second == "seventy");
378 assert(c1.find(80)->second == "eighty");
379 assert(c1.hash_function() == Hash(2));
380 assert(c1.key_eq() == Compare(2));
381 assert(c1.get_allocator() == Alloc(2));
382 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
383 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
384 assert(c1.max_load_factor() == 2);
386 assert(c2.bucket_count() >= 6);
387 assert(c2.size() == 6);
388 assert(c2.find(1)->second == "one");
389 assert(next(c2.find(1))->second == "four");
390 assert(c2.find(2)->second == "two");
391 assert(next(c2.find(2))->second == "four");
392 assert(c2.find(3)->second == "three");
393 assert(c2.find(4)->second == "four");
394 assert(c2.hash_function() == Hash(1));
395 assert(c2.key_eq() == Compare(1));
396 assert(c2.get_allocator() == Alloc(1));
397 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
398 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
399 assert(c2.max_load_factor() == 1);
401 #if TEST_STD_VER >= 11
403 typedef test_hash<std::hash<int> > Hash;
404 typedef test_compare<std::equal_to<int> > Compare;
405 typedef min_allocator<std::pair<const int, std::string> > Alloc;
406 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
407 typedef std::pair<int, std::string> P;
408 C c1(0, Hash(1), Compare(1), Alloc());
409 C c2(0, Hash(2), Compare(2), Alloc());
410 c2.max_load_factor(2);
413 LIBCPP_ASSERT(c1.bucket_count() == 0);
414 assert(c1.size() == 0);
415 assert(c1.hash_function() == Hash(2));
416 assert(c1.key_eq() == Compare(2));
417 assert(c1.get_allocator() == Alloc());
418 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
419 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
420 assert(c1.max_load_factor() == 2);
422 LIBCPP_ASSERT(c2.bucket_count() == 0);
423 assert(c2.size() == 0);
424 assert(c2.hash_function() == Hash(1));
425 assert(c2.key_eq() == Compare(1));
426 assert(c2.get_allocator() == Alloc());
427 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
428 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
429 assert(c2.max_load_factor() == 1);
432 typedef test_hash<std::hash<int> > Hash;
433 typedef test_compare<std::equal_to<int> > Compare;
434 typedef min_allocator<std::pair<const int, std::string> > Alloc;
435 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
436 typedef std::pair<int, std::string> P;
448 C c1(0, Hash(1), Compare(1), Alloc());
449 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc());
450 c2.max_load_factor(2);
453 assert(c1.bucket_count() >= 8);
454 assert(c1.size() == 8);
455 assert(c1.find(10)->second == "ten");
456 assert(c1.find(20)->second == "twenty");
457 assert(c1.find(30)->second == "thirty");
458 assert(c1.find(40)->second == "forty");
459 assert(c1.find(50)->second == "fifty");
460 assert(c1.find(60)->second == "sixty");
461 assert(c1.find(70)->second == "seventy");
462 assert(c1.find(80)->second == "eighty");
463 assert(c1.hash_function() == Hash(2));
464 assert(c1.key_eq() == Compare(2));
465 assert(c1.get_allocator() == Alloc());
466 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
467 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
468 assert(c1.max_load_factor() == 2);
470 LIBCPP_ASSERT(c2.bucket_count() == 0);
471 assert(c2.size() == 0);
472 assert(c2.hash_function() == Hash(1));
473 assert(c2.key_eq() == Compare(1));
474 assert(c2.get_allocator() == Alloc());
475 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
476 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
477 assert(c2.max_load_factor() == 1);
480 typedef test_hash<std::hash<int> > Hash;
481 typedef test_compare<std::equal_to<int> > Compare;
482 typedef min_allocator<std::pair<const int, std::string> > Alloc;
483 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
484 typedef std::pair<int, std::string> P;
494 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc());
495 C c2(0, Hash(2), Compare(2), Alloc());
496 c2.max_load_factor(2);
499 LIBCPP_ASSERT(c1.bucket_count() == 0);
500 assert(c1.size() == 0);
501 assert(c1.hash_function() == Hash(2));
502 assert(c1.key_eq() == Compare(2));
503 assert(c1.get_allocator() == Alloc());
504 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
505 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
506 assert(c1.max_load_factor() == 2);
508 assert(c2.bucket_count() >= 6);
509 assert(c2.size() == 6);
510 assert(c2.find(1)->second == "one");
511 assert(next(c2.find(1))->second == "four");
512 assert(c2.find(2)->second == "two");
513 assert(next(c2.find(2))->second == "four");
514 assert(c2.find(3)->second == "three");
515 assert(c2.find(4)->second == "four");
516 assert(c2.hash_function() == Hash(1));
517 assert(c2.key_eq() == Compare(1));
518 assert(c2.get_allocator() == Alloc());
519 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
520 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
521 assert(c2.max_load_factor() == 1);
524 typedef test_hash<std::hash<int> > Hash;
525 typedef test_compare<std::equal_to<int> > Compare;
526 typedef min_allocator<std::pair<const int, std::string> > Alloc;
527 typedef std::unordered_multimap<int, std::string, Hash, Compare, Alloc> C;
528 typedef std::pair<int, std::string> P;
549 C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc());
550 C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc());
551 c2.max_load_factor(2);
554 assert(c1.bucket_count() >= 8);
555 assert(c1.size() == 8);
556 assert(c1.find(10)->second == "ten");
557 assert(c1.find(20)->second == "twenty");
558 assert(c1.find(30)->second == "thirty");
559 assert(c1.find(40)->second == "forty");
560 assert(c1.find(50)->second == "fifty");
561 assert(c1.find(60)->second == "sixty");
562 assert(c1.find(70)->second == "seventy");
563 assert(c1.find(80)->second == "eighty");
564 assert(c1.hash_function() == Hash(2));
565 assert(c1.key_eq() == Compare(2));
566 assert(c1.get_allocator() == Alloc());
567 assert(static_cast<std::size_t>(std::distance(c1.begin(), c1.end())) == c1.size());
568 assert(static_cast<std::size_t>(std::distance(c1.cbegin(), c1.cend())) == c1.size());
569 assert(c1.max_load_factor() == 2);
571 assert(c2.bucket_count() >= 6);
572 assert(c2.size() == 6);
573 assert(c2.find(1)->second == "one");
574 assert(next(c2.find(1))->second == "four");
575 assert(c2.find(2)->second == "two");
576 assert(next(c2.find(2))->second == "four");
577 assert(c2.find(3)->second == "three");
578 assert(c2.find(4)->second == "four");
579 assert(c2.hash_function() == Hash(1));
580 assert(c2.key_eq() == Compare(1));
581 assert(c2.get_allocator() == Alloc());
582 assert(static_cast<std::size_t>(std::distance(c2.begin(), c2.end())) == c2.size());
583 assert(static_cast<std::size_t>(std::distance(c2.cbegin(), c2.cend())) == c2.size());
584 assert(c2.max_load_factor() == 1);