15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <set>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // class set
125a83710eSEric Fiselier 
135a83710eSEric Fiselier //       iterator upper_bound(const key_type& k);
145a83710eSEric Fiselier // const_iterator upper_bound(const key_type& k) const;
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <set>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier 
190f901c7eSStephan T. Lavavej #include "test_macros.h"
205a83710eSEric Fiselier #include "min_allocator.h"
21cc89063bSNico Weber #include "private_constructor.h"
225a83710eSEric Fiselier 
main(int,char **)232df59c50SJF Bastien int main(int, char**)
245a83710eSEric Fiselier {
255a83710eSEric Fiselier     {
265a83710eSEric Fiselier     typedef int V;
275a83710eSEric Fiselier     typedef std::set<int> M;
285a83710eSEric Fiselier     {
295a83710eSEric Fiselier         typedef M::iterator R;
305a83710eSEric Fiselier         V ar[] =
315a83710eSEric Fiselier         {
325a83710eSEric Fiselier             5,
335a83710eSEric Fiselier             7,
345a83710eSEric Fiselier             9,
355a83710eSEric Fiselier             11,
365a83710eSEric Fiselier             13,
375a83710eSEric Fiselier             15,
385a83710eSEric Fiselier             17,
395a83710eSEric Fiselier             19
405a83710eSEric Fiselier         };
415a83710eSEric Fiselier         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
425a83710eSEric Fiselier         R r = m.upper_bound(5);
43*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
445a83710eSEric Fiselier         r = m.upper_bound(7);
45*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
465a83710eSEric Fiselier         r = m.upper_bound(9);
47*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
485a83710eSEric Fiselier         r = m.upper_bound(11);
49*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
505a83710eSEric Fiselier         r = m.upper_bound(13);
51*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
525a83710eSEric Fiselier         r = m.upper_bound(15);
53*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
545a83710eSEric Fiselier         r = m.upper_bound(17);
55*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
565a83710eSEric Fiselier         r = m.upper_bound(19);
57*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
585a83710eSEric Fiselier         r = m.upper_bound(4);
59*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 0));
605a83710eSEric Fiselier         r = m.upper_bound(6);
61*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
625a83710eSEric Fiselier         r = m.upper_bound(8);
63*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
645a83710eSEric Fiselier         r = m.upper_bound(10);
65*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
665a83710eSEric Fiselier         r = m.upper_bound(12);
67*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
685a83710eSEric Fiselier         r = m.upper_bound(14);
69*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
705a83710eSEric Fiselier         r = m.upper_bound(16);
71*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
725a83710eSEric Fiselier         r = m.upper_bound(18);
73*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
745a83710eSEric Fiselier         r = m.upper_bound(20);
75*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
765a83710eSEric Fiselier     }
775a83710eSEric Fiselier     {
785a83710eSEric Fiselier         typedef M::const_iterator R;
795a83710eSEric Fiselier         V ar[] =
805a83710eSEric Fiselier         {
815a83710eSEric Fiselier             5,
825a83710eSEric Fiselier             7,
835a83710eSEric Fiselier             9,
845a83710eSEric Fiselier             11,
855a83710eSEric Fiselier             13,
865a83710eSEric Fiselier             15,
875a83710eSEric Fiselier             17,
885a83710eSEric Fiselier             19
895a83710eSEric Fiselier         };
905a83710eSEric Fiselier         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
915a83710eSEric Fiselier         R r = m.upper_bound(5);
92*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
935a83710eSEric Fiselier         r = m.upper_bound(7);
94*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
955a83710eSEric Fiselier         r = m.upper_bound(9);
96*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
975a83710eSEric Fiselier         r = m.upper_bound(11);
98*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
995a83710eSEric Fiselier         r = m.upper_bound(13);
100*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
1015a83710eSEric Fiselier         r = m.upper_bound(15);
102*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
1035a83710eSEric Fiselier         r = m.upper_bound(17);
104*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
1055a83710eSEric Fiselier         r = m.upper_bound(19);
106*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
1075a83710eSEric Fiselier         r = m.upper_bound(4);
108*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 0));
1095a83710eSEric Fiselier         r = m.upper_bound(6);
110*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
1115a83710eSEric Fiselier         r = m.upper_bound(8);
112*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
1135a83710eSEric Fiselier         r = m.upper_bound(10);
114*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
1155a83710eSEric Fiselier         r = m.upper_bound(12);
116*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
1175a83710eSEric Fiselier         r = m.upper_bound(14);
118*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
1195a83710eSEric Fiselier         r = m.upper_bound(16);
120*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
1215a83710eSEric Fiselier         r = m.upper_bound(18);
122*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
1235a83710eSEric Fiselier         r = m.upper_bound(20);
124*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
1255a83710eSEric Fiselier     }
1265a83710eSEric Fiselier     }
127f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1285a83710eSEric Fiselier     {
1295a83710eSEric Fiselier     typedef int V;
1305a83710eSEric Fiselier     typedef std::set<int, std::less<int>, min_allocator<int>> M;
1315a83710eSEric Fiselier     {
1325a83710eSEric Fiselier         typedef M::iterator R;
1335a83710eSEric Fiselier         V ar[] =
1345a83710eSEric Fiselier         {
1355a83710eSEric Fiselier             5,
1365a83710eSEric Fiselier             7,
1375a83710eSEric Fiselier             9,
1385a83710eSEric Fiselier             11,
1395a83710eSEric Fiselier             13,
1405a83710eSEric Fiselier             15,
1415a83710eSEric Fiselier             17,
1425a83710eSEric Fiselier             19
1435a83710eSEric Fiselier         };
1445a83710eSEric Fiselier         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
1455a83710eSEric Fiselier         R r = m.upper_bound(5);
146*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
1475a83710eSEric Fiselier         r = m.upper_bound(7);
148*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
1495a83710eSEric Fiselier         r = m.upper_bound(9);
150*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
1515a83710eSEric Fiselier         r = m.upper_bound(11);
152*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
1535a83710eSEric Fiselier         r = m.upper_bound(13);
154*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
1555a83710eSEric Fiselier         r = m.upper_bound(15);
156*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
1575a83710eSEric Fiselier         r = m.upper_bound(17);
158*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
1595a83710eSEric Fiselier         r = m.upper_bound(19);
160*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
1615a83710eSEric Fiselier         r = m.upper_bound(4);
162*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 0));
1635a83710eSEric Fiselier         r = m.upper_bound(6);
164*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
1655a83710eSEric Fiselier         r = m.upper_bound(8);
166*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
1675a83710eSEric Fiselier         r = m.upper_bound(10);
168*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
1695a83710eSEric Fiselier         r = m.upper_bound(12);
170*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
1715a83710eSEric Fiselier         r = m.upper_bound(14);
172*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
1735a83710eSEric Fiselier         r = m.upper_bound(16);
174*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
1755a83710eSEric Fiselier         r = m.upper_bound(18);
176*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
1775a83710eSEric Fiselier         r = m.upper_bound(20);
178*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
1795a83710eSEric Fiselier     }
1805a83710eSEric Fiselier     {
1815a83710eSEric Fiselier         typedef M::const_iterator R;
1825a83710eSEric Fiselier         V ar[] =
1835a83710eSEric Fiselier         {
1845a83710eSEric Fiselier             5,
1855a83710eSEric Fiselier             7,
1865a83710eSEric Fiselier             9,
1875a83710eSEric Fiselier             11,
1885a83710eSEric Fiselier             13,
1895a83710eSEric Fiselier             15,
1905a83710eSEric Fiselier             17,
1915a83710eSEric Fiselier             19
1925a83710eSEric Fiselier         };
1935a83710eSEric Fiselier         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
1945a83710eSEric Fiselier         R r = m.upper_bound(5);
195*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
1965a83710eSEric Fiselier         r = m.upper_bound(7);
197*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
1985a83710eSEric Fiselier         r = m.upper_bound(9);
199*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
2005a83710eSEric Fiselier         r = m.upper_bound(11);
201*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
2025a83710eSEric Fiselier         r = m.upper_bound(13);
203*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
2045a83710eSEric Fiselier         r = m.upper_bound(15);
205*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
2065a83710eSEric Fiselier         r = m.upper_bound(17);
207*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
2085a83710eSEric Fiselier         r = m.upper_bound(19);
209*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
2105a83710eSEric Fiselier         r = m.upper_bound(4);
211*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 0));
2125a83710eSEric Fiselier         r = m.upper_bound(6);
213*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 1));
2145a83710eSEric Fiselier         r = m.upper_bound(8);
215*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 2));
2165a83710eSEric Fiselier         r = m.upper_bound(10);
217*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 3));
2185a83710eSEric Fiselier         r = m.upper_bound(12);
219*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 4));
2205a83710eSEric Fiselier         r = m.upper_bound(14);
221*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 5));
2225a83710eSEric Fiselier         r = m.upper_bound(16);
223*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 6));
2245a83710eSEric Fiselier         r = m.upper_bound(18);
225*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 7));
2265a83710eSEric Fiselier         r = m.upper_bound(20);
227*5ffe11a9SArthur O'Dwyer         assert(r == std::next(m.begin(), 8));
2285a83710eSEric Fiselier     }
2295a83710eSEric Fiselier     }
2305a83710eSEric Fiselier #endif
2310f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
2325a83710eSEric Fiselier     {
2335a83710eSEric Fiselier     typedef int V;
2345a83710eSEric Fiselier     typedef std::set<V, std::less<>> M;
2355a83710eSEric Fiselier     typedef M::iterator R;
2365a83710eSEric Fiselier 
2375a83710eSEric Fiselier     V ar[] =
2385a83710eSEric Fiselier     {
2395a83710eSEric Fiselier         5,
2405a83710eSEric Fiselier         7,
2415a83710eSEric Fiselier         9,
2425a83710eSEric Fiselier         11,
2435a83710eSEric Fiselier         13,
2445a83710eSEric Fiselier         15,
2455a83710eSEric Fiselier         17,
2465a83710eSEric Fiselier         19
2475a83710eSEric Fiselier     };
2485a83710eSEric Fiselier     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
2495a83710eSEric Fiselier     R r = m.upper_bound(5);
250*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 1));
2515a83710eSEric Fiselier     r = m.upper_bound(7);
252*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 2));
2535a83710eSEric Fiselier     r = m.upper_bound(9);
254*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 3));
2555a83710eSEric Fiselier     r = m.upper_bound(11);
256*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 4));
2575a83710eSEric Fiselier     r = m.upper_bound(13);
258*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 5));
2595a83710eSEric Fiselier     r = m.upper_bound(15);
260*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 6));
2615a83710eSEric Fiselier     r = m.upper_bound(17);
262*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 7));
2635a83710eSEric Fiselier     r = m.upper_bound(19);
264*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 8));
2655a83710eSEric Fiselier     r = m.upper_bound(4);
266*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 0));
2675a83710eSEric Fiselier     r = m.upper_bound(6);
268*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 1));
2695a83710eSEric Fiselier     r = m.upper_bound(8);
270*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 2));
2715a83710eSEric Fiselier     r = m.upper_bound(10);
272*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 3));
2735a83710eSEric Fiselier     r = m.upper_bound(12);
274*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 4));
2755a83710eSEric Fiselier     r = m.upper_bound(14);
276*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 5));
2775a83710eSEric Fiselier     r = m.upper_bound(16);
278*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 6));
2795a83710eSEric Fiselier     r = m.upper_bound(18);
280*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 7));
2815a83710eSEric Fiselier     r = m.upper_bound(20);
282*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 8));
2835a83710eSEric Fiselier     }
2845a83710eSEric Fiselier 
2855a83710eSEric Fiselier     {
2865a83710eSEric Fiselier     typedef PrivateConstructor V;
2875a83710eSEric Fiselier     typedef std::set<V, std::less<>> M;
2885a83710eSEric Fiselier     typedef M::iterator R;
2895a83710eSEric Fiselier 
2905a83710eSEric Fiselier     M m;
2915a83710eSEric Fiselier     m.insert ( V::make ( 5 ));
2925a83710eSEric Fiselier     m.insert ( V::make ( 7 ));
2935a83710eSEric Fiselier     m.insert ( V::make ( 9 ));
2945a83710eSEric Fiselier     m.insert ( V::make ( 11 ));
2955a83710eSEric Fiselier     m.insert ( V::make ( 13 ));
2965a83710eSEric Fiselier     m.insert ( V::make ( 15 ));
2975a83710eSEric Fiselier     m.insert ( V::make ( 17 ));
2985a83710eSEric Fiselier     m.insert ( V::make ( 19 ));
2995a83710eSEric Fiselier 
3005a83710eSEric Fiselier     R r = m.upper_bound(5);
301*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 1));
3025a83710eSEric Fiselier     r = m.upper_bound(7);
303*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 2));
3045a83710eSEric Fiselier     r = m.upper_bound(9);
305*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 3));
3065a83710eSEric Fiselier     r = m.upper_bound(11);
307*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 4));
3085a83710eSEric Fiselier     r = m.upper_bound(13);
309*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 5));
3105a83710eSEric Fiselier     r = m.upper_bound(15);
311*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 6));
3125a83710eSEric Fiselier     r = m.upper_bound(17);
313*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 7));
3145a83710eSEric Fiselier     r = m.upper_bound(19);
315*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 8));
3165a83710eSEric Fiselier     r = m.upper_bound(4);
317*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 0));
3185a83710eSEric Fiselier     r = m.upper_bound(6);
319*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 1));
3205a83710eSEric Fiselier     r = m.upper_bound(8);
321*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 2));
3225a83710eSEric Fiselier     r = m.upper_bound(10);
323*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 3));
3245a83710eSEric Fiselier     r = m.upper_bound(12);
325*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 4));
3265a83710eSEric Fiselier     r = m.upper_bound(14);
327*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 5));
3285a83710eSEric Fiselier     r = m.upper_bound(16);
329*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 6));
3305a83710eSEric Fiselier     r = m.upper_bound(18);
331*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 7));
3325a83710eSEric Fiselier     r = m.upper_bound(20);
333*5ffe11a9SArthur O'Dwyer     assert(r == std::next(m.begin(), 8));
3345a83710eSEric Fiselier     }
3355a83710eSEric Fiselier #endif
3362df59c50SJF Bastien 
3372df59c50SJF Bastien   return 0;
3385a83710eSEric Fiselier }
339