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