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 "test_macros.h"
     21 #include "min_allocator.h"
     22 #include "private_constructor.hpp"
     23 
     24 int main()
     25 {
     26     {
     27     typedef int V;
     28     typedef std::multiset<int> M;
     29     {
     30         typedef std::pair<M::iterator, M::iterator> R;
     31         V ar[] =
     32         {
     33             5,
     34             5,
     35             5,
     36             7,
     37             7,
     38             7,
     39             9,
     40             9,
     41             9
     42         };
     43         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     44         R r = m.equal_range(4);
     45         assert(r.first  == next(m.begin(), 0));
     46         assert(r.second == next(m.begin(), 0));
     47         r = m.equal_range(5);
     48         assert(r.first  == next(m.begin(), 0));
     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  == next(m.begin(), 9));
     64         assert(r.second == next(m.begin(), 9));
     65     }
     66     {
     67         typedef std::pair<M::const_iterator, M::const_iterator> R;
     68         V ar[] =
     69         {
     70             5,
     71             5,
     72             5,
     73             7,
     74             7,
     75             7,
     76             9,
     77             9,
     78             9
     79         };
     80         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
     81         R r = m.equal_range(4);
     82         assert(r.first  == next(m.begin(), 0));
     83         assert(r.second == next(m.begin(), 0));
     84         r = m.equal_range(5);
     85         assert(r.first  == next(m.begin(), 0));
     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  == next(m.begin(), 9));
    101         assert(r.second == next(m.begin(), 9));
    102     }
    103     }
    104 #if TEST_STD_VER >= 11
    105     {
    106     typedef int V;
    107     typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
    108     {
    109         typedef std::pair<M::iterator, M::iterator> R;
    110         V ar[] =
    111         {
    112             5,
    113             5,
    114             5,
    115             7,
    116             7,
    117             7,
    118             9,
    119             9,
    120             9
    121         };
    122         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    123         R r = m.equal_range(4);
    124         assert(r.first  == next(m.begin(), 0));
    125         assert(r.second == next(m.begin(), 0));
    126         r = m.equal_range(5);
    127         assert(r.first  == next(m.begin(), 0));
    128         assert(r.second == next(m.begin(), 3));
    129         r = m.equal_range(6);
    130         assert(r.first  == next(m.begin(), 3));
    131         assert(r.second == next(m.begin(), 3));
    132         r = m.equal_range(7);
    133         assert(r.first  == next(m.begin(), 3));
    134         assert(r.second == next(m.begin(), 6));
    135         r = m.equal_range(8);
    136         assert(r.first  == next(m.begin(), 6));
    137         assert(r.second == next(m.begin(), 6));
    138         r = m.equal_range(9);
    139         assert(r.first  == next(m.begin(), 6));
    140         assert(r.second == next(m.begin(), 9));
    141         r = m.equal_range(10);
    142         assert(r.first  == next(m.begin(), 9));
    143         assert(r.second == next(m.begin(), 9));
    144     }
    145     {
    146         typedef std::pair<M::const_iterator, M::const_iterator> R;
    147         V ar[] =
    148         {
    149             5,
    150             5,
    151             5,
    152             7,
    153             7,
    154             7,
    155             9,
    156             9,
    157             9
    158         };
    159         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    160         R r = m.equal_range(4);
    161         assert(r.first  == next(m.begin(), 0));
    162         assert(r.second == next(m.begin(), 0));
    163         r = m.equal_range(5);
    164         assert(r.first  == next(m.begin(), 0));
    165         assert(r.second == next(m.begin(), 3));
    166         r = m.equal_range(6);
    167         assert(r.first  == next(m.begin(), 3));
    168         assert(r.second == next(m.begin(), 3));
    169         r = m.equal_range(7);
    170         assert(r.first  == next(m.begin(), 3));
    171         assert(r.second == next(m.begin(), 6));
    172         r = m.equal_range(8);
    173         assert(r.first  == next(m.begin(), 6));
    174         assert(r.second == next(m.begin(), 6));
    175         r = m.equal_range(9);
    176         assert(r.first  == next(m.begin(), 6));
    177         assert(r.second == next(m.begin(), 9));
    178         r = m.equal_range(10);
    179         assert(r.first  == next(m.begin(), 9));
    180         assert(r.second == next(m.begin(), 9));
    181     }
    182     }
    183 #endif
    184 #if TEST_STD_VER > 11
    185     {
    186     typedef int V;
    187     typedef std::multiset<V, std::less<>> M;
    188     typedef std::pair<M::iterator, M::iterator> R;
    189     V ar[] =
    190     {
    191         5,
    192         5,
    193         5,
    194         7,
    195         7,
    196         7,
    197         9,
    198         9,
    199         9
    200     };
    201     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
    202     R r = m.equal_range(4);
    203     assert(r.first  == next(m.begin(), 0));
    204     assert(r.second == next(m.begin(), 0));
    205     r = m.equal_range(5);
    206     assert(r.first  == next(m.begin(), 0));
    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  == next(m.begin(), 9));
    222     assert(r.second == next(m.begin(), 9));
    223     }
    224 
    225     {
    226     typedef PrivateConstructor V;
    227     typedef std::multiset<V, std::less<>> M;
    228     typedef std::pair<M::iterator, M::iterator> R;
    229 
    230     M m;
    231     m.insert ( V::make ( 5 ));
    232     m.insert ( V::make ( 5 ));
    233     m.insert ( V::make ( 5 ));
    234     m.insert ( V::make ( 7 ));
    235     m.insert ( V::make ( 7 ));
    236     m.insert ( V::make ( 7 ));
    237     m.insert ( V::make ( 9 ));
    238     m.insert ( V::make ( 9 ));
    239     m.insert ( V::make ( 9 ));
    240 
    241     R r = m.equal_range(4);
    242     assert(r.first  == next(m.begin(), 0));
    243     assert(r.second == next(m.begin(), 0));
    244     r = m.equal_range(5);
    245     assert(r.first  == next(m.begin(), 0));
    246     assert(r.second == next(m.begin(), 3));
    247     r = m.equal_range(6);
    248     assert(r.first  == next(m.begin(), 3));
    249     assert(r.second == next(m.begin(), 3));
    250     r = m.equal_range(7);
    251     assert(r.first  == next(m.begin(), 3));
    252     assert(r.second == next(m.begin(), 6));
    253     r = m.equal_range(8);
    254     assert(r.first  == next(m.begin(), 6));
    255     assert(r.second == next(m.begin(), 6));
    256     r = m.equal_range(9);
    257     assert(r.first  == next(m.begin(), 6));
    258     assert(r.second == next(m.begin(), 9));
    259     r = m.equal_range(10);
    260     assert(r.first  == next(m.begin(), 9));
    261     assert(r.second == next(m.begin(), 9));
    262     }
    263 #endif
    264 }
    265