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 // <string>
10 
11 // basic_string<charT,traits,Allocator>&
12 //   erase(size_type pos = 0, size_type n = npos); // constexpr since C++20
13 
14 #include <string>
15 #include <stdexcept>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 #include "min_allocator.h"
20 
21 template <class S>
22 TEST_CONSTEXPR_CXX20 void
test(S s,typename S::size_type pos,typename S::size_type n,S expected)23 test(S s, typename S::size_type pos, typename S::size_type n, S expected)
24 {
25     const typename S::size_type old_size = s.size();
26     S s0 = s;
27     if (pos <= old_size)
28     {
29         s.erase(pos, n);
30         LIBCPP_ASSERT(s.__invariants());
31         assert(s[s.size()] == typename S::value_type());
32         assert(s == expected);
33     }
34 #ifndef TEST_HAS_NO_EXCEPTIONS
35     else if (!TEST_IS_CONSTANT_EVALUATED)
36     {
37         try
38         {
39             s.erase(pos, n);
40             assert(false);
41         }
42         catch (std::out_of_range&)
43         {
44             assert(pos > old_size);
45             assert(s == s0);
46         }
47     }
48 #endif
49 }
50 
51 template <class S>
52 TEST_CONSTEXPR_CXX20 void
test(S s,typename S::size_type pos,S expected)53 test(S s, typename S::size_type pos, S expected)
54 {
55     const typename S::size_type old_size = s.size();
56     S s0 = s;
57     if (pos <= old_size)
58     {
59         s.erase(pos);
60         LIBCPP_ASSERT(s.__invariants());
61         assert(s[s.size()] == typename S::value_type());
62         assert(s == expected);
63     }
64 #ifndef TEST_HAS_NO_EXCEPTIONS
65     else if (!TEST_IS_CONSTANT_EVALUATED)
66     {
67         try
68         {
69             s.erase(pos);
70             assert(false);
71         }
72         catch (std::out_of_range&)
73         {
74             assert(pos > old_size);
75             assert(s == s0);
76         }
77     }
78 #endif
79 }
80 
81 template <class S>
82 TEST_CONSTEXPR_CXX20 void
test(S s,S expected)83 test(S s, S expected)
84 {
85     s.erase();
86     LIBCPP_ASSERT(s.__invariants());
87     assert(s[s.size()] == typename S::value_type());
88     assert(s == expected);
89 }
90 
test()91 TEST_CONSTEXPR_CXX20 bool test() {
92   {
93     typedef std::string S;
94     test(S(""), 0, 0, S(""));
95     test(S(""), 0, 1, S(""));
96     test(S(""), 1, 0, S("can't happen"));
97     test(S("abcde"), 0, 0, S("abcde"));
98     test(S("abcde"), 0, 1, S("bcde"));
99     test(S("abcde"), 0, 2, S("cde"));
100     test(S("abcde"), 0, 4, S("e"));
101     test(S("abcde"), 0, 5, S(""));
102     test(S("abcde"), 0, 6, S(""));
103     test(S("abcde"), 1, 0, S("abcde"));
104     test(S("abcde"), 1, 1, S("acde"));
105     test(S("abcde"), 1, 2, S("ade"));
106     test(S("abcde"), 1, 3, S("ae"));
107     test(S("abcde"), 1, 4, S("a"));
108     test(S("abcde"), 1, 5, S("a"));
109     test(S("abcde"), 2, 0, S("abcde"));
110     test(S("abcde"), 2, 1, S("abde"));
111     test(S("abcde"), 2, 2, S("abe"));
112     test(S("abcde"), 2, 3, S("ab"));
113     test(S("abcde"), 2, 4, S("ab"));
114     test(S("abcde"), 4, 0, S("abcde"));
115     test(S("abcde"), 4, 1, S("abcd"));
116     test(S("abcde"), 4, 2, S("abcd"));
117     test(S("abcde"), 5, 0, S("abcde"));
118     test(S("abcde"), 5, 1, S("abcde"));
119     test(S("abcde"), 6, 0, S("can't happen"));
120     test(S("abcdefghij"), 0, 0, S("abcdefghij"));
121     test(S("abcdefghij"), 0, 1, S("bcdefghij"));
122     test(S("abcdefghij"), 0, 5, S("fghij"));
123     test(S("abcdefghij"), 0, 9, S("j"));
124     test(S("abcdefghij"), 0, 10, S(""));
125     test(S("abcdefghij"), 0, 11, S(""));
126     test(S("abcdefghij"), 1, 0, S("abcdefghij"));
127     test(S("abcdefghij"), 1, 1, S("acdefghij"));
128     test(S("abcdefghij"), 1, 4, S("afghij"));
129     test(S("abcdefghij"), 1, 8, S("aj"));
130     test(S("abcdefghij"), 1, 9, S("a"));
131     test(S("abcdefghij"), 1, 10, S("a"));
132     test(S("abcdefghij"), 5, 0, S("abcdefghij"));
133     test(S("abcdefghij"), 5, 1, S("abcdeghij"));
134     test(S("abcdefghij"), 5, 2, S("abcdehij"));
135     test(S("abcdefghij"), 5, 4, S("abcdej"));
136     test(S("abcdefghij"), 5, 5, S("abcde"));
137     test(S("abcdefghij"), 5, 6, S("abcde"));
138     test(S("abcdefghij"), 9, 0, S("abcdefghij"));
139     test(S("abcdefghij"), 9, 1, S("abcdefghi"));
140     test(S("abcdefghij"), 9, 2, S("abcdefghi"));
141     test(S("abcdefghij"), 10, 0, S("abcdefghij"));
142     test(S("abcdefghij"), 10, 1, S("abcdefghij"));
143     test(S("abcdefghij"), 11, 0, S("can't happen"));
144     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"));
145     test(S("abcdefghijklmnopqrst"), 0, 1, S("bcdefghijklmnopqrst"));
146     test(S("abcdefghijklmnopqrst"), 0, 10, S("klmnopqrst"));
147     test(S("abcdefghijklmnopqrst"), 0, 19, S("t"));
148     test(S("abcdefghijklmnopqrst"), 0, 20, S(""));
149     test(S("abcdefghijklmnopqrst"), 0, 21, S(""));
150     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"));
151     test(S("abcdefghijklmnopqrst"), 1, 1, S("acdefghijklmnopqrst"));
152     test(S("abcdefghijklmnopqrst"), 1, 9, S("aklmnopqrst"));
153     test(S("abcdefghijklmnopqrst"), 1, 18, S("at"));
154     test(S("abcdefghijklmnopqrst"), 1, 19, S("a"));
155     test(S("abcdefghijklmnopqrst"), 1, 20, S("a"));
156     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"));
157     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijlmnopqrst"));
158     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijpqrst"));
159     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijt"));
160     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"));
161     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"));
162     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"));
163     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrs"));
164     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrs"));
165     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"));
166     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"));
167     test(S("abcdefghijklmnopqrst"), 21, 0, S("can't happen"));
168 
169     test(S(""), 0, S(""));
170     test(S(""), 1, S("can't happen"));
171     test(S("abcde"), 0, S(""));
172     test(S("abcde"), 1, S("a"));
173     test(S("abcde"), 2, S("ab"));
174     test(S("abcde"), 4, S("abcd"));
175     test(S("abcde"), 5, S("abcde"));
176     test(S("abcde"), 6, S("can't happen"));
177     test(S("abcdefghij"), 0, S(""));
178     test(S("abcdefghij"), 1, S("a"));
179     test(S("abcdefghij"), 5, S("abcde"));
180     test(S("abcdefghij"), 9, S("abcdefghi"));
181     test(S("abcdefghij"), 10, S("abcdefghij"));
182     test(S("abcdefghij"), 11, S("can't happen"));
183     test(S("abcdefghijklmnopqrst"), 0, S(""));
184     test(S("abcdefghijklmnopqrst"), 1, S("a"));
185     test(S("abcdefghijklmnopqrst"), 10, S("abcdefghij"));
186     test(S("abcdefghijklmnopqrst"), 19, S("abcdefghijklmnopqrs"));
187     test(S("abcdefghijklmnopqrst"), 20, S("abcdefghijklmnopqrst"));
188     test(S("abcdefghijklmnopqrst"), 21, S("can't happen"));
189 
190     test(S(""), S(""));
191     test(S("abcde"), S(""));
192     test(S("abcdefghij"), S(""));
193     test(S("abcdefghijklmnopqrst"), S(""));
194   }
195 #if TEST_STD_VER >= 11
196   {
197     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
198     test(S(""), 0, 0, S(""));
199     test(S(""), 0, 1, S(""));
200     test(S(""), 1, 0, S("can't happen"));
201     test(S("abcde"), 0, 0, S("abcde"));
202     test(S("abcde"), 0, 1, S("bcde"));
203     test(S("abcde"), 0, 2, S("cde"));
204     test(S("abcde"), 0, 4, S("e"));
205     test(S("abcde"), 0, 5, S(""));
206     test(S("abcde"), 0, 6, S(""));
207     test(S("abcde"), 1, 0, S("abcde"));
208     test(S("abcde"), 1, 1, S("acde"));
209     test(S("abcde"), 1, 2, S("ade"));
210     test(S("abcde"), 1, 3, S("ae"));
211     test(S("abcde"), 1, 4, S("a"));
212     test(S("abcde"), 1, 5, S("a"));
213     test(S("abcde"), 2, 0, S("abcde"));
214     test(S("abcde"), 2, 1, S("abde"));
215     test(S("abcde"), 2, 2, S("abe"));
216     test(S("abcde"), 2, 3, S("ab"));
217     test(S("abcde"), 2, 4, S("ab"));
218     test(S("abcde"), 4, 0, S("abcde"));
219     test(S("abcde"), 4, 1, S("abcd"));
220     test(S("abcde"), 4, 2, S("abcd"));
221     test(S("abcde"), 5, 0, S("abcde"));
222     test(S("abcde"), 5, 1, S("abcde"));
223     test(S("abcde"), 6, 0, S("can't happen"));
224     test(S("abcdefghij"), 0, 0, S("abcdefghij"));
225     test(S("abcdefghij"), 0, 1, S("bcdefghij"));
226     test(S("abcdefghij"), 0, 5, S("fghij"));
227     test(S("abcdefghij"), 0, 9, S("j"));
228     test(S("abcdefghij"), 0, 10, S(""));
229     test(S("abcdefghij"), 0, 11, S(""));
230     test(S("abcdefghij"), 1, 0, S("abcdefghij"));
231     test(S("abcdefghij"), 1, 1, S("acdefghij"));
232     test(S("abcdefghij"), 1, 4, S("afghij"));
233     test(S("abcdefghij"), 1, 8, S("aj"));
234     test(S("abcdefghij"), 1, 9, S("a"));
235     test(S("abcdefghij"), 1, 10, S("a"));
236     test(S("abcdefghij"), 5, 0, S("abcdefghij"));
237     test(S("abcdefghij"), 5, 1, S("abcdeghij"));
238     test(S("abcdefghij"), 5, 2, S("abcdehij"));
239     test(S("abcdefghij"), 5, 4, S("abcdej"));
240     test(S("abcdefghij"), 5, 5, S("abcde"));
241     test(S("abcdefghij"), 5, 6, S("abcde"));
242     test(S("abcdefghij"), 9, 0, S("abcdefghij"));
243     test(S("abcdefghij"), 9, 1, S("abcdefghi"));
244     test(S("abcdefghij"), 9, 2, S("abcdefghi"));
245     test(S("abcdefghij"), 10, 0, S("abcdefghij"));
246     test(S("abcdefghij"), 10, 1, S("abcdefghij"));
247     test(S("abcdefghij"), 11, 0, S("can't happen"));
248     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"));
249     test(S("abcdefghijklmnopqrst"), 0, 1, S("bcdefghijklmnopqrst"));
250     test(S("abcdefghijklmnopqrst"), 0, 10, S("klmnopqrst"));
251     test(S("abcdefghijklmnopqrst"), 0, 19, S("t"));
252     test(S("abcdefghijklmnopqrst"), 0, 20, S(""));
253     test(S("abcdefghijklmnopqrst"), 0, 21, S(""));
254     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"));
255     test(S("abcdefghijklmnopqrst"), 1, 1, S("acdefghijklmnopqrst"));
256     test(S("abcdefghijklmnopqrst"), 1, 9, S("aklmnopqrst"));
257     test(S("abcdefghijklmnopqrst"), 1, 18, S("at"));
258     test(S("abcdefghijklmnopqrst"), 1, 19, S("a"));
259     test(S("abcdefghijklmnopqrst"), 1, 20, S("a"));
260     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"));
261     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijlmnopqrst"));
262     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijpqrst"));
263     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijt"));
264     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"));
265     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"));
266     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"));
267     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrs"));
268     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrs"));
269     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"));
270     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"));
271     test(S("abcdefghijklmnopqrst"), 21, 0, S("can't happen"));
272 
273     test(S(""), 0, S(""));
274     test(S(""), 1, S("can't happen"));
275     test(S("abcde"), 0, S(""));
276     test(S("abcde"), 1, S("a"));
277     test(S("abcde"), 2, S("ab"));
278     test(S("abcde"), 4, S("abcd"));
279     test(S("abcde"), 5, S("abcde"));
280     test(S("abcde"), 6, S("can't happen"));
281     test(S("abcdefghij"), 0, S(""));
282     test(S("abcdefghij"), 1, S("a"));
283     test(S("abcdefghij"), 5, S("abcde"));
284     test(S("abcdefghij"), 9, S("abcdefghi"));
285     test(S("abcdefghij"), 10, S("abcdefghij"));
286     test(S("abcdefghij"), 11, S("can't happen"));
287     test(S("abcdefghijklmnopqrst"), 0, S(""));
288     test(S("abcdefghijklmnopqrst"), 1, S("a"));
289     test(S("abcdefghijklmnopqrst"), 10, S("abcdefghij"));
290     test(S("abcdefghijklmnopqrst"), 19, S("abcdefghijklmnopqrs"));
291     test(S("abcdefghijklmnopqrst"), 20, S("abcdefghijklmnopqrst"));
292     test(S("abcdefghijklmnopqrst"), 21, S("can't happen"));
293 
294     test(S(""), S(""));
295     test(S("abcde"), S(""));
296     test(S("abcdefghij"), S(""));
297     test(S("abcdefghijklmnopqrst"), S(""));
298   }
299 #endif
300 
301   return true;
302 }
303 
main(int,char **)304 int main(int, char**)
305 {
306   test();
307 #if TEST_STD_VER > 17
308   static_assert(test());
309 #endif
310 
311   return 0;
312 }
313