Home | History | Annotate | Download | only in multiset
      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 multiset
     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 <set>
     18 #include <cassert>
     19 
     20 #include "min_allocator.h"
     21 #include "private_constructor.hpp"
     22 
     23 int main()
     24 {
     25     {
     26     typedef int V;
     27     typedef std::multiset<int> M;
     28     {
     29         typedef std::pair<M::iterator, M::iterator> R;
     30         V ar[] =
     31         {
     32             5,
     33             5,
     34             5,
     35             7,
     36             7,
     37             7,
     38             9,
     39             9,
     40             9
     41         };
     42         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     43         R r = m.equal_range(4);
     44         assert(r.first  == next(m.begin(), 0));
     45         assert(r.second == next(m.begin(), 0));
     46         r = m.equal_range(5);
     47         assert(r.first  == next(m.begin(), 0));
     48         assert(r.second == next(m.begin(), 3));
     49         r = m.equal_range(6);
     50         assert(r.first  == next(m.begin(), 3));
     51         assert(r.second == next(m.begin(), 3));
     52         r = m.equal_range(7);
     53         assert(r.first  == next(m.begin(), 3));
     54         assert(r.second == next(m.begin(), 6));
     55         r = m.equal_range(8);
     56         assert(r.first  == next(m.begin(), 6));
     57         assert(r.second == next(m.begin(), 6));
     58         r = m.equal_range(9);
     59         assert(r.first  == next(m.begin(), 6));
     60         assert(r.second == next(m.begin(), 9));
     61         r = m.equal_range(10);
     62         assert(r.first  == next(m.begin(), 9));
     63         assert(r.second == next(m.begin(), 9));
     64     }
     65     {
     66         typedef std::pair<M::const_iterator, M::const_iterator> R;
     67         V ar[] =
     68         {
     69             5,
     70             5,
     71             5,
     72             7,
     73             7,
     74             7,
     75             9,
     76             9,
     77             9
     78         };
     79         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     80         R r = m.equal_range(4);
     81         assert(r.first  == next(m.begin(), 0));
     82         assert(r.second == next(m.begin(), 0));
     83         r = m.equal_range(5);
     84         assert(r.first  == next(m.begin(), 0));
     85         assert(r.second == next(m.begin(), 3));
     86         r = m.equal_range(6);
     87         assert(r.first  == next(m.begin(), 3));
     88         assert(r.second == next(m.begin(), 3));
     89         r = m.equal_range(7);
     90         assert(r.first  == next(m.begin(), 3));
     91         assert(r.second == next(m.begin(), 6));
     92         r = m.equal_range(8);
     93         assert(r.first  == next(m.begin(), 6));
     94         assert(r.second == next(m.begin(), 6));
     95         r = m.equal_range(9);
     96         assert(r.first  == next(m.begin(), 6));
     97         assert(r.second == next(m.begin(), 9));
     98         r = m.equal_range(10);
     99         assert(r.first  == next(m.begin(), 9));
    100         assert(r.second == next(m.begin(), 9));
    101     }
    102     }
    103 #if __cplusplus >= 201103L
    104     {
    105     typedef int V;
    106     typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
    107     {
    108         typedef std::pair<M::iterator, M::iterator> R;
    109         V ar[] =
    110         {
    111             5,
    112             5,
    113             5,
    114             7,
    115             7,
    116             7,
    117             9,
    118             9,
    119             9
    120         };
    121         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    122         R r = m.equal_range(4);
    123         assert(r.first  == next(m.begin(), 0));
    124         assert(r.second == next(m.begin(), 0));
    125         r = m.equal_range(5);
    126         assert(r.first  == next(m.begin(), 0));
    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  == next(m.begin(), 9));
    142         assert(r.second == next(m.begin(), 9));
    143     }
    144     {
    145         typedef std::pair<M::const_iterator, M::const_iterator> R;
    146         V ar[] =
    147         {
    148             5,
    149             5,
    150             5,
    151             7,
    152             7,
    153             7,
    154             9,
    155             9,
    156             9
    157         };
    158         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    159         R r = m.equal_range(4);
    160         assert(r.first  == next(m.begin(), 0));
    161         assert(r.second == next(m.begin(), 0));
    162         r = m.equal_range(5);
    163         assert(r.first  == next(m.begin(), 0));
    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  == next(m.begin(), 9));
    179         assert(r.second == next(m.begin(), 9));
    180     }
    181     }
    182 #endif
    183 #if _LIBCPP_STD_VER > 11
    184     {
    185     typedef int V;
    186     typedef std::multiset<V, std::less<>> M;
    187     typedef std::pair<M::iterator, M::iterator> R;
    188     V ar[] =
    189     {
    190         5,
    191         5,
    192         5,
    193         7,
    194         7,
    195         7,
    196         9,
    197         9,
    198         9
    199     };
    200     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    201     R r = m.equal_range(4);
    202     assert(r.first  == next(m.begin(), 0));
    203     assert(r.second == next(m.begin(), 0));
    204     r = m.equal_range(5);
    205     assert(r.first  == next(m.begin(), 0));
    206     assert(r.second == next(m.begin(), 3));
    207     r = m.equal_range(6);
    208     assert(r.first  == next(m.begin(), 3));
    209     assert(r.second == next(m.begin(), 3));
    210     r = m.equal_range(7);
    211     assert(r.first  == next(m.begin(), 3));
    212     assert(r.second == next(m.begin(), 6));
    213     r = m.equal_range(8);
    214     assert(r.first  == next(m.begin(), 6));
    215     assert(r.second == next(m.begin(), 6));
    216     r = m.equal_range(9);
    217     assert(r.first  == next(m.begin(), 6));
    218     assert(r.second == next(m.begin(), 9));
    219     r = m.equal_range(10);
    220     assert(r.first  == next(m.begin(), 9));
    221     assert(r.second == next(m.begin(), 9));
    222     }
    223 
    224     {
    225     typedef PrivateConstructor V;
    226     typedef std::multiset<V, std::less<>> M;
    227     typedef std::pair<M::iterator, M::iterator> R;
    228 
    229     M m;
    230     m.insert ( V::make ( 5 ));
    231     m.insert ( V::make ( 5 ));
    232     m.insert ( V::make ( 5 ));
    233     m.insert ( V::make ( 7 ));
    234     m.insert ( V::make ( 7 ));
    235     m.insert ( V::make ( 7 ));
    236     m.insert ( V::make ( 9 ));
    237     m.insert ( V::make ( 9 ));
    238     m.insert ( V::make ( 9 ));
    239 
    240     R r = m.equal_range(4);
    241     assert(r.first  == next(m.begin(), 0));
    242     assert(r.second == next(m.begin(), 0));
    243     r = m.equal_range(5);
    244     assert(r.first  == next(m.begin(), 0));
    245     assert(r.second == next(m.begin(), 3));
    246     r = m.equal_range(6);
    247     assert(r.first  == next(m.begin(), 3));
    248     assert(r.second == next(m.begin(), 3));
    249     r = m.equal_range(7);
    250     assert(r.first  == next(m.begin(), 3));
    251     assert(r.second == next(m.begin(), 6));
    252     r = m.equal_range(8);
    253     assert(r.first  == next(m.begin(), 6));
    254     assert(r.second == next(m.begin(), 6));
    255     r = m.equal_range(9);
    256     assert(r.first  == next(m.begin(), 6));
    257     assert(r.second == next(m.begin(), 9));
    258     r = m.equal_range(10);
    259     assert(r.first  == next(m.begin(), 9));
    260     assert(r.second == next(m.begin(), 9));
    261     }
    262 #endif
    263 }
    264