Home | History | Annotate | Download | only in multimap.modifiers
      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 erase(const_iterator position);
     15 
     16 #include <map>
     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::multimap<int, double> M;
     33         typedef std::pair<int, double> P;
     34         typedef M::iterator I;
     35         P ar[] =
     36         {
     37             P(1, 1),
     38             P(1, 1.5),
     39             P(1, 2),
     40             P(2, 1),
     41             P(2, 1.5),
     42             P(2, 2),
     43             P(3, 1),
     44             P(3, 1.5),
     45             P(3, 2),
     46         };
     47         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
     48         assert(m.size() == 9);
     49         I i = m.erase(next(m.cbegin(), 3));
     50         assert(m.size() == 8);
     51         assert(i == next(m.begin(), 3));
     52         assert(m.begin()->first == 1);
     53         assert(m.begin()->second == 1);
     54         assert(next(m.begin())->first == 1);
     55         assert(next(m.begin())->second == 1.5);
     56         assert(next(m.begin(), 2)->first == 1);
     57         assert(next(m.begin(), 2)->second == 2);
     58         assert(next(m.begin(), 3)->first == 2);
     59         assert(next(m.begin(), 3)->second == 1.5);
     60         assert(next(m.begin(), 4)->first == 2);
     61         assert(next(m.begin(), 4)->second == 2);
     62         assert(next(m.begin(), 5)->first == 3);
     63         assert(next(m.begin(), 5)->second == 1);
     64         assert(next(m.begin(), 6)->first == 3);
     65         assert(next(m.begin(), 6)->second == 1.5);
     66         assert(next(m.begin(), 7)->first == 3);
     67         assert(next(m.begin(), 7)->second == 2);
     68 
     69         i = m.erase(next(m.cbegin(), 0));
     70         assert(m.size() == 7);
     71         assert(i == m.begin());
     72         assert(next(m.begin(), 0)->first == 1);
     73         assert(next(m.begin(), 0)->second == 1.5);
     74         assert(next(m.begin(), 1)->first == 1);
     75         assert(next(m.begin(), 1)->second == 2);
     76         assert(next(m.begin(), 2)->first == 2);
     77         assert(next(m.begin(), 2)->second == 1.5);
     78         assert(next(m.begin(), 3)->first == 2);
     79         assert(next(m.begin(), 3)->second == 2);
     80         assert(next(m.begin(), 4)->first == 3);
     81         assert(next(m.begin(), 4)->second == 1);
     82         assert(next(m.begin(), 5)->first == 3);
     83         assert(next(m.begin(), 5)->second == 1.5);
     84         assert(next(m.begin(), 6)->first == 3);
     85         assert(next(m.begin(), 6)->second == 2);
     86 
     87         i = m.erase(next(m.cbegin(), 5));
     88         assert(m.size() == 6);
     89         assert(i == prev(m.end()));
     90         assert(next(m.begin(), 0)->first == 1);
     91         assert(next(m.begin(), 0)->second == 1.5);
     92         assert(next(m.begin(), 1)->first == 1);
     93         assert(next(m.begin(), 1)->second == 2);
     94         assert(next(m.begin(), 2)->first == 2);
     95         assert(next(m.begin(), 2)->second == 1.5);
     96         assert(next(m.begin(), 3)->first == 2);
     97         assert(next(m.begin(), 3)->second == 2);
     98         assert(next(m.begin(), 4)->first == 3);
     99         assert(next(m.begin(), 4)->second == 1);
    100         assert(next(m.begin(), 5)->first == 3);
    101         assert(next(m.begin(), 5)->second == 2);
    102 
    103         i = m.erase(next(m.cbegin(), 1));
    104         assert(m.size() == 5);
    105         assert(i == next(m.begin()));
    106         assert(next(m.begin(), 0)->first == 1);
    107         assert(next(m.begin(), 0)->second == 1.5);
    108         assert(next(m.begin(), 1)->first == 2);
    109         assert(next(m.begin(), 1)->second == 1.5);
    110         assert(next(m.begin(), 2)->first == 2);
    111         assert(next(m.begin(), 2)->second == 2);
    112         assert(next(m.begin(), 3)->first == 3);
    113         assert(next(m.begin(), 3)->second == 1);
    114         assert(next(m.begin(), 4)->first == 3);
    115         assert(next(m.begin(), 4)->second == 2);
    116 
    117         i = m.erase(next(m.cbegin(), 2));
    118         assert(m.size() == 4);
    119         assert(i == next(m.begin(), 2));
    120         assert(next(m.begin(), 0)->first == 1);
    121         assert(next(m.begin(), 0)->second == 1.5);
    122         assert(next(m.begin(), 1)->first == 2);
    123         assert(next(m.begin(), 1)->second == 1.5);
    124         assert(next(m.begin(), 2)->first == 3);
    125         assert(next(m.begin(), 2)->second == 1);
    126         assert(next(m.begin(), 3)->first == 3);
    127         assert(next(m.begin(), 3)->second == 2);
    128 
    129         i = m.erase(next(m.cbegin(), 2));
    130         assert(m.size() == 3);
    131         assert(i == next(m.begin(), 2));
    132         assert(next(m.begin(), 0)->first == 1);
    133         assert(next(m.begin(), 0)->second == 1.5);
    134         assert(next(m.begin(), 1)->first == 2);
    135         assert(next(m.begin(), 1)->second == 1.5);
    136         assert(next(m.begin(), 2)->first == 3);
    137         assert(next(m.begin(), 2)->second == 2);
    138 
    139         i = m.erase(next(m.cbegin(), 0));
    140         assert(m.size() == 2);
    141         assert(i == next(m.begin(), 0));
    142         assert(next(m.begin(), 0)->first == 2);
    143         assert(next(m.begin(), 0)->second == 1.5);
    144         assert(next(m.begin(), 1)->first == 3);
    145         assert(next(m.begin(), 1)->second == 2);
    146 
    147         i = m.erase(next(m.cbegin(), 1));
    148         assert(m.size() == 1);
    149         assert(i == m.end());
    150         assert(next(m.begin(), 0)->first == 2);
    151         assert(next(m.begin(), 0)->second == 1.5);
    152 
    153         i = m.erase(m.cbegin());
    154         assert(m.size() == 0);
    155         assert(i == m.begin());
    156         assert(i == m.end());
    157     }
    158 #if __cplusplus >= 201103L
    159     {
    160         typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
    161         typedef std::pair<int, double> P;
    162         typedef M::iterator I;
    163         P ar[] =
    164         {
    165             P(1, 1),
    166             P(1, 1.5),
    167             P(1, 2),
    168             P(2, 1),
    169             P(2, 1.5),
    170             P(2, 2),
    171             P(3, 1),
    172             P(3, 1.5),
    173             P(3, 2),
    174         };
    175         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
    176         assert(m.size() == 9);
    177         I i = m.erase(next(m.cbegin(), 3));
    178         assert(m.size() == 8);
    179         assert(i == next(m.begin(), 3));
    180         assert(m.begin()->first == 1);
    181         assert(m.begin()->second == 1);
    182         assert(next(m.begin())->first == 1);
    183         assert(next(m.begin())->second == 1.5);
    184         assert(next(m.begin(), 2)->first == 1);
    185         assert(next(m.begin(), 2)->second == 2);
    186         assert(next(m.begin(), 3)->first == 2);
    187         assert(next(m.begin(), 3)->second == 1.5);
    188         assert(next(m.begin(), 4)->first == 2);
    189         assert(next(m.begin(), 4)->second == 2);
    190         assert(next(m.begin(), 5)->first == 3);
    191         assert(next(m.begin(), 5)->second == 1);
    192         assert(next(m.begin(), 6)->first == 3);
    193         assert(next(m.begin(), 6)->second == 1.5);
    194         assert(next(m.begin(), 7)->first == 3);
    195         assert(next(m.begin(), 7)->second == 2);
    196 
    197         i = m.erase(next(m.cbegin(), 0));
    198         assert(m.size() == 7);
    199         assert(i == m.begin());
    200         assert(next(m.begin(), 0)->first == 1);
    201         assert(next(m.begin(), 0)->second == 1.5);
    202         assert(next(m.begin(), 1)->first == 1);
    203         assert(next(m.begin(), 1)->second == 2);
    204         assert(next(m.begin(), 2)->first == 2);
    205         assert(next(m.begin(), 2)->second == 1.5);
    206         assert(next(m.begin(), 3)->first == 2);
    207         assert(next(m.begin(), 3)->second == 2);
    208         assert(next(m.begin(), 4)->first == 3);
    209         assert(next(m.begin(), 4)->second == 1);
    210         assert(next(m.begin(), 5)->first == 3);
    211         assert(next(m.begin(), 5)->second == 1.5);
    212         assert(next(m.begin(), 6)->first == 3);
    213         assert(next(m.begin(), 6)->second == 2);
    214 
    215         i = m.erase(next(m.cbegin(), 5));
    216         assert(m.size() == 6);
    217         assert(i == prev(m.end()));
    218         assert(next(m.begin(), 0)->first == 1);
    219         assert(next(m.begin(), 0)->second == 1.5);
    220         assert(next(m.begin(), 1)->first == 1);
    221         assert(next(m.begin(), 1)->second == 2);
    222         assert(next(m.begin(), 2)->first == 2);
    223         assert(next(m.begin(), 2)->second == 1.5);
    224         assert(next(m.begin(), 3)->first == 2);
    225         assert(next(m.begin(), 3)->second == 2);
    226         assert(next(m.begin(), 4)->first == 3);
    227         assert(next(m.begin(), 4)->second == 1);
    228         assert(next(m.begin(), 5)->first == 3);
    229         assert(next(m.begin(), 5)->second == 2);
    230 
    231         i = m.erase(next(m.cbegin(), 1));
    232         assert(m.size() == 5);
    233         assert(i == next(m.begin()));
    234         assert(next(m.begin(), 0)->first == 1);
    235         assert(next(m.begin(), 0)->second == 1.5);
    236         assert(next(m.begin(), 1)->first == 2);
    237         assert(next(m.begin(), 1)->second == 1.5);
    238         assert(next(m.begin(), 2)->first == 2);
    239         assert(next(m.begin(), 2)->second == 2);
    240         assert(next(m.begin(), 3)->first == 3);
    241         assert(next(m.begin(), 3)->second == 1);
    242         assert(next(m.begin(), 4)->first == 3);
    243         assert(next(m.begin(), 4)->second == 2);
    244 
    245         i = m.erase(next(m.cbegin(), 2));
    246         assert(m.size() == 4);
    247         assert(i == next(m.begin(), 2));
    248         assert(next(m.begin(), 0)->first == 1);
    249         assert(next(m.begin(), 0)->second == 1.5);
    250         assert(next(m.begin(), 1)->first == 2);
    251         assert(next(m.begin(), 1)->second == 1.5);
    252         assert(next(m.begin(), 2)->first == 3);
    253         assert(next(m.begin(), 2)->second == 1);
    254         assert(next(m.begin(), 3)->first == 3);
    255         assert(next(m.begin(), 3)->second == 2);
    256 
    257         i = m.erase(next(m.cbegin(), 2));
    258         assert(m.size() == 3);
    259         assert(i == next(m.begin(), 2));
    260         assert(next(m.begin(), 0)->first == 1);
    261         assert(next(m.begin(), 0)->second == 1.5);
    262         assert(next(m.begin(), 1)->first == 2);
    263         assert(next(m.begin(), 1)->second == 1.5);
    264         assert(next(m.begin(), 2)->first == 3);
    265         assert(next(m.begin(), 2)->second == 2);
    266 
    267         i = m.erase(next(m.cbegin(), 0));
    268         assert(m.size() == 2);
    269         assert(i == next(m.begin(), 0));
    270         assert(next(m.begin(), 0)->first == 2);
    271         assert(next(m.begin(), 0)->second == 1.5);
    272         assert(next(m.begin(), 1)->first == 3);
    273         assert(next(m.begin(), 1)->second == 2);
    274 
    275         i = m.erase(next(m.cbegin(), 1));
    276         assert(m.size() == 1);
    277         assert(i == m.end());
    278         assert(next(m.begin(), 0)->first == 2);
    279         assert(next(m.begin(), 0)->second == 1.5);
    280 
    281         i = m.erase(m.cbegin());
    282         assert(m.size() == 0);
    283         assert(i == m.begin());
    284         assert(i == m.end());
    285     }
    286 #endif
    287 #if __cplusplus >= 201402L
    288     {
    289     //  This is LWG #2059
    290         typedef TemplateConstructor T;
    291         typedef std::multimap<T, int> C;
    292         typedef C::iterator I;
    293 
    294         C c;
    295         T a{0};
    296         I it = c.find(a);
    297         if (it != c.end())
    298             c.erase(it);
    299     }
    300 #endif
    301 }
    302