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 //   replace(const_iterator i1, const_iterator i2, const charT* s); // constexpr since C++20
13 
14 #include <stdio.h>
15 
16 #include <string>
17 #include <algorithm>
18 #include <cassert>
19 
20 #include "test_macros.h"
21 #include "min_allocator.h"
22 
23 template <class S>
24 TEST_CONSTEXPR_CXX20 void
test(S s,typename S::size_type pos1,typename S::size_type n1,const typename S::value_type * str,S expected)25 test(S s, typename S::size_type pos1, typename S::size_type n1, const typename S::value_type* str, S expected) {
26   typename S::size_type old_size   = s.size();
27   typename S::const_iterator first = s.begin() + pos1;
28   typename S::const_iterator last  = s.begin() + pos1 + n1;
29   typename S::size_type xlen       = last - first;
30   s.replace(first, last, str);
31   LIBCPP_ASSERT(s.__invariants());
32   assert(s == expected);
33   typename S::size_type rlen = S::traits_type::length(str);
34   assert(s.size() == old_size - xlen + rlen);
35 }
36 
37 template <class S>
test0()38 TEST_CONSTEXPR_CXX20 bool test0() {
39   test(S(""), 0, 0, "", S(""));
40   test(S(""), 0, 0, "12345", S("12345"));
41   test(S(""), 0, 0, "1234567890", S("1234567890"));
42   test(S(""), 0, 0, "12345678901234567890", S("12345678901234567890"));
43   test(S("abcde"), 0, 0, "", S("abcde"));
44   test(S("abcde"), 0, 0, "12345", S("12345abcde"));
45   test(S("abcde"), 0, 0, "1234567890", S("1234567890abcde"));
46   test(S("abcde"), 0, 0, "12345678901234567890", S("12345678901234567890abcde"));
47   test(S("abcde"), 0, 1, "", S("bcde"));
48   test(S("abcde"), 0, 1, "12345", S("12345bcde"));
49   test(S("abcde"), 0, 1, "1234567890", S("1234567890bcde"));
50   test(S("abcde"), 0, 1, "12345678901234567890", S("12345678901234567890bcde"));
51   test(S("abcde"), 0, 2, "", S("cde"));
52   test(S("abcde"), 0, 2, "12345", S("12345cde"));
53   test(S("abcde"), 0, 2, "1234567890", S("1234567890cde"));
54   test(S("abcde"), 0, 2, "12345678901234567890", S("12345678901234567890cde"));
55   test(S("abcde"), 0, 4, "", S("e"));
56   test(S("abcde"), 0, 4, "12345", S("12345e"));
57   test(S("abcde"), 0, 4, "1234567890", S("1234567890e"));
58   test(S("abcde"), 0, 4, "12345678901234567890", S("12345678901234567890e"));
59   test(S("abcde"), 0, 5, "", S(""));
60   test(S("abcde"), 0, 5, "12345", S("12345"));
61   test(S("abcde"), 0, 5, "1234567890", S("1234567890"));
62   test(S("abcde"), 0, 5, "12345678901234567890", S("12345678901234567890"));
63   test(S("abcde"), 1, 0, "", S("abcde"));
64   test(S("abcde"), 1, 0, "12345", S("a12345bcde"));
65   test(S("abcde"), 1, 0, "1234567890", S("a1234567890bcde"));
66   test(S("abcde"), 1, 0, "12345678901234567890", S("a12345678901234567890bcde"));
67   test(S("abcde"), 1, 1, "", S("acde"));
68   test(S("abcde"), 1, 1, "12345", S("a12345cde"));
69   test(S("abcde"), 1, 1, "1234567890", S("a1234567890cde"));
70   test(S("abcde"), 1, 1, "12345678901234567890", S("a12345678901234567890cde"));
71   test(S("abcde"), 1, 2, "", S("ade"));
72   test(S("abcde"), 1, 2, "12345", S("a12345de"));
73   test(S("abcde"), 1, 2, "1234567890", S("a1234567890de"));
74   test(S("abcde"), 1, 2, "12345678901234567890", S("a12345678901234567890de"));
75   test(S("abcde"), 1, 3, "", S("ae"));
76   test(S("abcde"), 1, 3, "12345", S("a12345e"));
77   test(S("abcde"), 1, 3, "1234567890", S("a1234567890e"));
78   test(S("abcde"), 1, 3, "12345678901234567890", S("a12345678901234567890e"));
79   test(S("abcde"), 1, 4, "", S("a"));
80   test(S("abcde"), 1, 4, "12345", S("a12345"));
81   test(S("abcde"), 1, 4, "1234567890", S("a1234567890"));
82   test(S("abcde"), 1, 4, "12345678901234567890", S("a12345678901234567890"));
83   test(S("abcde"), 2, 0, "", S("abcde"));
84   test(S("abcde"), 2, 0, "12345", S("ab12345cde"));
85   test(S("abcde"), 2, 0, "1234567890", S("ab1234567890cde"));
86   test(S("abcde"), 2, 0, "12345678901234567890", S("ab12345678901234567890cde"));
87   test(S("abcde"), 2, 1, "", S("abde"));
88   test(S("abcde"), 2, 1, "12345", S("ab12345de"));
89   test(S("abcde"), 2, 1, "1234567890", S("ab1234567890de"));
90   test(S("abcde"), 2, 1, "12345678901234567890", S("ab12345678901234567890de"));
91   test(S("abcde"), 2, 2, "", S("abe"));
92   test(S("abcde"), 2, 2, "12345", S("ab12345e"));
93   test(S("abcde"), 2, 2, "1234567890", S("ab1234567890e"));
94   test(S("abcde"), 2, 2, "12345678901234567890", S("ab12345678901234567890e"));
95   test(S("abcde"), 2, 3, "", S("ab"));
96   test(S("abcde"), 2, 3, "12345", S("ab12345"));
97   test(S("abcde"), 2, 3, "1234567890", S("ab1234567890"));
98   test(S("abcde"), 2, 3, "12345678901234567890", S("ab12345678901234567890"));
99   test(S("abcde"), 4, 0, "", S("abcde"));
100   test(S("abcde"), 4, 0, "12345", S("abcd12345e"));
101   test(S("abcde"), 4, 0, "1234567890", S("abcd1234567890e"));
102   test(S("abcde"), 4, 0, "12345678901234567890", S("abcd12345678901234567890e"));
103   test(S("abcde"), 4, 1, "", S("abcd"));
104   test(S("abcde"), 4, 1, "12345", S("abcd12345"));
105   test(S("abcde"), 4, 1, "1234567890", S("abcd1234567890"));
106   test(S("abcde"), 4, 1, "12345678901234567890", S("abcd12345678901234567890"));
107   test(S("abcde"), 5, 0, "", S("abcde"));
108   test(S("abcde"), 5, 0, "12345", S("abcde12345"));
109   test(S("abcde"), 5, 0, "1234567890", S("abcde1234567890"));
110   test(S("abcde"), 5, 0, "12345678901234567890", S("abcde12345678901234567890"));
111   test(S("abcdefghij"), 0, 0, "", S("abcdefghij"));
112   test(S("abcdefghij"), 0, 0, "12345", S("12345abcdefghij"));
113   test(S("abcdefghij"), 0, 0, "1234567890", S("1234567890abcdefghij"));
114   test(S("abcdefghij"), 0, 0, "12345678901234567890", S("12345678901234567890abcdefghij"));
115   test(S("abcdefghij"), 0, 1, "", S("bcdefghij"));
116   test(S("abcdefghij"), 0, 1, "12345", S("12345bcdefghij"));
117   test(S("abcdefghij"), 0, 1, "1234567890", S("1234567890bcdefghij"));
118   test(S("abcdefghij"), 0, 1, "12345678901234567890", S("12345678901234567890bcdefghij"));
119   test(S("abcdefghij"), 0, 5, "", S("fghij"));
120   test(S("abcdefghij"), 0, 5, "12345", S("12345fghij"));
121   test(S("abcdefghij"), 0, 5, "1234567890", S("1234567890fghij"));
122   test(S("abcdefghij"), 0, 5, "12345678901234567890", S("12345678901234567890fghij"));
123   test(S("abcdefghij"), 0, 9, "", S("j"));
124   test(S("abcdefghij"), 0, 9, "12345", S("12345j"));
125   test(S("abcdefghij"), 0, 9, "1234567890", S("1234567890j"));
126   test(S("abcdefghij"), 0, 9, "12345678901234567890", S("12345678901234567890j"));
127   test(S("abcdefghij"), 0, 10, "", S(""));
128   test(S("abcdefghij"), 0, 10, "12345", S("12345"));
129   test(S("abcdefghij"), 0, 10, "1234567890", S("1234567890"));
130   test(S("abcdefghij"), 0, 10, "12345678901234567890", S("12345678901234567890"));
131   test(S("abcdefghij"), 1, 0, "", S("abcdefghij"));
132   test(S("abcdefghij"), 1, 0, "12345", S("a12345bcdefghij"));
133   test(S("abcdefghij"), 1, 0, "1234567890", S("a1234567890bcdefghij"));
134   test(S("abcdefghij"), 1, 0, "12345678901234567890", S("a12345678901234567890bcdefghij"));
135   test(S("abcdefghij"), 1, 1, "", S("acdefghij"));
136   test(S("abcdefghij"), 1, 1, "12345", S("a12345cdefghij"));
137   test(S("abcdefghij"), 1, 1, "1234567890", S("a1234567890cdefghij"));
138   test(S("abcdefghij"), 1, 1, "12345678901234567890", S("a12345678901234567890cdefghij"));
139 
140   return true;
141 }
142 
143 template <class S>
test1()144 TEST_CONSTEXPR_CXX20 bool test1() {
145   test(S("abcdefghij"), 1, 4, "", S("afghij"));
146   test(S("abcdefghij"), 1, 4, "12345", S("a12345fghij"));
147   test(S("abcdefghij"), 1, 4, "1234567890", S("a1234567890fghij"));
148   test(S("abcdefghij"), 1, 4, "12345678901234567890", S("a12345678901234567890fghij"));
149   test(S("abcdefghij"), 1, 8, "", S("aj"));
150   test(S("abcdefghij"), 1, 8, "12345", S("a12345j"));
151   test(S("abcdefghij"), 1, 8, "1234567890", S("a1234567890j"));
152   test(S("abcdefghij"), 1, 8, "12345678901234567890", S("a12345678901234567890j"));
153   test(S("abcdefghij"), 1, 9, "", S("a"));
154   test(S("abcdefghij"), 1, 9, "12345", S("a12345"));
155   test(S("abcdefghij"), 1, 9, "1234567890", S("a1234567890"));
156   test(S("abcdefghij"), 1, 9, "12345678901234567890", S("a12345678901234567890"));
157   test(S("abcdefghij"), 5, 0, "", S("abcdefghij"));
158   test(S("abcdefghij"), 5, 0, "12345", S("abcde12345fghij"));
159   test(S("abcdefghij"), 5, 0, "1234567890", S("abcde1234567890fghij"));
160   test(S("abcdefghij"), 5, 0, "12345678901234567890", S("abcde12345678901234567890fghij"));
161   test(S("abcdefghij"), 5, 1, "", S("abcdeghij"));
162   test(S("abcdefghij"), 5, 1, "12345", S("abcde12345ghij"));
163   test(S("abcdefghij"), 5, 1, "1234567890", S("abcde1234567890ghij"));
164   test(S("abcdefghij"), 5, 1, "12345678901234567890", S("abcde12345678901234567890ghij"));
165   test(S("abcdefghij"), 5, 2, "", S("abcdehij"));
166   test(S("abcdefghij"), 5, 2, "12345", S("abcde12345hij"));
167   test(S("abcdefghij"), 5, 2, "1234567890", S("abcde1234567890hij"));
168   test(S("abcdefghij"), 5, 2, "12345678901234567890", S("abcde12345678901234567890hij"));
169   test(S("abcdefghij"), 5, 4, "", S("abcdej"));
170   test(S("abcdefghij"), 5, 4, "12345", S("abcde12345j"));
171   test(S("abcdefghij"), 5, 4, "1234567890", S("abcde1234567890j"));
172   test(S("abcdefghij"), 5, 4, "12345678901234567890", S("abcde12345678901234567890j"));
173   test(S("abcdefghij"), 5, 5, "", S("abcde"));
174   test(S("abcdefghij"), 5, 5, "12345", S("abcde12345"));
175   test(S("abcdefghij"), 5, 5, "1234567890", S("abcde1234567890"));
176   test(S("abcdefghij"), 5, 5, "12345678901234567890", S("abcde12345678901234567890"));
177   test(S("abcdefghij"), 9, 0, "", S("abcdefghij"));
178   test(S("abcdefghij"), 9, 0, "12345", S("abcdefghi12345j"));
179   test(S("abcdefghij"), 9, 0, "1234567890", S("abcdefghi1234567890j"));
180   test(S("abcdefghij"), 9, 0, "12345678901234567890", S("abcdefghi12345678901234567890j"));
181   test(S("abcdefghij"), 9, 1, "", S("abcdefghi"));
182   test(S("abcdefghij"), 9, 1, "12345", S("abcdefghi12345"));
183   test(S("abcdefghij"), 9, 1, "1234567890", S("abcdefghi1234567890"));
184   test(S("abcdefghij"), 9, 1, "12345678901234567890", S("abcdefghi12345678901234567890"));
185   test(S("abcdefghij"), 10, 0, "", S("abcdefghij"));
186   test(S("abcdefghij"), 10, 0, "12345", S("abcdefghij12345"));
187   test(S("abcdefghij"), 10, 0, "1234567890", S("abcdefghij1234567890"));
188   test(S("abcdefghij"), 10, 0, "12345678901234567890", S("abcdefghij12345678901234567890"));
189   test(S("abcdefghijklmnopqrst"), 0, 0, "", S("abcdefghijklmnopqrst"));
190   test(S("abcdefghijklmnopqrst"), 0, 0, "12345", S("12345abcdefghijklmnopqrst"));
191   test(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", S("1234567890abcdefghijklmnopqrst"));
192   test(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", S("12345678901234567890abcdefghijklmnopqrst"));
193   test(S("abcdefghijklmnopqrst"), 0, 1, "", S("bcdefghijklmnopqrst"));
194   test(S("abcdefghijklmnopqrst"), 0, 1, "12345", S("12345bcdefghijklmnopqrst"));
195   test(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", S("1234567890bcdefghijklmnopqrst"));
196   test(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", S("12345678901234567890bcdefghijklmnopqrst"));
197   test(S("abcdefghijklmnopqrst"), 0, 10, "", S("klmnopqrst"));
198   test(S("abcdefghijklmnopqrst"), 0, 10, "12345", S("12345klmnopqrst"));
199   test(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", S("1234567890klmnopqrst"));
200   test(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", S("12345678901234567890klmnopqrst"));
201   test(S("abcdefghijklmnopqrst"), 0, 19, "", S("t"));
202   test(S("abcdefghijklmnopqrst"), 0, 19, "12345", S("12345t"));
203   test(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", S("1234567890t"));
204   test(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", S("12345678901234567890t"));
205   test(S("abcdefghijklmnopqrst"), 0, 20, "", S(""));
206   test(S("abcdefghijklmnopqrst"), 0, 20, "12345", S("12345"));
207   test(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", S("1234567890"));
208   test(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", S("12345678901234567890"));
209   test(S("abcdefghijklmnopqrst"), 1, 0, "", S("abcdefghijklmnopqrst"));
210   test(S("abcdefghijklmnopqrst"), 1, 0, "12345", S("a12345bcdefghijklmnopqrst"));
211   test(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", S("a1234567890bcdefghijklmnopqrst"));
212   test(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", S("a12345678901234567890bcdefghijklmnopqrst"));
213   test(S("abcdefghijklmnopqrst"), 1, 1, "", S("acdefghijklmnopqrst"));
214   test(S("abcdefghijklmnopqrst"), 1, 1, "12345", S("a12345cdefghijklmnopqrst"));
215   test(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", S("a1234567890cdefghijklmnopqrst"));
216   test(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", S("a12345678901234567890cdefghijklmnopqrst"));
217   test(S("abcdefghijklmnopqrst"), 1, 9, "", S("aklmnopqrst"));
218   test(S("abcdefghijklmnopqrst"), 1, 9, "12345", S("a12345klmnopqrst"));
219   test(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", S("a1234567890klmnopqrst"));
220   test(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", S("a12345678901234567890klmnopqrst"));
221   test(S("abcdefghijklmnopqrst"), 1, 18, "", S("at"));
222   test(S("abcdefghijklmnopqrst"), 1, 18, "12345", S("a12345t"));
223   test(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", S("a1234567890t"));
224   test(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", S("a12345678901234567890t"));
225   test(S("abcdefghijklmnopqrst"), 1, 19, "", S("a"));
226   test(S("abcdefghijklmnopqrst"), 1, 19, "12345", S("a12345"));
227   test(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", S("a1234567890"));
228   test(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", S("a12345678901234567890"));
229   test(S("abcdefghijklmnopqrst"), 10, 0, "", S("abcdefghijklmnopqrst"));
230   test(S("abcdefghijklmnopqrst"), 10, 0, "12345", S("abcdefghij12345klmnopqrst"));
231   test(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", S("abcdefghij1234567890klmnopqrst"));
232   test(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", S("abcdefghij12345678901234567890klmnopqrst"));
233   test(S("abcdefghijklmnopqrst"), 10, 1, "", S("abcdefghijlmnopqrst"));
234   test(S("abcdefghijklmnopqrst"), 10, 1, "12345", S("abcdefghij12345lmnopqrst"));
235   test(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", S("abcdefghij1234567890lmnopqrst"));
236   test(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", S("abcdefghij12345678901234567890lmnopqrst"));
237   test(S("abcdefghijklmnopqrst"), 10, 5, "", S("abcdefghijpqrst"));
238   test(S("abcdefghijklmnopqrst"), 10, 5, "12345", S("abcdefghij12345pqrst"));
239   test(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", S("abcdefghij1234567890pqrst"));
240   test(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", S("abcdefghij12345678901234567890pqrst"));
241   test(S("abcdefghijklmnopqrst"), 10, 9, "", S("abcdefghijt"));
242   test(S("abcdefghijklmnopqrst"), 10, 9, "12345", S("abcdefghij12345t"));
243   test(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", S("abcdefghij1234567890t"));
244   test(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", S("abcdefghij12345678901234567890t"));
245 
246   return true;
247 }
248 
249 template <class S>
test2()250 TEST_CONSTEXPR_CXX20 bool test2() {
251   test(S("abcdefghijklmnopqrst"), 10, 10, "", S("abcdefghij"));
252   test(S("abcdefghijklmnopqrst"), 10, 10, "12345", S("abcdefghij12345"));
253   test(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", S("abcdefghij1234567890"));
254   test(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", S("abcdefghij12345678901234567890"));
255   test(S("abcdefghijklmnopqrst"), 19, 0, "", S("abcdefghijklmnopqrst"));
256   test(S("abcdefghijklmnopqrst"), 19, 0, "12345", S("abcdefghijklmnopqrs12345t"));
257   test(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", S("abcdefghijklmnopqrs1234567890t"));
258   test(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", S("abcdefghijklmnopqrs12345678901234567890t"));
259   test(S("abcdefghijklmnopqrst"), 19, 1, "", S("abcdefghijklmnopqrs"));
260   test(S("abcdefghijklmnopqrst"), 19, 1, "12345", S("abcdefghijklmnopqrs12345"));
261   test(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", S("abcdefghijklmnopqrs1234567890"));
262   test(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", S("abcdefghijklmnopqrs12345678901234567890"));
263   test(S("abcdefghijklmnopqrst"), 20, 0, "", S("abcdefghijklmnopqrst"));
264   test(S("abcdefghijklmnopqrst"), 20, 0, "12345", S("abcdefghijklmnopqrst12345"));
265   test(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", S("abcdefghijklmnopqrst1234567890"));
266   test(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", S("abcdefghijklmnopqrst12345678901234567890"));
267 
268   { // test replacing into self
269     S s_short = "123/";
270     S s_long  = "Lorem ipsum dolor sit amet, consectetur/";
271 
272     s_short.replace(s_short.begin(), s_short.begin(), s_short.c_str());
273     assert(s_short == "123/123/");
274     s_short.replace(s_short.begin(), s_short.begin(), s_short.c_str());
275     assert(s_short == "123/123/123/123/");
276     s_short.replace(s_short.begin(), s_short.begin(), s_short.c_str());
277     assert(s_short == "123/123/123/123/123/123/123/123/");
278 
279     s_long.replace(s_long.begin(), s_long.begin(), s_long.c_str());
280     assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
281   }
282 
283   return true;
284 }
285 
286 template <class S>
test()287 TEST_CONSTEXPR_CXX20 void test() {
288   test0<S>();
289   test1<S>();
290   test2<S>();
291 #if TEST_STD_VER > 17
292   static_assert(test0<S>());
293   static_assert(test1<S>());
294   static_assert(test2<S>());
295 #endif
296 }
297 
main(int,char **)298 int main(int, char**) {
299   test<std::string>();
300 #if TEST_STD_VER >= 11
301   test<std::basic_string<char, std::char_traits<char>, min_allocator<char> > >();
302 #endif
303 
304   return 0;
305 }
306