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 // <multimap>
     11 
     12 // class multimap
     13 
     14 // pair<iterator, iterator>             equal_range(const key_type& k);
     15 // pair<const_iterator, const_iterator> equal_range(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 std::pair<M::iterator, 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.equal_range(4);
     45         assert(r.first == m.begin());
     46         assert(r.second == m.begin());
     47         r = m.equal_range(5);
     48         assert(r.first == m.begin());
     49         assert(r.second == next(m.begin(), 3));
     50         r = m.equal_range(6);
     51         assert(r.first == next(m.begin(), 3));
     52         assert(r.second == next(m.begin(), 3));
     53         r = m.equal_range(7);
     54         assert(r.first == next(m.begin(), 3));
     55         assert(r.second == next(m.begin(), 6));
     56         r = m.equal_range(8);
     57         assert(r.first == next(m.begin(), 6));
     58         assert(r.second == next(m.begin(), 6));
     59         r = m.equal_range(9);
     60         assert(r.first == next(m.begin(), 6));
     61         assert(r.second == next(m.begin(), 9));
     62         r = m.equal_range(10);
     63         assert(r.first == m.end());
     64         assert(r.second == m.end());
     65     }
     66     {
     67         typedef std::pair<M::const_iterator, M::const_iterator> R;
     68         V ar[] =
     69         {
     70             V(5, 1),
     71             V(5, 2),
     72             V(5, 3),
     73             V(7, 1),
     74             V(7, 2),
     75             V(7, 3),
     76             V(9, 1),
     77             V(9, 2),
     78             V(9, 3)
     79         };
     80         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     81         R r = m.equal_range(4);
     82         assert(r.first == m.begin());
     83         assert(r.second == m.begin());
     84         r = m.equal_range(5);
     85         assert(r.first == m.begin());
     86         assert(r.second == next(m.begin(), 3));
     87         r = m.equal_range(6);
     88         assert(r.first == next(m.begin(), 3));
     89         assert(r.second == next(m.begin(), 3));
     90         r = m.equal_range(7);
     91         assert(r.first == next(m.begin(), 3));
     92         assert(r.second == next(m.begin(), 6));
     93         r = m.equal_range(8);
     94         assert(r.first == next(m.begin(), 6));
     95         assert(r.second == next(m.begin(), 6));
     96         r = m.equal_range(9);
     97         assert(r.first == next(m.begin(), 6));
     98         assert(r.second == next(m.begin(), 9));
     99         r = m.equal_range(10);
    100         assert(r.first == m.end());
    101         assert(r.second == m.end());
    102     }
    103     }
    104 #if __cplusplus >= 201103L
    105     {
    106     typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
    107     {
    108         typedef std::pair<M::iterator, M::iterator> R;
    109         V ar[] =
    110         {
    111             V(5, 1),
    112             V(5, 2),
    113             V(5, 3),
    114             V(7, 1),
    115             V(7, 2),
    116             V(7, 3),
    117             V(9, 1),
    118             V(9, 2),
    119             V(9, 3)
    120         };
    121         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    122         R r = m.equal_range(4);
    123         assert(r.first == m.begin());
    124         assert(r.second == m.begin());
    125         r = m.equal_range(5);
    126         assert(r.first == m.begin());
    127         assert(r.second == next(m.begin(), 3));
    128         r = m.equal_range(6);
    129         assert(r.first == next(m.begin(), 3));
    130         assert(r.second == next(m.begin(), 3));
    131         r = m.equal_range(7);
    132         assert(r.first == next(m.begin(), 3));
    133         assert(r.second == next(m.begin(), 6));
    134         r = m.equal_range(8);
    135         assert(r.first == next(m.begin(), 6));
    136         assert(r.second == next(m.begin(), 6));
    137         r = m.equal_range(9);
    138         assert(r.first == next(m.begin(), 6));
    139         assert(r.second == next(m.begin(), 9));
    140         r = m.equal_range(10);
    141         assert(r.first == m.end());
    142         assert(r.second == m.end());
    143     }
    144     {
    145         typedef std::pair<M::const_iterator, M::const_iterator> R;
    146         V ar[] =
    147         {
    148             V(5, 1),
    149             V(5, 2),
    150             V(5, 3),
    151             V(7, 1),
    152             V(7, 2),
    153             V(7, 3),
    154             V(9, 1),
    155             V(9, 2),
    156             V(9, 3)
    157         };
    158         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    159         R r = m.equal_range(4);
    160         assert(r.first == m.begin());
    161         assert(r.second == m.begin());
    162         r = m.equal_range(5);
    163         assert(r.first == m.begin());
    164         assert(r.second == next(m.begin(), 3));
    165         r = m.equal_range(6);
    166         assert(r.first == next(m.begin(), 3));
    167         assert(r.second == next(m.begin(), 3));
    168         r = m.equal_range(7);
    169         assert(r.first == next(m.begin(), 3));
    170         assert(r.second == next(m.begin(), 6));
    171         r = m.equal_range(8);
    172         assert(r.first == next(m.begin(), 6));
    173         assert(r.second == next(m.begin(), 6));
    174         r = m.equal_range(9);
    175         assert(r.first == next(m.begin(), 6));
    176         assert(r.second == next(m.begin(), 9));
    177         r = m.equal_range(10);
    178         assert(r.first == m.end());
    179         assert(r.second == m.end());
    180     }
    181     }
    182 #endif
    183 #if _LIBCPP_STD_VER > 11
    184     {
    185     typedef std::pair<const int, double> V;
    186     typedef std::multimap<int, double, std::less<>> M;
    187 
    188     typedef std::pair<M::iterator, M::iterator> R;
    189     V ar[] =
    190     {
    191         V(5, 1),
    192         V(5, 2),
    193         V(5, 3),
    194         V(7, 1),
    195         V(7, 2),
    196         V(7, 3),
    197         V(9, 1),
    198         V(9, 2),
    199         V(9, 3)
    200     };
    201     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    202     R r = m.equal_range(4);
    203     assert(r.first == m.begin());
    204     assert(r.second == m.begin());
    205     r = m.equal_range(5);
    206     assert(r.first == m.begin());
    207     assert(r.second == next(m.begin(), 3));
    208     r = m.equal_range(6);
    209     assert(r.first == next(m.begin(), 3));
    210     assert(r.second == next(m.begin(), 3));
    211     r = m.equal_range(7);
    212     assert(r.first == next(m.begin(), 3));
    213     assert(r.second == next(m.begin(), 6));
    214     r = m.equal_range(8);
    215     assert(r.first == next(m.begin(), 6));
    216     assert(r.second == next(m.begin(), 6));
    217     r = m.equal_range(9);
    218     assert(r.first == next(m.begin(), 6));
    219     assert(r.second == next(m.begin(), 9));
    220     r = m.equal_range(10);
    221     assert(r.first == m.end());
    222     assert(r.second == m.end());
    223 
    224     r = m.equal_range(C2Int(4));
    225     assert(r.first == m.begin());
    226     assert(r.second == m.begin());
    227     r = m.equal_range(C2Int(5));
    228     assert(r.first == m.begin());
    229     assert(r.second == next(m.begin(), 3));
    230     r = m.equal_range(C2Int(6));
    231     assert(r.first == next(m.begin(), 3));
    232     assert(r.second == next(m.begin(), 3));
    233     r = m.equal_range(C2Int(7));
    234     assert(r.first == next(m.begin(), 3));
    235     assert(r.second == next(m.begin(), 6));
    236     r = m.equal_range(C2Int(8));
    237     assert(r.first == next(m.begin(), 6));
    238     assert(r.second == next(m.begin(), 6));
    239     r = m.equal_range(C2Int(9));
    240     assert(r.first == next(m.begin(), 6));
    241     assert(r.second == next(m.begin(), 9));
    242     r = m.equal_range(C2Int(10));
    243     assert(r.first == m.end());
    244     assert(r.second == m.end());
    245     }
    246 
    247     {
    248     typedef PrivateConstructor PC;
    249     typedef std::multimap<PC, double, std::less<>> M;
    250     typedef std::pair<M::iterator, M::iterator> R;
    251 
    252     M m;
    253     m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
    254     m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
    255     m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
    256     m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
    257     m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
    258     m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
    259     m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
    260     m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
    261     m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
    262 
    263 //  assert(m.size() == 9);
    264     R r = m.equal_range(4);
    265     assert(r.first == m.begin());
    266     assert(r.second == m.begin());
    267     r = m.equal_range(5);
    268     assert(r.first == m.begin());
    269     assert(r.second == next(m.begin(), 3));
    270     r = m.equal_range(6);
    271     assert(r.first == next(m.begin(), 3));
    272     assert(r.second == next(m.begin(), 3));
    273     r = m.equal_range(7);
    274     assert(r.first == next(m.begin(), 3));
    275     assert(r.second == next(m.begin(), 6));
    276     r = m.equal_range(8);
    277     assert(r.first == next(m.begin(), 6));
    278     assert(r.second == next(m.begin(), 6));
    279     r = m.equal_range(9);
    280     assert(r.first == next(m.begin(), 6));
    281     assert(r.second == next(m.begin(), 9));
    282     r = m.equal_range(10);
    283     assert(r.first == m.end());
    284     assert(r.second == m.end());
    285     }
    286 #endif
    287 }
    288