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 //       iterator upper_bound(const key_type& k);
15 // const_iterator upper_bound(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 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.upper_bound(5);
43         assert(r == next(m.begin(), 1));
44         r = m.upper_bound(7);
45         assert(r == next(m.begin(), 2));
46         r = m.upper_bound(9);
47         assert(r == next(m.begin(), 3));
48         r = m.upper_bound(11);
49         assert(r == next(m.begin(), 4));
50         r = m.upper_bound(13);
51         assert(r == next(m.begin(), 5));
52         r = m.upper_bound(15);
53         assert(r == next(m.begin(), 6));
54         r = m.upper_bound(17);
55         assert(r == next(m.begin(), 7));
56         r = m.upper_bound(19);
57         assert(r == next(m.begin(), 8));
58         r = m.upper_bound(4);
59         assert(r == next(m.begin(), 0));
60         r = m.upper_bound(6);
61         assert(r == next(m.begin(), 1));
62         r = m.upper_bound(8);
63         assert(r == next(m.begin(), 2));
64         r = m.upper_bound(10);
65         assert(r == next(m.begin(), 3));
66         r = m.upper_bound(12);
67         assert(r == next(m.begin(), 4));
68         r = m.upper_bound(14);
69         assert(r == next(m.begin(), 5));
70         r = m.upper_bound(16);
71         assert(r == next(m.begin(), 6));
72         r = m.upper_bound(18);
73         assert(r == next(m.begin(), 7));
74         r = m.upper_bound(20);
75         assert(r == next(m.begin(), 8));
76     }
77     {
78         typedef M::const_iterator R;
79         V ar[] =
80         {
81             V(5, 5),
82             V(7, 6),
83             V(9, 7),
84             V(11, 8),
85             V(13, 9),
86             V(15, 10),
87             V(17, 11),
88             V(19, 12)
89         };
90         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
91         R r = m.upper_bound(5);
92         assert(r == next(m.begin(), 1));
93         r = m.upper_bound(7);
94         assert(r == next(m.begin(), 2));
95         r = m.upper_bound(9);
96         assert(r == next(m.begin(), 3));
97         r = m.upper_bound(11);
98         assert(r == next(m.begin(), 4));
99         r = m.upper_bound(13);
100         assert(r == next(m.begin(), 5));
101         r = m.upper_bound(15);
102         assert(r == next(m.begin(), 6));
103         r = m.upper_bound(17);
104         assert(r == next(m.begin(), 7));
105         r = m.upper_bound(19);
106         assert(r == next(m.begin(), 8));
107         r = m.upper_bound(4);
108         assert(r == next(m.begin(), 0));
109         r = m.upper_bound(6);
110         assert(r == next(m.begin(), 1));
111         r = m.upper_bound(8);
112         assert(r == next(m.begin(), 2));
113         r = m.upper_bound(10);
114         assert(r == next(m.begin(), 3));
115         r = m.upper_bound(12);
116         assert(r == next(m.begin(), 4));
117         r = m.upper_bound(14);
118         assert(r == next(m.begin(), 5));
119         r = m.upper_bound(16);
120         assert(r == next(m.begin(), 6));
121         r = m.upper_bound(18);
122         assert(r == next(m.begin(), 7));
123         r = m.upper_bound(20);
124         assert(r == next(m.begin(), 8));
125     }
126     }
127 #if __cplusplus >= 201103L
128     {
129     typedef std::pair<const int, double> V;
130     typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
131     {
132         typedef M::iterator R;
133         V ar[] =
134         {
135             V(5, 5),
136             V(7, 6),
137             V(9, 7),
138             V(11, 8),
139             V(13, 9),
140             V(15, 10),
141             V(17, 11),
142             V(19, 12)
143         };
144         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
145         R r = m.upper_bound(5);
146         assert(r == next(m.begin(), 1));
147         r = m.upper_bound(7);
148         assert(r == next(m.begin(), 2));
149         r = m.upper_bound(9);
150         assert(r == next(m.begin(), 3));
151         r = m.upper_bound(11);
152         assert(r == next(m.begin(), 4));
153         r = m.upper_bound(13);
154         assert(r == next(m.begin(), 5));
155         r = m.upper_bound(15);
156         assert(r == next(m.begin(), 6));
157         r = m.upper_bound(17);
158         assert(r == next(m.begin(), 7));
159         r = m.upper_bound(19);
160         assert(r == next(m.begin(), 8));
161         r = m.upper_bound(4);
162         assert(r == next(m.begin(), 0));
163         r = m.upper_bound(6);
164         assert(r == next(m.begin(), 1));
165         r = m.upper_bound(8);
166         assert(r == next(m.begin(), 2));
167         r = m.upper_bound(10);
168         assert(r == next(m.begin(), 3));
169         r = m.upper_bound(12);
170         assert(r == next(m.begin(), 4));
171         r = m.upper_bound(14);
172         assert(r == next(m.begin(), 5));
173         r = m.upper_bound(16);
174         assert(r == next(m.begin(), 6));
175         r = m.upper_bound(18);
176         assert(r == next(m.begin(), 7));
177         r = m.upper_bound(20);
178         assert(r == next(m.begin(), 8));
179     }
180     {
181         typedef M::const_iterator R;
182         V ar[] =
183         {
184             V(5, 5),
185             V(7, 6),
186             V(9, 7),
187             V(11, 8),
188             V(13, 9),
189             V(15, 10),
190             V(17, 11),
191             V(19, 12)
192         };
193         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
194         R r = m.upper_bound(5);
195         assert(r == next(m.begin(), 1));
196         r = m.upper_bound(7);
197         assert(r == next(m.begin(), 2));
198         r = m.upper_bound(9);
199         assert(r == next(m.begin(), 3));
200         r = m.upper_bound(11);
201         assert(r == next(m.begin(), 4));
202         r = m.upper_bound(13);
203         assert(r == next(m.begin(), 5));
204         r = m.upper_bound(15);
205         assert(r == next(m.begin(), 6));
206         r = m.upper_bound(17);
207         assert(r == next(m.begin(), 7));
208         r = m.upper_bound(19);
209         assert(r == next(m.begin(), 8));
210         r = m.upper_bound(4);
211         assert(r == next(m.begin(), 0));
212         r = m.upper_bound(6);
213         assert(r == next(m.begin(), 1));
214         r = m.upper_bound(8);
215         assert(r == next(m.begin(), 2));
216         r = m.upper_bound(10);
217         assert(r == next(m.begin(), 3));
218         r = m.upper_bound(12);
219         assert(r == next(m.begin(), 4));
220         r = m.upper_bound(14);
221         assert(r == next(m.begin(), 5));
222         r = m.upper_bound(16);
223         assert(r == next(m.begin(), 6));
224         r = m.upper_bound(18);
225         assert(r == next(m.begin(), 7));
226         r = m.upper_bound(20);
227         assert(r == next(m.begin(), 8));
228     }
229     }
230 #endif
231 #if _LIBCPP_STD_VER > 11
232     {
233     typedef std::pair<const int, double> V;
234     typedef std::map<int, double, std::less<>> M;
235     typedef M::iterator R;
236     V ar[] =
237     {
238         V(5, 5),
239         V(7, 6),
240         V(9, 7),
241         V(11, 8),
242         V(13, 9),
243         V(15, 10),
244         V(17, 11),
245         V(19, 12)
246     };
247     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
248     R r = m.upper_bound(5);
249     assert(r == next(m.begin(), 1));
250     r = m.upper_bound(7);
251     assert(r == next(m.begin(), 2));
252     r = m.upper_bound(9);
253     assert(r == next(m.begin(), 3));
254     r = m.upper_bound(11);
255     assert(r == next(m.begin(), 4));
256     r = m.upper_bound(13);
257     assert(r == next(m.begin(), 5));
258     r = m.upper_bound(15);
259     assert(r == next(m.begin(), 6));
260     r = m.upper_bound(17);
261     assert(r == next(m.begin(), 7));
262     r = m.upper_bound(19);
263     assert(r == next(m.begin(), 8));
264     r = m.upper_bound(4);
265     assert(r == next(m.begin(), 0));
266     r = m.upper_bound(6);
267     assert(r == next(m.begin(), 1));
268     r = m.upper_bound(8);
269     assert(r == next(m.begin(), 2));
270     r = m.upper_bound(10);
271     assert(r == next(m.begin(), 3));
272     r = m.upper_bound(12);
273     assert(r == next(m.begin(), 4));
274     r = m.upper_bound(14);
275     assert(r == next(m.begin(), 5));
276     r = m.upper_bound(16);
277     assert(r == next(m.begin(), 6));
278     r = m.upper_bound(18);
279     assert(r == next(m.begin(), 7));
280     r = m.upper_bound(20);
281     assert(r == next(m.begin(), 8));
282     }
283 
284     {
285     typedef PrivateConstructor PC;
286     typedef std::map<PC, double, std::less<>> M;
287     typedef M::iterator R;
288 
289     M m;
290     m [ PC::make(5)  ] = 5;
291     m [ PC::make(7)  ] = 6;
292     m [ PC::make(9)  ] = 7;
293     m [ PC::make(11) ] = 8;
294     m [ PC::make(13) ] = 9;
295     m [ PC::make(15) ] = 10;
296     m [ PC::make(17) ] = 11;
297     m [ PC::make(19) ] = 12;
298 
299     R r = m.upper_bound(5);
300     assert(r == next(m.begin(), 1));
301     r = m.upper_bound(7);
302     assert(r == next(m.begin(), 2));
303     r = m.upper_bound(9);
304     assert(r == next(m.begin(), 3));
305     r = m.upper_bound(11);
306     assert(r == next(m.begin(), 4));
307     r = m.upper_bound(13);
308     assert(r == next(m.begin(), 5));
309     r = m.upper_bound(15);
310     assert(r == next(m.begin(), 6));
311     r = m.upper_bound(17);
312     assert(r == next(m.begin(), 7));
313     r = m.upper_bound(19);
314     assert(r == next(m.begin(), 8));
315     r = m.upper_bound(4);
316     assert(r == next(m.begin(), 0));
317     r = m.upper_bound(6);
318     assert(r == next(m.begin(), 1));
319     r = m.upper_bound(8);
320     assert(r == next(m.begin(), 2));
321     r = m.upper_bound(10);
322     assert(r == next(m.begin(), 3));
323     r = m.upper_bound(12);
324     assert(r == next(m.begin(), 4));
325     r = m.upper_bound(14);
326     assert(r == next(m.begin(), 5));
327     r = m.upper_bound(16);
328     assert(r == next(m.begin(), 6));
329     r = m.upper_bound(18);
330     assert(r == next(m.begin(), 7));
331     r = m.upper_bound(20);
332     assert(r == next(m.begin(), 8));
333     }
334 #endif
335 }
336