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