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 // iterator erase(const_iterator position);
     15 
     16 #include <set>
     17 #include <cassert>
     18 
     19 #include "min_allocator.h"
     20 
     21 struct TemplateConstructor
     22 {
     23     template<typename T>
     24     TemplateConstructor (const T&) {}
     25 };
     26 
     27 bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
     28 
     29 int main()
     30 {
     31     {
     32         typedef std::multiset<int> M;
     33         typedef int V;
     34         typedef M::iterator I;
     35         V ar[] =
     36         {
     37             1,
     38             2,
     39             3,
     40             4,
     41             5,
     42             6,
     43             7,
     44             8
     45         };
     46         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
     47         assert(m.size() == 8);
     48         I i = m.erase(next(m.cbegin(), 3));
     49         assert(m.size() == 7);
     50         assert(i == next(m.begin(), 3));
     51         assert(*next(m.begin(), 0) == 1);
     52         assert(*next(m.begin(), 1) == 2);
     53         assert(*next(m.begin(), 2) == 3);
     54         assert(*next(m.begin(), 3) == 5);
     55         assert(*next(m.begin(), 4) == 6);
     56         assert(*next(m.begin(), 5) == 7);
     57         assert(*next(m.begin(), 6) == 8);
     58 
     59         i = m.erase(next(m.cbegin(), 0));
     60         assert(m.size() == 6);
     61         assert(i == m.begin());
     62         assert(*next(m.begin(), 0) == 2);
     63         assert(*next(m.begin(), 1) == 3);
     64         assert(*next(m.begin(), 2) == 5);
     65         assert(*next(m.begin(), 3) == 6);
     66         assert(*next(m.begin(), 4) == 7);
     67         assert(*next(m.begin(), 5) == 8);
     68 
     69         i = m.erase(next(m.cbegin(), 5));
     70         assert(m.size() == 5);
     71         assert(i == m.end());
     72         assert(*next(m.begin(), 0) == 2);
     73         assert(*next(m.begin(), 1) == 3);
     74         assert(*next(m.begin(), 2) == 5);
     75         assert(*next(m.begin(), 3) == 6);
     76         assert(*next(m.begin(), 4) == 7);
     77 
     78         i = m.erase(next(m.cbegin(), 1));
     79         assert(m.size() == 4);
     80         assert(i == next(m.begin()));
     81         assert(*next(m.begin(), 0) == 2);
     82         assert(*next(m.begin(), 1) == 5);
     83         assert(*next(m.begin(), 2) == 6);
     84         assert(*next(m.begin(), 3) == 7);
     85 
     86         i = m.erase(next(m.cbegin(), 2));
     87         assert(m.size() == 3);
     88         assert(i == next(m.begin(), 2));
     89         assert(*next(m.begin(), 0) == 2);
     90         assert(*next(m.begin(), 1) == 5);
     91         assert(*next(m.begin(), 2) == 7);
     92 
     93         i = m.erase(next(m.cbegin(), 2));
     94         assert(m.size() == 2);
     95         assert(i == next(m.begin(), 2));
     96         assert(*next(m.begin(), 0) == 2);
     97         assert(*next(m.begin(), 1) == 5);
     98 
     99         i = m.erase(next(m.cbegin(), 0));
    100         assert(m.size() == 1);
    101         assert(i == next(m.begin(), 0));
    102         assert(*next(m.begin(), 0) == 5);
    103 
    104         i = m.erase(m.cbegin());
    105         assert(m.size() == 0);
    106         assert(i == m.begin());
    107         assert(i == m.end());
    108     }
    109 #if TEST_STD_VER >= 11
    110     {
    111         typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
    112         typedef int V;
    113         typedef M::iterator I;
    114         V ar[] =
    115         {
    116             1,
    117             2,
    118             3,
    119             4,
    120             5,
    121             6,
    122             7,
    123             8
    124         };
    125         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
    126         assert(m.size() == 8);
    127         I i = m.erase(next(m.cbegin(), 3));
    128         assert(m.size() == 7);
    129         assert(i == next(m.begin(), 3));
    130         assert(*next(m.begin(), 0) == 1);
    131         assert(*next(m.begin(), 1) == 2);
    132         assert(*next(m.begin(), 2) == 3);
    133         assert(*next(m.begin(), 3) == 5);
    134         assert(*next(m.begin(), 4) == 6);
    135         assert(*next(m.begin(), 5) == 7);
    136         assert(*next(m.begin(), 6) == 8);
    137 
    138         i = m.erase(next(m.cbegin(), 0));
    139         assert(m.size() == 6);
    140         assert(i == m.begin());
    141         assert(*next(m.begin(), 0) == 2);
    142         assert(*next(m.begin(), 1) == 3);
    143         assert(*next(m.begin(), 2) == 5);
    144         assert(*next(m.begin(), 3) == 6);
    145         assert(*next(m.begin(), 4) == 7);
    146         assert(*next(m.begin(), 5) == 8);
    147 
    148         i = m.erase(next(m.cbegin(), 5));
    149         assert(m.size() == 5);
    150         assert(i == m.end());
    151         assert(*next(m.begin(), 0) == 2);
    152         assert(*next(m.begin(), 1) == 3);
    153         assert(*next(m.begin(), 2) == 5);
    154         assert(*next(m.begin(), 3) == 6);
    155         assert(*next(m.begin(), 4) == 7);
    156 
    157         i = m.erase(next(m.cbegin(), 1));
    158         assert(m.size() == 4);
    159         assert(i == next(m.begin()));
    160         assert(*next(m.begin(), 0) == 2);
    161         assert(*next(m.begin(), 1) == 5);
    162         assert(*next(m.begin(), 2) == 6);
    163         assert(*next(m.begin(), 3) == 7);
    164 
    165         i = m.erase(next(m.cbegin(), 2));
    166         assert(m.size() == 3);
    167         assert(i == next(m.begin(), 2));
    168         assert(*next(m.begin(), 0) == 2);
    169         assert(*next(m.begin(), 1) == 5);
    170         assert(*next(m.begin(), 2) == 7);
    171 
    172         i = m.erase(next(m.cbegin(), 2));
    173         assert(m.size() == 2);
    174         assert(i == next(m.begin(), 2));
    175         assert(*next(m.begin(), 0) == 2);
    176         assert(*next(m.begin(), 1) == 5);
    177 
    178         i = m.erase(next(m.cbegin(), 0));
    179         assert(m.size() == 1);
    180         assert(i == next(m.begin(), 0));
    181         assert(*next(m.begin(), 0) == 5);
    182 
    183         i = m.erase(m.cbegin());
    184         assert(m.size() == 0);
    185         assert(i == m.begin());
    186         assert(i == m.end());
    187     }
    188 #endif
    189 #if TEST_STD_VER >= 14
    190     {
    191     //  This is LWG #2059
    192         typedef TemplateConstructor T;
    193         typedef std::multiset<T> C;
    194         typedef C::iterator I;
    195 
    196         C c;
    197         T a{0};
    198         I it = c.find(a);
    199         if (it != c.end())
    200             c.erase(it);
    201     }
    202 #endif
    203 }
    204