local_iterators.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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
27int main()
28{
29    {
30        typedef std::unordered_map<int, std::string> C;
31        typedef std::pair<int, std::string> P;
32        typedef C::local_iterator I;
33        P a[] =
34        {
35            P(1, "one"),
36            P(2, "two"),
37            P(3, "three"),
38            P(4, "four"),
39            P(1, "four"),
40            P(2, "four"),
41        };
42        C c(a, a + sizeof(a)/sizeof(a[0]));
43        assert(c.bucket_count() >= 5);
44        C::size_type b = c.bucket(0);
45        I i = c.begin(b);
46        I j = c.end(b);
47        assert(std::distance(i, j) == 0);
48
49        b = c.bucket(1);
50        i = c.begin(b);
51        j = c.end(b);
52        assert(std::distance(i, j) == 1);
53        assert(i->first == 1);
54        assert(i->second == "one");
55
56        b = c.bucket(2);
57        i = c.begin(b);
58        j = c.end(b);
59        assert(std::distance(i, j) == 1);
60        assert(i->first == 2);
61        assert(i->second == "two");
62
63        b = c.bucket(3);
64        i = c.begin(b);
65        j = c.end(b);
66        assert(std::distance(i, j) == 1);
67        assert(i->first == 3);
68        assert(i->second == "three");
69
70        b = c.bucket(4);
71        i = c.begin(b);
72        j = c.end(b);
73        assert(std::distance(i, j) == 1);
74        assert(i->first == 4);
75        assert(i->second == "four");
76    }
77    {
78        typedef std::unordered_map<int, std::string> C;
79        typedef std::pair<int, std::string> P;
80        typedef C::const_local_iterator I;
81        P a[] =
82        {
83            P(1, "one"),
84            P(2, "two"),
85            P(3, "three"),
86            P(4, "four"),
87            P(1, "four"),
88            P(2, "four"),
89        };
90        const C c(a, a + sizeof(a)/sizeof(a[0]));
91        assert(c.bucket_count() >= 5);
92        C::size_type b = c.bucket(0);
93        I i = c.begin(b);
94        I j = c.end(b);
95        assert(std::distance(i, j) == 0);
96
97        b = c.bucket(1);
98        i = c.begin(b);
99        j = c.end(b);
100        assert(std::distance(i, j) == 1);
101        assert(i->first == 1);
102        assert(i->second == "one");
103
104        b = c.bucket(2);
105        i = c.begin(b);
106        j = c.end(b);
107        assert(std::distance(i, j) == 1);
108        assert(i->first == 2);
109        assert(i->second == "two");
110
111        b = c.bucket(3);
112        i = c.begin(b);
113        j = c.end(b);
114        assert(std::distance(i, j) == 1);
115        assert(i->first == 3);
116        assert(i->second == "three");
117
118        b = c.bucket(4);
119        i = c.begin(b);
120        j = c.end(b);
121        assert(std::distance(i, j) == 1);
122        assert(i->first == 4);
123        assert(i->second == "four");
124    }
125    {
126        typedef std::unordered_map<int, std::string> C;
127        typedef std::pair<int, std::string> P;
128        typedef C::const_local_iterator I;
129        P a[] =
130        {
131            P(1, "one"),
132            P(2, "two"),
133            P(3, "three"),
134            P(4, "four"),
135            P(1, "four"),
136            P(2, "four"),
137        };
138        C c(a, a + sizeof(a)/sizeof(a[0]));
139        assert(c.bucket_count() >= 5);
140        C::size_type b = c.bucket(0);
141        I i = c.cbegin(b);
142        I j = c.cend(b);
143        assert(std::distance(i, j) == 0);
144
145        b = c.bucket(1);
146        i = c.cbegin(b);
147        j = c.cend(b);
148        assert(std::distance(i, j) == 1);
149        assert(i->first == 1);
150        assert(i->second == "one");
151
152        b = c.bucket(2);
153        i = c.cbegin(b);
154        j = c.cend(b);
155        assert(std::distance(i, j) == 1);
156        assert(i->first == 2);
157        assert(i->second == "two");
158
159        b = c.bucket(3);
160        i = c.cbegin(b);
161        j = c.cend(b);
162        assert(std::distance(i, j) == 1);
163        assert(i->first == 3);
164        assert(i->second == "three");
165
166        b = c.bucket(4);
167        i = c.cbegin(b);
168        j = c.cend(b);
169        assert(std::distance(i, j) == 1);
170        assert(i->first == 4);
171        assert(i->second == "four");
172    }
173    {
174        typedef std::unordered_map<int, std::string> C;
175        typedef std::pair<int, std::string> P;
176        typedef C::const_local_iterator I;
177        P a[] =
178        {
179            P(1, "one"),
180            P(2, "two"),
181            P(3, "three"),
182            P(4, "four"),
183            P(1, "four"),
184            P(2, "four"),
185        };
186        const C c(a, a + sizeof(a)/sizeof(a[0]));
187        assert(c.bucket_count() >= 5);
188        C::size_type b = c.bucket(0);
189        I i = c.cbegin(b);
190        I j = c.cend(b);
191        assert(std::distance(i, j) == 0);
192
193        b = c.bucket(1);
194        i = c.cbegin(b);
195        j = c.cend(b);
196        assert(std::distance(i, j) == 1);
197        assert(i->first == 1);
198        assert(i->second == "one");
199
200        b = c.bucket(2);
201        i = c.cbegin(b);
202        j = c.cend(b);
203        assert(std::distance(i, j) == 1);
204        assert(i->first == 2);
205        assert(i->second == "two");
206
207        b = c.bucket(3);
208        i = c.cbegin(b);
209        j = c.cend(b);
210        assert(std::distance(i, j) == 1);
211        assert(i->first == 3);
212        assert(i->second == "three");
213
214        b = c.bucket(4);
215        i = c.cbegin(b);
216        j = c.cend(b);
217        assert(std::distance(i, j) == 1);
218        assert(i->first == 4);
219        assert(i->second == "four");
220    }
221}
222