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

source code of libcxx/test/std/containers/associative/multimap/multimap.modifiers/erase_iter.pass.cpp