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