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 // <map>
11
12 // class map
13
14 // pair<iterator,iterator> equal_range(const key_type& k);
15 // pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
16
17 #include <map>
18 #include <cassert>
19
20 #include "min_allocator.h"
21 #include "private_constructor.hpp"
22 #include "is_transparent.h"
23
main()24 int main()
25 {
26 {
27 typedef std::pair<const int, double> V;
28 typedef std::map<int, double> M;
29 {
30 typedef std::pair<M::iterator, M::iterator> R;
31 V ar[] =
32 {
33 V(5, 5),
34 V(7, 6),
35 V(9, 7),
36 V(11, 8),
37 V(13, 9),
38 V(15, 10),
39 V(17, 11),
40 V(19, 12)
41 };
42 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
43 R r = m.equal_range(5);
44 assert(r.first == next(m.begin(), 0));
45 assert(r.second == next(m.begin(), 1));
46 r = m.equal_range(7);
47 assert(r.first == next(m.begin(), 1));
48 assert(r.second == next(m.begin(), 2));
49 r = m.equal_range(9);
50 assert(r.first == next(m.begin(), 2));
51 assert(r.second == next(m.begin(), 3));
52 r = m.equal_range(11);
53 assert(r.first == next(m.begin(), 3));
54 assert(r.second == next(m.begin(), 4));
55 r = m.equal_range(13);
56 assert(r.first == next(m.begin(), 4));
57 assert(r.second == next(m.begin(), 5));
58 r = m.equal_range(15);
59 assert(r.first == next(m.begin(), 5));
60 assert(r.second == next(m.begin(), 6));
61 r = m.equal_range(17);
62 assert(r.first == next(m.begin(), 6));
63 assert(r.second == next(m.begin(), 7));
64 r = m.equal_range(19);
65 assert(r.first == next(m.begin(), 7));
66 assert(r.second == next(m.begin(), 8));
67 r = m.equal_range(4);
68 assert(r.first == next(m.begin(), 0));
69 assert(r.second == next(m.begin(), 0));
70 r = m.equal_range(6);
71 assert(r.first == next(m.begin(), 1));
72 assert(r.second == next(m.begin(), 1));
73 r = m.equal_range(8);
74 assert(r.first == next(m.begin(), 2));
75 assert(r.second == next(m.begin(), 2));
76 r = m.equal_range(10);
77 assert(r.first == next(m.begin(), 3));
78 assert(r.second == next(m.begin(), 3));
79 r = m.equal_range(12);
80 assert(r.first == next(m.begin(), 4));
81 assert(r.second == next(m.begin(), 4));
82 r = m.equal_range(14);
83 assert(r.first == next(m.begin(), 5));
84 assert(r.second == next(m.begin(), 5));
85 r = m.equal_range(16);
86 assert(r.first == next(m.begin(), 6));
87 assert(r.second == next(m.begin(), 6));
88 r = m.equal_range(18);
89 assert(r.first == next(m.begin(), 7));
90 assert(r.second == next(m.begin(), 7));
91 r = m.equal_range(20);
92 assert(r.first == next(m.begin(), 8));
93 assert(r.second == next(m.begin(), 8));
94 }
95 {
96 typedef std::pair<M::const_iterator, M::const_iterator> R;
97 V ar[] =
98 {
99 V(5, 5),
100 V(7, 6),
101 V(9, 7),
102 V(11, 8),
103 V(13, 9),
104 V(15, 10),
105 V(17, 11),
106 V(19, 12)
107 };
108 const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
109 R r = m.equal_range(5);
110 assert(r.first == next(m.begin(), 0));
111 assert(r.second == next(m.begin(), 1));
112 r = m.equal_range(7);
113 assert(r.first == next(m.begin(), 1));
114 assert(r.second == next(m.begin(), 2));
115 r = m.equal_range(9);
116 assert(r.first == next(m.begin(), 2));
117 assert(r.second == next(m.begin(), 3));
118 r = m.equal_range(11);
119 assert(r.first == next(m.begin(), 3));
120 assert(r.second == next(m.begin(), 4));
121 r = m.equal_range(13);
122 assert(r.first == next(m.begin(), 4));
123 assert(r.second == next(m.begin(), 5));
124 r = m.equal_range(15);
125 assert(r.first == next(m.begin(), 5));
126 assert(r.second == next(m.begin(), 6));
127 r = m.equal_range(17);
128 assert(r.first == next(m.begin(), 6));
129 assert(r.second == next(m.begin(), 7));
130 r = m.equal_range(19);
131 assert(r.first == next(m.begin(), 7));
132 assert(r.second == next(m.begin(), 8));
133 r = m.equal_range(4);
134 assert(r.first == next(m.begin(), 0));
135 assert(r.second == next(m.begin(), 0));
136 r = m.equal_range(6);
137 assert(r.first == next(m.begin(), 1));
138 assert(r.second == next(m.begin(), 1));
139 r = m.equal_range(8);
140 assert(r.first == next(m.begin(), 2));
141 assert(r.second == next(m.begin(), 2));
142 r = m.equal_range(10);
143 assert(r.first == next(m.begin(), 3));
144 assert(r.second == next(m.begin(), 3));
145 r = m.equal_range(12);
146 assert(r.first == next(m.begin(), 4));
147 assert(r.second == next(m.begin(), 4));
148 r = m.equal_range(14);
149 assert(r.first == next(m.begin(), 5));
150 assert(r.second == next(m.begin(), 5));
151 r = m.equal_range(16);
152 assert(r.first == next(m.begin(), 6));
153 assert(r.second == next(m.begin(), 6));
154 r = m.equal_range(18);
155 assert(r.first == next(m.begin(), 7));
156 assert(r.second == next(m.begin(), 7));
157 r = m.equal_range(20);
158 assert(r.first == next(m.begin(), 8));
159 assert(r.second == next(m.begin(), 8));
160 }
161 }
162 #if __cplusplus >= 201103L
163 {
164 typedef std::pair<const int, double> V;
165 typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
166 {
167 typedef std::pair<M::iterator, M::iterator> R;
168 V ar[] =
169 {
170 V(5, 5),
171 V(7, 6),
172 V(9, 7),
173 V(11, 8),
174 V(13, 9),
175 V(15, 10),
176 V(17, 11),
177 V(19, 12)
178 };
179 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
180 R r = m.equal_range(5);
181 assert(r.first == next(m.begin(), 0));
182 assert(r.second == next(m.begin(), 1));
183 r = m.equal_range(7);
184 assert(r.first == next(m.begin(), 1));
185 assert(r.second == next(m.begin(), 2));
186 r = m.equal_range(9);
187 assert(r.first == next(m.begin(), 2));
188 assert(r.second == next(m.begin(), 3));
189 r = m.equal_range(11);
190 assert(r.first == next(m.begin(), 3));
191 assert(r.second == next(m.begin(), 4));
192 r = m.equal_range(13);
193 assert(r.first == next(m.begin(), 4));
194 assert(r.second == next(m.begin(), 5));
195 r = m.equal_range(15);
196 assert(r.first == next(m.begin(), 5));
197 assert(r.second == next(m.begin(), 6));
198 r = m.equal_range(17);
199 assert(r.first == next(m.begin(), 6));
200 assert(r.second == next(m.begin(), 7));
201 r = m.equal_range(19);
202 assert(r.first == next(m.begin(), 7));
203 assert(r.second == next(m.begin(), 8));
204 r = m.equal_range(4);
205 assert(r.first == next(m.begin(), 0));
206 assert(r.second == next(m.begin(), 0));
207 r = m.equal_range(6);
208 assert(r.first == next(m.begin(), 1));
209 assert(r.second == next(m.begin(), 1));
210 r = m.equal_range(8);
211 assert(r.first == next(m.begin(), 2));
212 assert(r.second == next(m.begin(), 2));
213 r = m.equal_range(10);
214 assert(r.first == next(m.begin(), 3));
215 assert(r.second == next(m.begin(), 3));
216 r = m.equal_range(12);
217 assert(r.first == next(m.begin(), 4));
218 assert(r.second == next(m.begin(), 4));
219 r = m.equal_range(14);
220 assert(r.first == next(m.begin(), 5));
221 assert(r.second == next(m.begin(), 5));
222 r = m.equal_range(16);
223 assert(r.first == next(m.begin(), 6));
224 assert(r.second == next(m.begin(), 6));
225 r = m.equal_range(18);
226 assert(r.first == next(m.begin(), 7));
227 assert(r.second == next(m.begin(), 7));
228 r = m.equal_range(20);
229 assert(r.first == next(m.begin(), 8));
230 assert(r.second == next(m.begin(), 8));
231 }
232 {
233 typedef std::pair<M::const_iterator, M::const_iterator> R;
234 V ar[] =
235 {
236 V(5, 5),
237 V(7, 6),
238 V(9, 7),
239 V(11, 8),
240 V(13, 9),
241 V(15, 10),
242 V(17, 11),
243 V(19, 12)
244 };
245 const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
246 R r = m.equal_range(5);
247 assert(r.first == next(m.begin(), 0));
248 assert(r.second == next(m.begin(), 1));
249 r = m.equal_range(7);
250 assert(r.first == next(m.begin(), 1));
251 assert(r.second == next(m.begin(), 2));
252 r = m.equal_range(9);
253 assert(r.first == next(m.begin(), 2));
254 assert(r.second == next(m.begin(), 3));
255 r = m.equal_range(11);
256 assert(r.first == next(m.begin(), 3));
257 assert(r.second == next(m.begin(), 4));
258 r = m.equal_range(13);
259 assert(r.first == next(m.begin(), 4));
260 assert(r.second == next(m.begin(), 5));
261 r = m.equal_range(15);
262 assert(r.first == next(m.begin(), 5));
263 assert(r.second == next(m.begin(), 6));
264 r = m.equal_range(17);
265 assert(r.first == next(m.begin(), 6));
266 assert(r.second == next(m.begin(), 7));
267 r = m.equal_range(19);
268 assert(r.first == next(m.begin(), 7));
269 assert(r.second == next(m.begin(), 8));
270 r = m.equal_range(4);
271 assert(r.first == next(m.begin(), 0));
272 assert(r.second == next(m.begin(), 0));
273 r = m.equal_range(6);
274 assert(r.first == next(m.begin(), 1));
275 assert(r.second == next(m.begin(), 1));
276 r = m.equal_range(8);
277 assert(r.first == next(m.begin(), 2));
278 assert(r.second == next(m.begin(), 2));
279 r = m.equal_range(10);
280 assert(r.first == next(m.begin(), 3));
281 assert(r.second == next(m.begin(), 3));
282 r = m.equal_range(12);
283 assert(r.first == next(m.begin(), 4));
284 assert(r.second == next(m.begin(), 4));
285 r = m.equal_range(14);
286 assert(r.first == next(m.begin(), 5));
287 assert(r.second == next(m.begin(), 5));
288 r = m.equal_range(16);
289 assert(r.first == next(m.begin(), 6));
290 assert(r.second == next(m.begin(), 6));
291 r = m.equal_range(18);
292 assert(r.first == next(m.begin(), 7));
293 assert(r.second == next(m.begin(), 7));
294 r = m.equal_range(20);
295 assert(r.first == next(m.begin(), 8));
296 assert(r.second == next(m.begin(), 8));
297 }
298 }
299 #endif
300 #if _LIBCPP_STD_VER > 11
301 {
302 typedef std::pair<const int, double> V;
303 typedef std::map<int, double, std::less<>> M;
304 typedef std::pair<M::iterator, M::iterator> R;
305
306 V ar[] =
307 {
308 V(5, 5),
309 V(7, 6),
310 V(9, 7),
311 V(11, 8),
312 V(13, 9),
313 V(15, 10),
314 V(17, 11),
315 V(19, 12)
316 };
317 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
318 R r = m.equal_range(5);
319 assert(r.first == next(m.begin(), 0));
320 assert(r.second == next(m.begin(), 1));
321 r = m.equal_range(7);
322 assert(r.first == next(m.begin(), 1));
323 assert(r.second == next(m.begin(), 2));
324 r = m.equal_range(9);
325 assert(r.first == next(m.begin(), 2));
326 assert(r.second == next(m.begin(), 3));
327 r = m.equal_range(11);
328 assert(r.first == next(m.begin(), 3));
329 assert(r.second == next(m.begin(), 4));
330 r = m.equal_range(13);
331 assert(r.first == next(m.begin(), 4));
332 assert(r.second == next(m.begin(), 5));
333 r = m.equal_range(15);
334 assert(r.first == next(m.begin(), 5));
335 assert(r.second == next(m.begin(), 6));
336 r = m.equal_range(17);
337 assert(r.first == next(m.begin(), 6));
338 assert(r.second == next(m.begin(), 7));
339 r = m.equal_range(19);
340 assert(r.first == next(m.begin(), 7));
341 assert(r.second == next(m.begin(), 8));
342 r = m.equal_range(4);
343 assert(r.first == next(m.begin(), 0));
344 assert(r.second == next(m.begin(), 0));
345 r = m.equal_range(6);
346 assert(r.first == next(m.begin(), 1));
347 assert(r.second == next(m.begin(), 1));
348 r = m.equal_range(8);
349 assert(r.first == next(m.begin(), 2));
350 assert(r.second == next(m.begin(), 2));
351 r = m.equal_range(10);
352 assert(r.first == next(m.begin(), 3));
353 assert(r.second == next(m.begin(), 3));
354 r = m.equal_range(12);
355 assert(r.first == next(m.begin(), 4));
356 assert(r.second == next(m.begin(), 4));
357 r = m.equal_range(14);
358 assert(r.first == next(m.begin(), 5));
359 assert(r.second == next(m.begin(), 5));
360 r = m.equal_range(16);
361 assert(r.first == next(m.begin(), 6));
362 assert(r.second == next(m.begin(), 6));
363 r = m.equal_range(18);
364 assert(r.first == next(m.begin(), 7));
365 assert(r.second == next(m.begin(), 7));
366 r = m.equal_range(20);
367 assert(r.first == next(m.begin(), 8));
368 assert(r.second == next(m.begin(), 8));
369
370 r = m.equal_range(C2Int(5));
371 assert(r.first == next(m.begin(), 0));
372 assert(r.second == next(m.begin(), 1));
373 r = m.equal_range(C2Int(7));
374 assert(r.first == next(m.begin(), 1));
375 assert(r.second == next(m.begin(), 2));
376 r = m.equal_range(C2Int(9));
377 assert(r.first == next(m.begin(), 2));
378 assert(r.second == next(m.begin(), 3));
379 r = m.equal_range(C2Int(11));
380 assert(r.first == next(m.begin(), 3));
381 assert(r.second == next(m.begin(), 4));
382 r = m.equal_range(C2Int(13));
383 assert(r.first == next(m.begin(), 4));
384 assert(r.second == next(m.begin(), 5));
385 r = m.equal_range(C2Int(15));
386 assert(r.first == next(m.begin(), 5));
387 assert(r.second == next(m.begin(), 6));
388 r = m.equal_range(C2Int(17));
389 assert(r.first == next(m.begin(), 6));
390 assert(r.second == next(m.begin(), 7));
391 r = m.equal_range(C2Int(19));
392 assert(r.first == next(m.begin(), 7));
393 assert(r.second == next(m.begin(), 8));
394 r = m.equal_range(C2Int(4));
395 assert(r.first == next(m.begin(), 0));
396 assert(r.second == next(m.begin(), 0));
397 r = m.equal_range(C2Int(6));
398 assert(r.first == next(m.begin(), 1));
399 assert(r.second == next(m.begin(), 1));
400 r = m.equal_range(C2Int(8));
401 assert(r.first == next(m.begin(), 2));
402 assert(r.second == next(m.begin(), 2));
403 r = m.equal_range(C2Int(10));
404 assert(r.first == next(m.begin(), 3));
405 assert(r.second == next(m.begin(), 3));
406 r = m.equal_range(C2Int(12));
407 assert(r.first == next(m.begin(), 4));
408 assert(r.second == next(m.begin(), 4));
409 r = m.equal_range(C2Int(14));
410 assert(r.first == next(m.begin(), 5));
411 assert(r.second == next(m.begin(), 5));
412 r = m.equal_range(C2Int(16));
413 assert(r.first == next(m.begin(), 6));
414 assert(r.second == next(m.begin(), 6));
415 r = m.equal_range(C2Int(18));
416 assert(r.first == next(m.begin(), 7));
417 assert(r.second == next(m.begin(), 7));
418 r = m.equal_range(C2Int(20));
419 assert(r.first == next(m.begin(), 8));
420 assert(r.second == next(m.begin(), 8));
421 }
422 {
423 typedef PrivateConstructor PC;
424 typedef std::map<PC, double, std::less<>> M;
425 typedef std::pair<M::iterator, M::iterator> R;
426
427 M m;
428 m [ PC::make(5) ] = 5;
429 m [ PC::make(7) ] = 6;
430 m [ PC::make(9) ] = 7;
431 m [ PC::make(11) ] = 8;
432 m [ PC::make(13) ] = 9;
433 m [ PC::make(15) ] = 10;
434 m [ PC::make(17) ] = 11;
435 m [ PC::make(19) ] = 12;
436
437 R r = m.equal_range(5);
438 assert(r.first == next(m.begin(), 0));
439 assert(r.second == next(m.begin(), 1));
440 r = m.equal_range(7);
441 assert(r.first == next(m.begin(), 1));
442 assert(r.second == next(m.begin(), 2));
443 r = m.equal_range(9);
444 assert(r.first == next(m.begin(), 2));
445 assert(r.second == next(m.begin(), 3));
446 r = m.equal_range(11);
447 assert(r.first == next(m.begin(), 3));
448 assert(r.second == next(m.begin(), 4));
449 r = m.equal_range(13);
450 assert(r.first == next(m.begin(), 4));
451 assert(r.second == next(m.begin(), 5));
452 r = m.equal_range(15);
453 assert(r.first == next(m.begin(), 5));
454 assert(r.second == next(m.begin(), 6));
455 r = m.equal_range(17);
456 assert(r.first == next(m.begin(), 6));
457 assert(r.second == next(m.begin(), 7));
458 r = m.equal_range(19);
459 assert(r.first == next(m.begin(), 7));
460 assert(r.second == next(m.begin(), 8));
461 r = m.equal_range(4);
462 assert(r.first == next(m.begin(), 0));
463 assert(r.second == next(m.begin(), 0));
464 r = m.equal_range(6);
465 assert(r.first == next(m.begin(), 1));
466 assert(r.second == next(m.begin(), 1));
467 r = m.equal_range(8);
468 assert(r.first == next(m.begin(), 2));
469 assert(r.second == next(m.begin(), 2));
470 r = m.equal_range(10);
471 assert(r.first == next(m.begin(), 3));
472 assert(r.second == next(m.begin(), 3));
473 r = m.equal_range(12);
474 assert(r.first == next(m.begin(), 4));
475 assert(r.second == next(m.begin(), 4));
476 r = m.equal_range(14);
477 assert(r.first == next(m.begin(), 5));
478 assert(r.second == next(m.begin(), 5));
479 r = m.equal_range(16);
480 assert(r.first == next(m.begin(), 6));
481 assert(r.second == next(m.begin(), 6));
482 r = m.equal_range(18);
483 assert(r.first == next(m.begin(), 7));
484 assert(r.second == next(m.begin(), 7));
485 r = m.equal_range(20);
486 assert(r.first == next(m.begin(), 8));
487 assert(r.second == next(m.begin(), 8));
488 }
489 #endif
490 }
491