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

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