1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <unordered_map>
11 
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
15 
16 // local_iterator       begin (size_type n);
17 // local_iterator       end   (size_type n);
18 // const_local_iterator begin (size_type n) const;
19 // const_local_iterator end   (size_type n) const;
20 // const_local_iterator cbegin(size_type n) const;
21 // const_local_iterator cend  (size_type n) const;
22 
23 #include <unordered_map>
24 #include <string>
25 #include <cassert>
26 
27 #include "min_allocator.h"
28 
main()29 int main()
30 {
31     {
32         typedef std::unordered_multimap<int, std::string> C;
33         typedef std::pair<int, std::string> P;
34         typedef C::local_iterator I;
35         P a[] =
36         {
37             P(1, "one"),
38             P(2, "two"),
39             P(3, "three"),
40             P(4, "four"),
41             P(1, "four"),
42             P(2, "four"),
43         };
44         C c(a, a + sizeof(a)/sizeof(a[0]));
45         assert(c.bucket_count() >= 7);
46         C::size_type b = c.bucket(0);
47         I i = c.begin(b);
48         I j = c.end(b);
49         assert(std::distance(i, j) == 0);
50 
51         b = c.bucket(1);
52         i = c.begin(b);
53         j = c.end(b);
54         assert(std::distance(i, j) == 2);
55         assert(i->first == 1);
56         assert(i->second == "one");
57         ++i;
58         assert(i->first == 1);
59         assert(i->second == "four");
60 
61         b = c.bucket(2);
62         i = c.begin(b);
63         j = c.end(b);
64         assert(std::distance(i, j) == 2);
65         assert(i->first == 2);
66         assert(i->second == "two");
67         ++i;
68         assert(i->first == 2);
69         assert(i->second == "four");
70 
71         b = c.bucket(3);
72         i = c.begin(b);
73         j = c.end(b);
74         assert(std::distance(i, j) == 1);
75         assert(i->first == 3);
76         assert(i->second == "three");
77 
78         b = c.bucket(4);
79         i = c.begin(b);
80         j = c.end(b);
81         assert(std::distance(i, j) == 1);
82         assert(i->first == 4);
83         assert(i->second == "four");
84 
85         b = c.bucket(5);
86         i = c.begin(b);
87         j = c.end(b);
88         assert(std::distance(i, j) == 0);
89 
90         b = c.bucket(6);
91         i = c.begin(b);
92         j = c.end(b);
93         assert(std::distance(i, j) == 0);
94     }
95     {
96         typedef std::unordered_multimap<int, std::string> C;
97         typedef std::pair<int, std::string> P;
98         typedef C::const_local_iterator I;
99         P a[] =
100         {
101             P(1, "one"),
102             P(2, "two"),
103             P(3, "three"),
104             P(4, "four"),
105             P(1, "four"),
106             P(2, "four"),
107         };
108         const C c(a, a + sizeof(a)/sizeof(a[0]));
109         assert(c.bucket_count() >= 7);
110         C::size_type b = c.bucket(0);
111         I i = c.begin(b);
112         I j = c.end(b);
113         assert(std::distance(i, j) == 0);
114 
115         b = c.bucket(1);
116         i = c.begin(b);
117         j = c.end(b);
118         assert(std::distance(i, j) == 2);
119         assert(i->first == 1);
120         assert(i->second == "one");
121         ++i;
122         assert(i->first == 1);
123         assert(i->second == "four");
124 
125         b = c.bucket(2);
126         i = c.begin(b);
127         j = c.end(b);
128         assert(std::distance(i, j) == 2);
129         assert(i->first == 2);
130         assert(i->second == "two");
131         ++i;
132         assert(i->first == 2);
133         assert(i->second == "four");
134 
135         b = c.bucket(3);
136         i = c.begin(b);
137         j = c.end(b);
138         assert(std::distance(i, j) == 1);
139         assert(i->first == 3);
140         assert(i->second == "three");
141 
142         b = c.bucket(4);
143         i = c.begin(b);
144         j = c.end(b);
145         assert(std::distance(i, j) == 1);
146         assert(i->first == 4);
147         assert(i->second == "four");
148 
149         b = c.bucket(5);
150         i = c.begin(b);
151         j = c.end(b);
152         assert(std::distance(i, j) == 0);
153 
154         b = c.bucket(6);
155         i = c.begin(b);
156         j = c.end(b);
157         assert(std::distance(i, j) == 0);
158     }
159     {
160         typedef std::unordered_multimap<int, std::string> C;
161         typedef std::pair<int, std::string> P;
162         typedef C::const_local_iterator I;
163         P a[] =
164         {
165             P(1, "one"),
166             P(2, "two"),
167             P(3, "three"),
168             P(4, "four"),
169             P(1, "four"),
170             P(2, "four"),
171         };
172         C c(a, a + sizeof(a)/sizeof(a[0]));
173         assert(c.bucket_count() >= 7);
174         C::size_type b = c.bucket(0);
175         I i = c.cbegin(b);
176         I j = c.cend(b);
177         assert(std::distance(i, j) == 0);
178 
179         b = c.bucket(1);
180         i = c.cbegin(b);
181         j = c.cend(b);
182         assert(std::distance(i, j) == 2);
183         assert(i->first == 1);
184         assert(i->second == "one");
185         ++i;
186         assert(i->first == 1);
187         assert(i->second == "four");
188 
189         b = c.bucket(2);
190         i = c.cbegin(b);
191         j = c.cend(b);
192         assert(std::distance(i, j) == 2);
193         assert(i->first == 2);
194         assert(i->second == "two");
195         ++i;
196         assert(i->first == 2);
197         assert(i->second == "four");
198 
199         b = c.bucket(3);
200         i = c.cbegin(b);
201         j = c.cend(b);
202         assert(std::distance(i, j) == 1);
203         assert(i->first == 3);
204         assert(i->second == "three");
205 
206         b = c.bucket(4);
207         i = c.cbegin(b);
208         j = c.cend(b);
209         assert(std::distance(i, j) == 1);
210         assert(i->first == 4);
211         assert(i->second == "four");
212 
213         b = c.bucket(5);
214         i = c.cbegin(b);
215         j = c.cend(b);
216         assert(std::distance(i, j) == 0);
217 
218         b = c.bucket(6);
219         i = c.cbegin(b);
220         j = c.cend(b);
221         assert(std::distance(i, j) == 0);
222     }
223     {
224         typedef std::unordered_multimap<int, std::string> C;
225         typedef std::pair<int, std::string> P;
226         typedef C::const_local_iterator I;
227         P a[] =
228         {
229             P(1, "one"),
230             P(2, "two"),
231             P(3, "three"),
232             P(4, "four"),
233             P(1, "four"),
234             P(2, "four"),
235         };
236         const C c(a, a + sizeof(a)/sizeof(a[0]));
237         assert(c.bucket_count() >= 7);
238         C::size_type b = c.bucket(0);
239         I i = c.cbegin(b);
240         I j = c.cend(b);
241         assert(std::distance(i, j) == 0);
242 
243         b = c.bucket(1);
244         i = c.cbegin(b);
245         j = c.cend(b);
246         assert(std::distance(i, j) == 2);
247         assert(i->first == 1);
248         assert(i->second == "one");
249         ++i;
250         assert(i->first == 1);
251         assert(i->second == "four");
252 
253         b = c.bucket(2);
254         i = c.cbegin(b);
255         j = c.cend(b);
256         assert(std::distance(i, j) == 2);
257         assert(i->first == 2);
258         assert(i->second == "two");
259         ++i;
260         assert(i->first == 2);
261         assert(i->second == "four");
262 
263         b = c.bucket(3);
264         i = c.cbegin(b);
265         j = c.cend(b);
266         assert(std::distance(i, j) == 1);
267         assert(i->first == 3);
268         assert(i->second == "three");
269 
270         b = c.bucket(4);
271         i = c.cbegin(b);
272         j = c.cend(b);
273         assert(std::distance(i, j) == 1);
274         assert(i->first == 4);
275         assert(i->second == "four");
276 
277         b = c.bucket(5);
278         i = c.cbegin(b);
279         j = c.cend(b);
280         assert(std::distance(i, j) == 0);
281 
282         b = c.bucket(6);
283         i = c.cbegin(b);
284         j = c.cend(b);
285         assert(std::distance(i, j) == 0);
286     }
287 #if __cplusplus >= 201103L
288     {
289         typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>,
290                             min_allocator<std::pair<const int, std::string>>> C;
291         typedef std::pair<int, std::string> P;
292         typedef C::local_iterator I;
293         P a[] =
294         {
295             P(1, "one"),
296             P(2, "two"),
297             P(3, "three"),
298             P(4, "four"),
299             P(1, "four"),
300             P(2, "four"),
301         };
302         C c(a, a + sizeof(a)/sizeof(a[0]));
303         assert(c.bucket_count() >= 7);
304         C::size_type b = c.bucket(0);
305         I i = c.begin(b);
306         I j = c.end(b);
307         assert(std::distance(i, j) == 0);
308 
309         b = c.bucket(1);
310         i = c.begin(b);
311         j = c.end(b);
312         assert(std::distance(i, j) == 2);
313         assert(i->first == 1);
314         assert(i->second == "one");
315         ++i;
316         assert(i->first == 1);
317         assert(i->second == "four");
318 
319         b = c.bucket(2);
320         i = c.begin(b);
321         j = c.end(b);
322         assert(std::distance(i, j) == 2);
323         assert(i->first == 2);
324         assert(i->second == "two");
325         ++i;
326         assert(i->first == 2);
327         assert(i->second == "four");
328 
329         b = c.bucket(3);
330         i = c.begin(b);
331         j = c.end(b);
332         assert(std::distance(i, j) == 1);
333         assert(i->first == 3);
334         assert(i->second == "three");
335 
336         b = c.bucket(4);
337         i = c.begin(b);
338         j = c.end(b);
339         assert(std::distance(i, j) == 1);
340         assert(i->first == 4);
341         assert(i->second == "four");
342 
343         b = c.bucket(5);
344         i = c.begin(b);
345         j = c.end(b);
346         assert(std::distance(i, j) == 0);
347 
348         b = c.bucket(6);
349         i = c.begin(b);
350         j = c.end(b);
351         assert(std::distance(i, j) == 0);
352     }
353     {
354         typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>,
355                             min_allocator<std::pair<const int, std::string>>> C;
356         typedef std::pair<int, std::string> P;
357         typedef C::const_local_iterator I;
358         P a[] =
359         {
360             P(1, "one"),
361             P(2, "two"),
362             P(3, "three"),
363             P(4, "four"),
364             P(1, "four"),
365             P(2, "four"),
366         };
367         const C c(a, a + sizeof(a)/sizeof(a[0]));
368         assert(c.bucket_count() >= 7);
369         C::size_type b = c.bucket(0);
370         I i = c.begin(b);
371         I j = c.end(b);
372         assert(std::distance(i, j) == 0);
373 
374         b = c.bucket(1);
375         i = c.begin(b);
376         j = c.end(b);
377         assert(std::distance(i, j) == 2);
378         assert(i->first == 1);
379         assert(i->second == "one");
380         ++i;
381         assert(i->first == 1);
382         assert(i->second == "four");
383 
384         b = c.bucket(2);
385         i = c.begin(b);
386         j = c.end(b);
387         assert(std::distance(i, j) == 2);
388         assert(i->first == 2);
389         assert(i->second == "two");
390         ++i;
391         assert(i->first == 2);
392         assert(i->second == "four");
393 
394         b = c.bucket(3);
395         i = c.begin(b);
396         j = c.end(b);
397         assert(std::distance(i, j) == 1);
398         assert(i->first == 3);
399         assert(i->second == "three");
400 
401         b = c.bucket(4);
402         i = c.begin(b);
403         j = c.end(b);
404         assert(std::distance(i, j) == 1);
405         assert(i->first == 4);
406         assert(i->second == "four");
407 
408         b = c.bucket(5);
409         i = c.begin(b);
410         j = c.end(b);
411         assert(std::distance(i, j) == 0);
412 
413         b = c.bucket(6);
414         i = c.begin(b);
415         j = c.end(b);
416         assert(std::distance(i, j) == 0);
417     }
418     {
419         typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>,
420                             min_allocator<std::pair<const int, std::string>>> C;
421         typedef std::pair<int, std::string> P;
422         typedef C::const_local_iterator I;
423         P a[] =
424         {
425             P(1, "one"),
426             P(2, "two"),
427             P(3, "three"),
428             P(4, "four"),
429             P(1, "four"),
430             P(2, "four"),
431         };
432         C c(a, a + sizeof(a)/sizeof(a[0]));
433         assert(c.bucket_count() >= 7);
434         C::size_type b = c.bucket(0);
435         I i = c.cbegin(b);
436         I j = c.cend(b);
437         assert(std::distance(i, j) == 0);
438 
439         b = c.bucket(1);
440         i = c.cbegin(b);
441         j = c.cend(b);
442         assert(std::distance(i, j) == 2);
443         assert(i->first == 1);
444         assert(i->second == "one");
445         ++i;
446         assert(i->first == 1);
447         assert(i->second == "four");
448 
449         b = c.bucket(2);
450         i = c.cbegin(b);
451         j = c.cend(b);
452         assert(std::distance(i, j) == 2);
453         assert(i->first == 2);
454         assert(i->second == "two");
455         ++i;
456         assert(i->first == 2);
457         assert(i->second == "four");
458 
459         b = c.bucket(3);
460         i = c.cbegin(b);
461         j = c.cend(b);
462         assert(std::distance(i, j) == 1);
463         assert(i->first == 3);
464         assert(i->second == "three");
465 
466         b = c.bucket(4);
467         i = c.cbegin(b);
468         j = c.cend(b);
469         assert(std::distance(i, j) == 1);
470         assert(i->first == 4);
471         assert(i->second == "four");
472 
473         b = c.bucket(5);
474         i = c.cbegin(b);
475         j = c.cend(b);
476         assert(std::distance(i, j) == 0);
477 
478         b = c.bucket(6);
479         i = c.cbegin(b);
480         j = c.cend(b);
481         assert(std::distance(i, j) == 0);
482     }
483     {
484         typedef std::unordered_multimap<int, std::string, std::hash<int>, std::equal_to<int>,
485                             min_allocator<std::pair<const int, std::string>>> C;
486         typedef std::pair<int, std::string> P;
487         typedef C::const_local_iterator I;
488         P a[] =
489         {
490             P(1, "one"),
491             P(2, "two"),
492             P(3, "three"),
493             P(4, "four"),
494             P(1, "four"),
495             P(2, "four"),
496         };
497         const C c(a, a + sizeof(a)/sizeof(a[0]));
498         assert(c.bucket_count() >= 7);
499         C::size_type b = c.bucket(0);
500         I i = c.cbegin(b);
501         I j = c.cend(b);
502         assert(std::distance(i, j) == 0);
503 
504         b = c.bucket(1);
505         i = c.cbegin(b);
506         j = c.cend(b);
507         assert(std::distance(i, j) == 2);
508         assert(i->first == 1);
509         assert(i->second == "one");
510         ++i;
511         assert(i->first == 1);
512         assert(i->second == "four");
513 
514         b = c.bucket(2);
515         i = c.cbegin(b);
516         j = c.cend(b);
517         assert(std::distance(i, j) == 2);
518         assert(i->first == 2);
519         assert(i->second == "two");
520         ++i;
521         assert(i->first == 2);
522         assert(i->second == "four");
523 
524         b = c.bucket(3);
525         i = c.cbegin(b);
526         j = c.cend(b);
527         assert(std::distance(i, j) == 1);
528         assert(i->first == 3);
529         assert(i->second == "three");
530 
531         b = c.bucket(4);
532         i = c.cbegin(b);
533         j = c.cend(b);
534         assert(std::distance(i, j) == 1);
535         assert(i->first == 4);
536         assert(i->second == "four");
537 
538         b = c.bucket(5);
539         i = c.cbegin(b);
540         j = c.cend(b);
541         assert(std::distance(i, j) == 0);
542 
543         b = c.bucket(6);
544         i = c.cbegin(b);
545         j = c.cend(b);
546         assert(std::distance(i, j) == 0);
547     }
548 #endif
549 }
550