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