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 "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.lower_bound(5);
     43         assert(r == m.begin());
     44         r = m.lower_bound(7);
     45         assert(r == next(m.begin()));
     46         r = m.lower_bound(9);
     47         assert(r == next(m.begin(), 2));
     48         r = m.lower_bound(11);
     49         assert(r == next(m.begin(), 3));
     50         r = m.lower_bound(13);
     51         assert(r == next(m.begin(), 4));
     52         r = m.lower_bound(15);
     53         assert(r == next(m.begin(), 5));
     54         r = m.lower_bound(17);
     55         assert(r == next(m.begin(), 6));
     56         r = m.lower_bound(19);
     57         assert(r == next(m.begin(), 7));
     58         r = m.lower_bound(4);
     59         assert(r == next(m.begin(), 0));
     60         r = m.lower_bound(6);
     61         assert(r == next(m.begin(), 1));
     62         r = m.lower_bound(8);
     63         assert(r == next(m.begin(), 2));
     64         r = m.lower_bound(10);
     65         assert(r == next(m.begin(), 3));
     66         r = m.lower_bound(12);
     67         assert(r == next(m.begin(), 4));
     68         r = m.lower_bound(14);
     69         assert(r == next(m.begin(), 5));
     70         r = m.lower_bound(16);
     71         assert(r == next(m.begin(), 6));
     72         r = m.lower_bound(18);
     73         assert(r == next(m.begin(), 7));
     74         r = m.lower_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.lower_bound(5);
     92         assert(r == m.begin());
     93         r = m.lower_bound(7);
     94         assert(r == next(m.begin()));
     95         r = m.lower_bound(9);
     96         assert(r == next(m.begin(), 2));
     97         r = m.lower_bound(11);
     98         assert(r == next(m.begin(), 3));
     99         r = m.lower_bound(13);
    100         assert(r == next(m.begin(), 4));
    101         r = m.lower_bound(15);
    102         assert(r == next(m.begin(), 5));
    103         r = m.lower_bound(17);
    104         assert(r == next(m.begin(), 6));
    105         r = m.lower_bound(19);
    106         assert(r == next(m.begin(), 7));
    107         r = m.lower_bound(4);
    108         assert(r == next(m.begin(), 0));
    109         r = m.lower_bound(6);
    110         assert(r == next(m.begin(), 1));
    111         r = m.lower_bound(8);
    112         assert(r == next(m.begin(), 2));
    113         r = m.lower_bound(10);
    114         assert(r == next(m.begin(), 3));
    115         r = m.lower_bound(12);
    116         assert(r == next(m.begin(), 4));
    117         r = m.lower_bound(14);
    118         assert(r == next(m.begin(), 5));
    119         r = m.lower_bound(16);
    120         assert(r == next(m.begin(), 6));
    121         r = m.lower_bound(18);
    122         assert(r == next(m.begin(), 7));
    123         r = m.lower_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.lower_bound(5);
    146         assert(r == m.begin());
    147         r = m.lower_bound(7);
    148         assert(r == next(m.begin()));
    149         r = m.lower_bound(9);
    150         assert(r == next(m.begin(), 2));
    151         r = m.lower_bound(11);
    152         assert(r == next(m.begin(), 3));
    153         r = m.lower_bound(13);
    154         assert(r == next(m.begin(), 4));
    155         r = m.lower_bound(15);
    156         assert(r == next(m.begin(), 5));
    157         r = m.lower_bound(17);
    158         assert(r == next(m.begin(), 6));
    159         r = m.lower_bound(19);
    160         assert(r == next(m.begin(), 7));
    161         r = m.lower_bound(4);
    162         assert(r == next(m.begin(), 0));
    163         r = m.lower_bound(6);
    164         assert(r == next(m.begin(), 1));
    165         r = m.lower_bound(8);
    166         assert(r == next(m.begin(), 2));
    167         r = m.lower_bound(10);
    168         assert(r == next(m.begin(), 3));
    169         r = m.lower_bound(12);
    170         assert(r == next(m.begin(), 4));
    171         r = m.lower_bound(14);
    172         assert(r == next(m.begin(), 5));
    173         r = m.lower_bound(16);
    174         assert(r == next(m.begin(), 6));
    175         r = m.lower_bound(18);
    176         assert(r == next(m.begin(), 7));
    177         r = m.lower_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.lower_bound(5);
    195         assert(r == m.begin());
    196         r = m.lower_bound(7);
    197         assert(r == next(m.begin()));
    198         r = m.lower_bound(9);
    199         assert(r == next(m.begin(), 2));
    200         r = m.lower_bound(11);
    201         assert(r == next(m.begin(), 3));
    202         r = m.lower_bound(13);
    203         assert(r == next(m.begin(), 4));
    204         r = m.lower_bound(15);
    205         assert(r == next(m.begin(), 5));
    206         r = m.lower_bound(17);
    207         assert(r == next(m.begin(), 6));
    208         r = m.lower_bound(19);
    209         assert(r == next(m.begin(), 7));
    210         r = m.lower_bound(4);
    211         assert(r == next(m.begin(), 0));
    212         r = m.lower_bound(6);
    213         assert(r == next(m.begin(), 1));
    214         r = m.lower_bound(8);
    215         assert(r == next(m.begin(), 2));
    216         r = m.lower_bound(10);
    217         assert(r == next(m.begin(), 3));
    218         r = m.lower_bound(12);
    219         assert(r == next(m.begin(), 4));
    220         r = m.lower_bound(14);
    221         assert(r == next(m.begin(), 5));
    222         r = m.lower_bound(16);
    223         assert(r == next(m.begin(), 6));
    224         r = m.lower_bound(18);
    225         assert(r == next(m.begin(), 7));
    226         r = m.lower_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 
    237     V ar[] =
    238     {
    239         V(5, 5),
    240         V(7, 6),
    241         V(9, 7),
    242         V(11, 8),
    243         V(13, 9),
    244         V(15, 10),
    245         V(17, 11),
    246         V(19, 12)
    247     };
    248     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    249     R r = m.lower_bound(5);
    250     assert(r == m.begin());
    251     r = m.lower_bound(7);
    252     assert(r == next(m.begin()));
    253     r = m.lower_bound(9);
    254     assert(r == next(m.begin(), 2));
    255     r = m.lower_bound(11);
    256     assert(r == next(m.begin(), 3));
    257     r = m.lower_bound(13);
    258     assert(r == next(m.begin(), 4));
    259     r = m.lower_bound(15);
    260     assert(r == next(m.begin(), 5));
    261     r = m.lower_bound(17);
    262     assert(r == next(m.begin(), 6));
    263     r = m.lower_bound(19);
    264     assert(r == next(m.begin(), 7));
    265     r = m.lower_bound(4);
    266     assert(r == next(m.begin(), 0));
    267     r = m.lower_bound(6);
    268     assert(r == next(m.begin(), 1));
    269     r = m.lower_bound(8);
    270     assert(r == next(m.begin(), 2));
    271     r = m.lower_bound(10);
    272     assert(r == next(m.begin(), 3));
    273     r = m.lower_bound(12);
    274     assert(r == next(m.begin(), 4));
    275     r = m.lower_bound(14);
    276     assert(r == next(m.begin(), 5));
    277     r = m.lower_bound(16);
    278     assert(r == next(m.begin(), 6));
    279     r = m.lower_bound(18);
    280     assert(r == next(m.begin(), 7));
    281     r = m.lower_bound(20);
    282     assert(r == next(m.begin(), 8));
    283     }
    284 
    285     {
    286     typedef PrivateConstructor PC;
    287     typedef std::map<PC, double, std::less<>> M;
    288     typedef M::iterator R;
    289 
    290     M m;
    291     m [ PC::make(5)  ] = 5;
    292     m [ PC::make(7)  ] = 6;
    293     m [ PC::make(9)  ] = 7;
    294     m [ PC::make(11) ] = 8;
    295     m [ PC::make(13) ] = 9;
    296     m [ PC::make(15) ] = 10;
    297     m [ PC::make(17) ] = 11;
    298     m [ PC::make(19) ] = 12;
    299 
    300     R r = m.lower_bound(5);
    301     assert(r == m.begin());
    302     r = m.lower_bound(7);
    303     assert(r == next(m.begin()));
    304     r = m.lower_bound(9);
    305     assert(r == next(m.begin(), 2));
    306     r = m.lower_bound(11);
    307     assert(r == next(m.begin(), 3));
    308     r = m.lower_bound(13);
    309     assert(r == next(m.begin(), 4));
    310     r = m.lower_bound(15);
    311     assert(r == next(m.begin(), 5));
    312     r = m.lower_bound(17);
    313     assert(r == next(m.begin(), 6));
    314     r = m.lower_bound(19);
    315     assert(r == next(m.begin(), 7));
    316     r = m.lower_bound(4);
    317     assert(r == next(m.begin(), 0));
    318     r = m.lower_bound(6);
    319     assert(r == next(m.begin(), 1));
    320     r = m.lower_bound(8);
    321     assert(r == next(m.begin(), 2));
    322     r = m.lower_bound(10);
    323     assert(r == next(m.begin(), 3));
    324     r = m.lower_bound(12);
    325     assert(r == next(m.begin(), 4));
    326     r = m.lower_bound(14);
    327     assert(r == next(m.begin(), 5));
    328     r = m.lower_bound(16);
    329     assert(r == next(m.begin(), 6));
    330     r = m.lower_bound(18);
    331     assert(r == next(m.begin(), 7));
    332     r = m.lower_bound(20);
    333     assert(r == next(m.begin(), 8));
    334     }
    335 #endif
    336 }
    337