1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <map>
10 
11 // class map
12 
13 // iterator erase(const_iterator position);
14 
15 #include <map>
16 #include <cassert>
17 
18 #include "min_allocator.h"
19 
20 struct TemplateConstructor
21 {
22     template<typename T>
23     TemplateConstructor (const T&) {}
24 };
25 
26 bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
27 
28 int main(int, char**)
29 {
30     {
31         typedef std::map<int, double> M;
32         typedef std::pair<int, double> P;
33         typedef M::iterator I;
34         P ar[] =
35         {
36             P(1, 1.5),
37             P(2, 2.5),
38             P(3, 3.5),
39             P(4, 4.5),
40             P(5, 5.5),
41             P(6, 6.5),
42             P(7, 7.5),
43             P(8, 8.5),
44         };
45         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
46         assert(m.size() == 8);
47         I i = m.erase(next(m.cbegin(), 3));
48         assert(m.size() == 7);
49         assert(i == next(m.begin(), 3));
50         assert(m.begin()->first == 1);
51         assert(m.begin()->second == 1.5);
52         assert(next(m.begin())->first == 2);
53         assert(next(m.begin())->second == 2.5);
54         assert(next(m.begin(), 2)->first == 3);
55         assert(next(m.begin(), 2)->second == 3.5);
56         assert(next(m.begin(), 3)->first == 5);
57         assert(next(m.begin(), 3)->second == 5.5);
58         assert(next(m.begin(), 4)->first == 6);
59         assert(next(m.begin(), 4)->second == 6.5);
60         assert(next(m.begin(), 5)->first == 7);
61         assert(next(m.begin(), 5)->second == 7.5);
62         assert(next(m.begin(), 6)->first == 8);
63         assert(next(m.begin(), 6)->second == 8.5);
64 
65         i = m.erase(next(m.cbegin(), 0));
66         assert(m.size() == 6);
67         assert(i == m.begin());
68         assert(m.begin()->first == 2);
69         assert(m.begin()->second == 2.5);
70         assert(next(m.begin())->first == 3);
71         assert(next(m.begin())->second == 3.5);
72         assert(next(m.begin(), 2)->first == 5);
73         assert(next(m.begin(), 2)->second == 5.5);
74         assert(next(m.begin(), 3)->first == 6);
75         assert(next(m.begin(), 3)->second == 6.5);
76         assert(next(m.begin(), 4)->first == 7);
77         assert(next(m.begin(), 4)->second == 7.5);
78         assert(next(m.begin(), 5)->first == 8);
79         assert(next(m.begin(), 5)->second == 8.5);
80 
81         i = m.erase(next(m.cbegin(), 5));
82         assert(m.size() == 5);
83         assert(i == m.end());
84         assert(m.begin()->first == 2);
85         assert(m.begin()->second == 2.5);
86         assert(next(m.begin())->first == 3);
87         assert(next(m.begin())->second == 3.5);
88         assert(next(m.begin(), 2)->first == 5);
89         assert(next(m.begin(), 2)->second == 5.5);
90         assert(next(m.begin(), 3)->first == 6);
91         assert(next(m.begin(), 3)->second == 6.5);
92         assert(next(m.begin(), 4)->first == 7);
93         assert(next(m.begin(), 4)->second == 7.5);
94 
95         i = m.erase(next(m.cbegin(), 1));
96         assert(m.size() == 4);
97         assert(i == next(m.begin()));
98         assert(m.begin()->first == 2);
99         assert(m.begin()->second == 2.5);
100         assert(next(m.begin())->first == 5);
101         assert(next(m.begin())->second == 5.5);
102         assert(next(m.begin(), 2)->first == 6);
103         assert(next(m.begin(), 2)->second == 6.5);
104         assert(next(m.begin(), 3)->first == 7);
105         assert(next(m.begin(), 3)->second == 7.5);
106 
107         i = m.erase(next(m.cbegin(), 2));
108         assert(m.size() == 3);
109         assert(i == next(m.begin(), 2));
110         assert(m.begin()->first == 2);
111         assert(m.begin()->second == 2.5);
112         assert(next(m.begin())->first == 5);
113         assert(next(m.begin())->second == 5.5);
114         assert(next(m.begin(), 2)->first == 7);
115         assert(next(m.begin(), 2)->second == 7.5);
116 
117         i = m.erase(next(m.cbegin(), 2));
118         assert(m.size() == 2);
119         assert(i == next(m.begin(), 2));
120         assert(m.begin()->first == 2);
121         assert(m.begin()->second == 2.5);
122         assert(next(m.begin())->first == 5);
123         assert(next(m.begin())->second == 5.5);
124 
125         i = m.erase(next(m.cbegin(), 0));
126         assert(m.size() == 1);
127         assert(i == next(m.begin(), 0));
128         assert(m.begin()->first == 5);
129         assert(m.begin()->second == 5.5);
130 
131         i = m.erase(m.cbegin());
132         assert(m.size() == 0);
133         assert(i == m.begin());
134         assert(i == m.end());
135     }
136 #if TEST_STD_VER >= 11
137     {
138         typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
139         typedef std::pair<int, double> P;
140         typedef M::iterator I;
141         P ar[] =
142         {
143             P(1, 1.5),
144             P(2, 2.5),
145             P(3, 3.5),
146             P(4, 4.5),
147             P(5, 5.5),
148             P(6, 6.5),
149             P(7, 7.5),
150             P(8, 8.5),
151         };
152         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
153         assert(m.size() == 8);
154         I i = m.erase(next(m.cbegin(), 3));
155         assert(m.size() == 7);
156         assert(i == next(m.begin(), 3));
157         assert(m.begin()->first == 1);
158         assert(m.begin()->second == 1.5);
159         assert(next(m.begin())->first == 2);
160         assert(next(m.begin())->second == 2.5);
161         assert(next(m.begin(), 2)->first == 3);
162         assert(next(m.begin(), 2)->second == 3.5);
163         assert(next(m.begin(), 3)->first == 5);
164         assert(next(m.begin(), 3)->second == 5.5);
165         assert(next(m.begin(), 4)->first == 6);
166         assert(next(m.begin(), 4)->second == 6.5);
167         assert(next(m.begin(), 5)->first == 7);
168         assert(next(m.begin(), 5)->second == 7.5);
169         assert(next(m.begin(), 6)->first == 8);
170         assert(next(m.begin(), 6)->second == 8.5);
171 
172         i = m.erase(next(m.cbegin(), 0));
173         assert(m.size() == 6);
174         assert(i == m.begin());
175         assert(m.begin()->first == 2);
176         assert(m.begin()->second == 2.5);
177         assert(next(m.begin())->first == 3);
178         assert(next(m.begin())->second == 3.5);
179         assert(next(m.begin(), 2)->first == 5);
180         assert(next(m.begin(), 2)->second == 5.5);
181         assert(next(m.begin(), 3)->first == 6);
182         assert(next(m.begin(), 3)->second == 6.5);
183         assert(next(m.begin(), 4)->first == 7);
184         assert(next(m.begin(), 4)->second == 7.5);
185         assert(next(m.begin(), 5)->first == 8);
186         assert(next(m.begin(), 5)->second == 8.5);
187 
188         i = m.erase(next(m.cbegin(), 5));
189         assert(m.size() == 5);
190         assert(i == m.end());
191         assert(m.begin()->first == 2);
192         assert(m.begin()->second == 2.5);
193         assert(next(m.begin())->first == 3);
194         assert(next(m.begin())->second == 3.5);
195         assert(next(m.begin(), 2)->first == 5);
196         assert(next(m.begin(), 2)->second == 5.5);
197         assert(next(m.begin(), 3)->first == 6);
198         assert(next(m.begin(), 3)->second == 6.5);
199         assert(next(m.begin(), 4)->first == 7);
200         assert(next(m.begin(), 4)->second == 7.5);
201 
202         i = m.erase(next(m.cbegin(), 1));
203         assert(m.size() == 4);
204         assert(i == next(m.begin()));
205         assert(m.begin()->first == 2);
206         assert(m.begin()->second == 2.5);
207         assert(next(m.begin())->first == 5);
208         assert(next(m.begin())->second == 5.5);
209         assert(next(m.begin(), 2)->first == 6);
210         assert(next(m.begin(), 2)->second == 6.5);
211         assert(next(m.begin(), 3)->first == 7);
212         assert(next(m.begin(), 3)->second == 7.5);
213 
214         i = m.erase(next(m.cbegin(), 2));
215         assert(m.size() == 3);
216         assert(i == next(m.begin(), 2));
217         assert(m.begin()->first == 2);
218         assert(m.begin()->second == 2.5);
219         assert(next(m.begin())->first == 5);
220         assert(next(m.begin())->second == 5.5);
221         assert(next(m.begin(), 2)->first == 7);
222         assert(next(m.begin(), 2)->second == 7.5);
223 
224         i = m.erase(next(m.cbegin(), 2));
225         assert(m.size() == 2);
226         assert(i == next(m.begin(), 2));
227         assert(m.begin()->first == 2);
228         assert(m.begin()->second == 2.5);
229         assert(next(m.begin())->first == 5);
230         assert(next(m.begin())->second == 5.5);
231 
232         i = m.erase(next(m.cbegin(), 0));
233         assert(m.size() == 1);
234         assert(i == next(m.begin(), 0));
235         assert(m.begin()->first == 5);
236         assert(m.begin()->second == 5.5);
237 
238         i = m.erase(m.cbegin());
239         assert(m.size() == 0);
240         assert(i == m.begin());
241         assert(i == m.end());
242     }
243 #endif
244 #if TEST_STD_VER >= 14
245     {
246     //  This is LWG #2059
247         typedef TemplateConstructor T;
248         typedef std::map<T, int> C;
249         typedef C::iterator I;
250 
251         C c;
252         T a{0};
253         I it = c.find(a);
254         if (it != c.end())
255             c.erase(it);
256     }
257 #endif
258 
259   return 0;
260 }
261