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_map
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_map<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() >= 5);
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) == 1);
55         assert(i->first == 1);
56         assert(i->second == "one");
57 
58         b = c.bucket(2);
59         i = c.begin(b);
60         j = c.end(b);
61         assert(std::distance(i, j) == 1);
62         assert(i->first == 2);
63         assert(i->second == "two");
64 
65         b = c.bucket(3);
66         i = c.begin(b);
67         j = c.end(b);
68         assert(std::distance(i, j) == 1);
69         assert(i->first == 3);
70         assert(i->second == "three");
71 
72         b = c.bucket(4);
73         i = c.begin(b);
74         j = c.end(b);
75         assert(std::distance(i, j) == 1);
76         assert(i->first == 4);
77         assert(i->second == "four");
78     }
79     {
80         typedef std::unordered_map<int, std::string> C;
81         typedef std::pair<int, std::string> P;
82         typedef C::const_local_iterator I;
83         P a[] =
84         {
85             P(1, "one"),
86             P(2, "two"),
87             P(3, "three"),
88             P(4, "four"),
89             P(1, "four"),
90             P(2, "four"),
91         };
92         const C c(a, a + sizeof(a)/sizeof(a[0]));
93         assert(c.bucket_count() >= 5);
94         C::size_type b = c.bucket(0);
95         I i = c.begin(b);
96         I j = c.end(b);
97         assert(std::distance(i, j) == 0);
98 
99         b = c.bucket(1);
100         i = c.begin(b);
101         j = c.end(b);
102         assert(std::distance(i, j) == 1);
103         assert(i->first == 1);
104         assert(i->second == "one");
105 
106         b = c.bucket(2);
107         i = c.begin(b);
108         j = c.end(b);
109         assert(std::distance(i, j) == 1);
110         assert(i->first == 2);
111         assert(i->second == "two");
112 
113         b = c.bucket(3);
114         i = c.begin(b);
115         j = c.end(b);
116         assert(std::distance(i, j) == 1);
117         assert(i->first == 3);
118         assert(i->second == "three");
119 
120         b = c.bucket(4);
121         i = c.begin(b);
122         j = c.end(b);
123         assert(std::distance(i, j) == 1);
124         assert(i->first == 4);
125         assert(i->second == "four");
126     }
127     {
128         typedef std::unordered_map<int, std::string> C;
129         typedef std::pair<int, std::string> P;
130         typedef C::const_local_iterator I;
131         P a[] =
132         {
133             P(1, "one"),
134             P(2, "two"),
135             P(3, "three"),
136             P(4, "four"),
137             P(1, "four"),
138             P(2, "four"),
139         };
140         C c(a, a + sizeof(a)/sizeof(a[0]));
141         assert(c.bucket_count() >= 5);
142         C::size_type b = c.bucket(0);
143         I i = c.cbegin(b);
144         I j = c.cend(b);
145         assert(std::distance(i, j) == 0);
146 
147         b = c.bucket(1);
148         i = c.cbegin(b);
149         j = c.cend(b);
150         assert(std::distance(i, j) == 1);
151         assert(i->first == 1);
152         assert(i->second == "one");
153 
154         b = c.bucket(2);
155         i = c.cbegin(b);
156         j = c.cend(b);
157         assert(std::distance(i, j) == 1);
158         assert(i->first == 2);
159         assert(i->second == "two");
160 
161         b = c.bucket(3);
162         i = c.cbegin(b);
163         j = c.cend(b);
164         assert(std::distance(i, j) == 1);
165         assert(i->first == 3);
166         assert(i->second == "three");
167 
168         b = c.bucket(4);
169         i = c.cbegin(b);
170         j = c.cend(b);
171         assert(std::distance(i, j) == 1);
172         assert(i->first == 4);
173         assert(i->second == "four");
174     }
175     {
176         typedef std::unordered_map<int, std::string> C;
177         typedef std::pair<int, std::string> P;
178         typedef C::const_local_iterator I;
179         P a[] =
180         {
181             P(1, "one"),
182             P(2, "two"),
183             P(3, "three"),
184             P(4, "four"),
185             P(1, "four"),
186             P(2, "four"),
187         };
188         const C c(a, a + sizeof(a)/sizeof(a[0]));
189         assert(c.bucket_count() >= 5);
190         C::size_type b = c.bucket(0);
191         I i = c.cbegin(b);
192         I j = c.cend(b);
193         assert(std::distance(i, j) == 0);
194 
195         b = c.bucket(1);
196         i = c.cbegin(b);
197         j = c.cend(b);
198         assert(std::distance(i, j) == 1);
199         assert(i->first == 1);
200         assert(i->second == "one");
201 
202         b = c.bucket(2);
203         i = c.cbegin(b);
204         j = c.cend(b);
205         assert(std::distance(i, j) == 1);
206         assert(i->first == 2);
207         assert(i->second == "two");
208 
209         b = c.bucket(3);
210         i = c.cbegin(b);
211         j = c.cend(b);
212         assert(std::distance(i, j) == 1);
213         assert(i->first == 3);
214         assert(i->second == "three");
215 
216         b = c.bucket(4);
217         i = c.cbegin(b);
218         j = c.cend(b);
219         assert(std::distance(i, j) == 1);
220         assert(i->first == 4);
221         assert(i->second == "four");
222     }
223 #if __cplusplus >= 201103L
224     {
225         typedef std::unordered_map<int, std::string, std::hash<int>, std::equal_to<int>,
226                             min_allocator<std::pair<const int, std::string>>> C;
227         typedef std::pair<int, std::string> P;
228         typedef C::local_iterator I;
229         P a[] =
230         {
231             P(1, "one"),
232             P(2, "two"),
233             P(3, "three"),
234             P(4, "four"),
235             P(1, "four"),
236             P(2, "four"),
237         };
238         C c(a, a + sizeof(a)/sizeof(a[0]));
239         assert(c.bucket_count() >= 5);
240         C::size_type b = c.bucket(0);
241         I i = c.begin(b);
242         I j = c.end(b);
243         assert(std::distance(i, j) == 0);
244 
245         b = c.bucket(1);
246         i = c.begin(b);
247         j = c.end(b);
248         assert(std::distance(i, j) == 1);
249         assert(i->first == 1);
250         assert(i->second == "one");
251 
252         b = c.bucket(2);
253         i = c.begin(b);
254         j = c.end(b);
255         assert(std::distance(i, j) == 1);
256         assert(i->first == 2);
257         assert(i->second == "two");
258 
259         b = c.bucket(3);
260         i = c.begin(b);
261         j = c.end(b);
262         assert(std::distance(i, j) == 1);
263         assert(i->first == 3);
264         assert(i->second == "three");
265 
266         b = c.bucket(4);
267         i = c.begin(b);
268         j = c.end(b);
269         assert(std::distance(i, j) == 1);
270         assert(i->first == 4);
271         assert(i->second == "four");
272     }
273     {
274         typedef std::unordered_map<int, std::string, std::hash<int>, std::equal_to<int>,
275                             min_allocator<std::pair<const int, std::string>>> C;
276         typedef std::pair<int, std::string> P;
277         typedef C::const_local_iterator I;
278         P a[] =
279         {
280             P(1, "one"),
281             P(2, "two"),
282             P(3, "three"),
283             P(4, "four"),
284             P(1, "four"),
285             P(2, "four"),
286         };
287         const C c(a, a + sizeof(a)/sizeof(a[0]));
288         assert(c.bucket_count() >= 5);
289         C::size_type b = c.bucket(0);
290         I i = c.begin(b);
291         I j = c.end(b);
292         assert(std::distance(i, j) == 0);
293 
294         b = c.bucket(1);
295         i = c.begin(b);
296         j = c.end(b);
297         assert(std::distance(i, j) == 1);
298         assert(i->first == 1);
299         assert(i->second == "one");
300 
301         b = c.bucket(2);
302         i = c.begin(b);
303         j = c.end(b);
304         assert(std::distance(i, j) == 1);
305         assert(i->first == 2);
306         assert(i->second == "two");
307 
308         b = c.bucket(3);
309         i = c.begin(b);
310         j = c.end(b);
311         assert(std::distance(i, j) == 1);
312         assert(i->first == 3);
313         assert(i->second == "three");
314 
315         b = c.bucket(4);
316         i = c.begin(b);
317         j = c.end(b);
318         assert(std::distance(i, j) == 1);
319         assert(i->first == 4);
320         assert(i->second == "four");
321     }
322     {
323         typedef std::unordered_map<int, std::string, std::hash<int>, std::equal_to<int>,
324                             min_allocator<std::pair<const int, std::string>>> C;
325         typedef std::pair<int, std::string> P;
326         typedef C::const_local_iterator I;
327         P a[] =
328         {
329             P(1, "one"),
330             P(2, "two"),
331             P(3, "three"),
332             P(4, "four"),
333             P(1, "four"),
334             P(2, "four"),
335         };
336         C c(a, a + sizeof(a)/sizeof(a[0]));
337         assert(c.bucket_count() >= 5);
338         C::size_type b = c.bucket(0);
339         I i = c.cbegin(b);
340         I j = c.cend(b);
341         assert(std::distance(i, j) == 0);
342 
343         b = c.bucket(1);
344         i = c.cbegin(b);
345         j = c.cend(b);
346         assert(std::distance(i, j) == 1);
347         assert(i->first == 1);
348         assert(i->second == "one");
349 
350         b = c.bucket(2);
351         i = c.cbegin(b);
352         j = c.cend(b);
353         assert(std::distance(i, j) == 1);
354         assert(i->first == 2);
355         assert(i->second == "two");
356 
357         b = c.bucket(3);
358         i = c.cbegin(b);
359         j = c.cend(b);
360         assert(std::distance(i, j) == 1);
361         assert(i->first == 3);
362         assert(i->second == "three");
363 
364         b = c.bucket(4);
365         i = c.cbegin(b);
366         j = c.cend(b);
367         assert(std::distance(i, j) == 1);
368         assert(i->first == 4);
369         assert(i->second == "four");
370     }
371     {
372         typedef std::unordered_map<int, std::string, std::hash<int>, std::equal_to<int>,
373                             min_allocator<std::pair<const int, std::string>>> C;
374         typedef std::pair<int, std::string> P;
375         typedef C::const_local_iterator I;
376         P a[] =
377         {
378             P(1, "one"),
379             P(2, "two"),
380             P(3, "three"),
381             P(4, "four"),
382             P(1, "four"),
383             P(2, "four"),
384         };
385         const C c(a, a + sizeof(a)/sizeof(a[0]));
386         assert(c.bucket_count() >= 5);
387         C::size_type b = c.bucket(0);
388         I i = c.cbegin(b);
389         I j = c.cend(b);
390         assert(std::distance(i, j) == 0);
391 
392         b = c.bucket(1);
393         i = c.cbegin(b);
394         j = c.cend(b);
395         assert(std::distance(i, j) == 1);
396         assert(i->first == 1);
397         assert(i->second == "one");
398 
399         b = c.bucket(2);
400         i = c.cbegin(b);
401         j = c.cend(b);
402         assert(std::distance(i, j) == 1);
403         assert(i->first == 2);
404         assert(i->second == "two");
405 
406         b = c.bucket(3);
407         i = c.cbegin(b);
408         j = c.cend(b);
409         assert(std::distance(i, j) == 1);
410         assert(i->first == 3);
411         assert(i->second == "three");
412 
413         b = c.bucket(4);
414         i = c.cbegin(b);
415         j = c.cend(b);
416         assert(std::distance(i, j) == 1);
417         assert(i->first == 4);
418         assert(i->second == "four");
419     }
420 #endif
421 }
422