Home | History | Annotate | Download | only in multimap.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 multimap
     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 #include "is_transparent.h"
     23 
     24 int main()
     25 {
     26     typedef std::pair<const int, double> V;
     27     {
     28     typedef std::multimap<int, double> M;
     29     {
     30         typedef M::iterator R;
     31         V ar[] =
     32         {
     33             V(5, 1),
     34             V(5, 2),
     35             V(5, 3),
     36             V(7, 1),
     37             V(7, 2),
     38             V(7, 3),
     39             V(9, 1),
     40             V(9, 2),
     41             V(9, 3)
     42         };
     43         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     44         R r = m.lower_bound(4);
     45         assert(r == m.begin());
     46         r = m.lower_bound(5);
     47         assert(r == m.begin());
     48         r = m.lower_bound(6);
     49         assert(r == next(m.begin(), 3));
     50         r = m.lower_bound(7);
     51         assert(r == next(m.begin(), 3));
     52         r = m.lower_bound(8);
     53         assert(r == next(m.begin(), 6));
     54         r = m.lower_bound(9);
     55         assert(r == next(m.begin(), 6));
     56         r = m.lower_bound(10);
     57         assert(r == m.end());
     58     }
     59     {
     60         typedef M::const_iterator R;
     61         V ar[] =
     62         {
     63             V(5, 1),
     64             V(5, 2),
     65             V(5, 3),
     66             V(7, 1),
     67             V(7, 2),
     68             V(7, 3),
     69             V(9, 1),
     70             V(9, 2),
     71             V(9, 3)
     72         };
     73         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     74         R r = m.lower_bound(4);
     75         assert(r == m.begin());
     76         r = m.lower_bound(5);
     77         assert(r == m.begin());
     78         r = m.lower_bound(6);
     79         assert(r == next(m.begin(), 3));
     80         r = m.lower_bound(7);
     81         assert(r == next(m.begin(), 3));
     82         r = m.lower_bound(8);
     83         assert(r == next(m.begin(), 6));
     84         r = m.lower_bound(9);
     85         assert(r == next(m.begin(), 6));
     86         r = m.lower_bound(10);
     87         assert(r == m.end());
     88     }
     89     }
     90 #if __cplusplus >= 201103L
     91     {
     92     typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
     93     {
     94         typedef M::iterator R;
     95         V ar[] =
     96         {
     97             V(5, 1),
     98             V(5, 2),
     99             V(5, 3),
    100             V(7, 1),
    101             V(7, 2),
    102             V(7, 3),
    103             V(9, 1),
    104             V(9, 2),
    105             V(9, 3)
    106         };
    107         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    108         R r = m.lower_bound(4);
    109         assert(r == m.begin());
    110         r = m.lower_bound(5);
    111         assert(r == m.begin());
    112         r = m.lower_bound(6);
    113         assert(r == next(m.begin(), 3));
    114         r = m.lower_bound(7);
    115         assert(r == next(m.begin(), 3));
    116         r = m.lower_bound(8);
    117         assert(r == next(m.begin(), 6));
    118         r = m.lower_bound(9);
    119         assert(r == next(m.begin(), 6));
    120         r = m.lower_bound(10);
    121         assert(r == m.end());
    122     }
    123     {
    124         typedef M::const_iterator R;
    125         V ar[] =
    126         {
    127             V(5, 1),
    128             V(5, 2),
    129             V(5, 3),
    130             V(7, 1),
    131             V(7, 2),
    132             V(7, 3),
    133             V(9, 1),
    134             V(9, 2),
    135             V(9, 3)
    136         };
    137         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    138         R r = m.lower_bound(4);
    139         assert(r == m.begin());
    140         r = m.lower_bound(5);
    141         assert(r == m.begin());
    142         r = m.lower_bound(6);
    143         assert(r == next(m.begin(), 3));
    144         r = m.lower_bound(7);
    145         assert(r == next(m.begin(), 3));
    146         r = m.lower_bound(8);
    147         assert(r == next(m.begin(), 6));
    148         r = m.lower_bound(9);
    149         assert(r == next(m.begin(), 6));
    150         r = m.lower_bound(10);
    151         assert(r == m.end());
    152     }
    153     }
    154 #endif
    155 #if _LIBCPP_STD_VER > 11
    156     {
    157     typedef std::pair<const int, double> V;
    158     typedef std::multimap<int, double, std::less<>> M;
    159     typedef M::iterator R;
    160     V ar[] =
    161     {
    162         V(5, 1),
    163         V(5, 2),
    164         V(5, 3),
    165         V(7, 1),
    166         V(7, 2),
    167         V(7, 3),
    168         V(9, 1),
    169         V(9, 2),
    170         V(9, 3)
    171     };
    172     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    173     R r = m.lower_bound(4);
    174     assert(r == m.begin());
    175     r = m.lower_bound(5);
    176     assert(r == m.begin());
    177     r = m.lower_bound(6);
    178     assert(r == next(m.begin(), 3));
    179     r = m.lower_bound(7);
    180     assert(r == next(m.begin(), 3));
    181     r = m.lower_bound(8);
    182     assert(r == next(m.begin(), 6));
    183     r = m.lower_bound(9);
    184     assert(r == next(m.begin(), 6));
    185     r = m.lower_bound(10);
    186     assert(r == m.end());
    187 
    188     r = m.lower_bound(C2Int(4));
    189     assert(r == m.begin());
    190     r = m.lower_bound(C2Int(5));
    191     assert(r == m.begin());
    192     r = m.lower_bound(C2Int(6));
    193     assert(r == next(m.begin(), 3));
    194     r = m.lower_bound(C2Int(7));
    195     assert(r == next(m.begin(), 3));
    196     r = m.lower_bound(C2Int(8));
    197     assert(r == next(m.begin(), 6));
    198     r = m.lower_bound(C2Int(9));
    199     assert(r == next(m.begin(), 6));
    200     r = m.lower_bound(C2Int(10));
    201     assert(r == m.end());
    202     }
    203 
    204     {
    205     typedef PrivateConstructor PC;
    206     typedef std::multimap<PC, double, std::less<>> M;
    207     typedef M::iterator R;
    208 
    209     M m;
    210     m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
    211     m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
    212     m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
    213     m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
    214     m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
    215     m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
    216     m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
    217     m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
    218     m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
    219 
    220     R r = m.lower_bound(4);
    221     assert(r == m.begin());
    222     r = m.lower_bound(5);
    223     assert(r == m.begin());
    224     r = m.lower_bound(6);
    225     assert(r == next(m.begin(), 3));
    226     r = m.lower_bound(7);
    227     assert(r == next(m.begin(), 3));
    228     r = m.lower_bound(8);
    229     assert(r == next(m.begin(), 6));
    230     r = m.lower_bound(9);
    231     assert(r == next(m.begin(), 6));
    232     r = m.lower_bound(10);
    233     assert(r == m.end());
    234     }
    235 
    236 #endif
    237 }
    238