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 // template<class InputIterator>
12 // iterator insert(const_iterator p, InputIterator first, InputIterator last);
13
14 #if _LIBCPP_DEBUG >= 1
15 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
16 #endif
17
18 #include <string>
19 #include <cassert>
20
21 #include "test_macros.h"
22 #include "test_iterators.h"
23 #include "min_allocator.h"
24
25 template <class S, class It>
26 void
test(S s,typename S::difference_type pos,It first,It last,S expected)27 test(S s, typename S::difference_type pos, It first, It last, S expected)
28 {
29 typename S::const_iterator p = s.cbegin() + pos;
30 typename S::iterator i = s.insert(p, first, last);
31 LIBCPP_ASSERT(s.__invariants());
32 assert(i - s.begin() == pos);
33 assert(s == expected);
34 }
35
36 #ifndef TEST_HAS_NO_EXCEPTIONS
37 template <class S, class It>
38 void
test_exceptions(S s,typename S::difference_type pos,It first,It last)39 test_exceptions(S s, typename S::difference_type pos, It first, It last)
40 {
41 typename S::const_iterator p = s.cbegin() + pos;
42 S aCopy = s;
43 try {
44 s.insert(p, first, last);
45 assert(false);
46 }
47 catch (...) {}
48 LIBCPP_ASSERT(s.__invariants());
49 assert(s == aCopy);
50 }
51 #endif
52
main(int,char **)53 int main(int, char**)
54 {
55 {
56 typedef std::string S;
57 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
58 test(S(), 0, s, s, S());
59 test(S(), 0, s, s+1, S("A"));
60 test(S(), 0, s, s+10, S("ABCDEFGHIJ"));
61 test(S(), 0, s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
62
63 test(S("12345"), 0, s, s, S("12345"));
64 test(S("12345"), 1, s, s+1, S("1A2345"));
65 test(S("12345"), 4, s, s+10, S("1234ABCDEFGHIJ5"));
66 test(S("12345"), 5, s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
67
68 test(S("1234567890"), 0, s, s, S("1234567890"));
69 test(S("1234567890"), 1, s, s+1, S("1A234567890"));
70 test(S("1234567890"), 10, s, s+10, S("1234567890ABCDEFGHIJ"));
71 test(S("1234567890"), 8, s, s+52, S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
72
73 test(S("12345678901234567890"), 3, s, s, S("12345678901234567890"));
74 test(S("12345678901234567890"), 3, s, s+1, S("123A45678901234567890"));
75 test(S("12345678901234567890"), 15, s, s+10, S("123456789012345ABCDEFGHIJ67890"));
76 test(S("12345678901234567890"), 20, s, s+52,
77 S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
78
79 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S());
80 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
81 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("ABCDEFGHIJ"));
82 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
83
84 test(S("12345"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345"));
85 test(S("12345"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A2345"));
86 test(S("12345"), 4, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234ABCDEFGHIJ5"));
87 test(S("12345"), 5, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
88
89 test(S("1234567890"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("1234567890"));
90 test(S("1234567890"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A234567890"));
91 test(S("1234567890"), 10, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234567890ABCDEFGHIJ"));
92 test(S("1234567890"), 8, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
93
94 test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345678901234567890"));
95 test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("123A45678901234567890"));
96 test(S("12345678901234567890"), 15, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("123456789012345ABCDEFGHIJ67890"));
97 test(S("12345678901234567890"), 20, input_iterator<const char*>(s), input_iterator<const char*>(s+52),
98 S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
99 }
100 #if TEST_STD_VER >= 11
101 {
102 typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
103 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
104 test(S(), 0, s, s, S());
105 test(S(), 0, s, s+1, S("A"));
106 test(S(), 0, s, s+10, S("ABCDEFGHIJ"));
107 test(S(), 0, s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
108
109 test(S("12345"), 0, s, s, S("12345"));
110 test(S("12345"), 1, s, s+1, S("1A2345"));
111 test(S("12345"), 4, s, s+10, S("1234ABCDEFGHIJ5"));
112 test(S("12345"), 5, s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
113
114 test(S("1234567890"), 0, s, s, S("1234567890"));
115 test(S("1234567890"), 1, s, s+1, S("1A234567890"));
116 test(S("1234567890"), 10, s, s+10, S("1234567890ABCDEFGHIJ"));
117 test(S("1234567890"), 8, s, s+52, S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
118
119 test(S("12345678901234567890"), 3, s, s, S("12345678901234567890"));
120 test(S("12345678901234567890"), 3, s, s+1, S("123A45678901234567890"));
121 test(S("12345678901234567890"), 15, s, s+10, S("123456789012345ABCDEFGHIJ67890"));
122 test(S("12345678901234567890"), 20, s, s+52,
123 S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
124
125 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S());
126 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
127 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("ABCDEFGHIJ"));
128 test(S(), 0, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
129
130 test(S("12345"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345"));
131 test(S("12345"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A2345"));
132 test(S("12345"), 4, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234ABCDEFGHIJ5"));
133 test(S("12345"), 5, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
134
135 test(S("1234567890"), 0, input_iterator<const char*>(s), input_iterator<const char*>(s), S("1234567890"));
136 test(S("1234567890"), 1, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("1A234567890"));
137 test(S("1234567890"), 10, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("1234567890ABCDEFGHIJ"));
138 test(S("1234567890"), 8, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz90"));
139
140 test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s), S("12345678901234567890"));
141 test(S("12345678901234567890"), 3, input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("123A45678901234567890"));
142 test(S("12345678901234567890"), 15, input_iterator<const char*>(s), input_iterator<const char*>(s+10), S("123456789012345ABCDEFGHIJ67890"));
143 test(S("12345678901234567890"), 20, input_iterator<const char*>(s), input_iterator<const char*>(s+52),
144 S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
145 }
146 #endif
147 #ifndef TEST_HAS_NO_EXCEPTIONS
148 { // test iterator operations that throw
149 typedef std::string S;
150 typedef ThrowingIterator<char> TIter;
151 typedef input_iterator<TIter> IIter;
152 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
153 test_exceptions(S(), 0, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
154 test_exceptions(S(), 0, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
155 test_exceptions(S(), 0, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
156
157 test_exceptions(S(), 0, TIter(s, s+10, 4, TIter::TAIncrement), TIter());
158 test_exceptions(S(), 0, TIter(s, s+10, 5, TIter::TADereference), TIter());
159 test_exceptions(S(), 0, TIter(s, s+10, 6, TIter::TAComparison), TIter());
160 }
161 #endif
162 #if _LIBCPP_DEBUG >= 1
163 {
164 std::string v;
165 std::string v2;
166 char a[] = "123";
167 const int N = sizeof(a)/sizeof(a[0]);
168 std::string::iterator i = v.insert(v2.cbegin() + 10, a, a+N);
169 assert(false);
170 }
171 #endif
172
173 { // test inserting into self
174 typedef std::string S;
175 S s_short = "123/";
176 S s_long = "Lorem ipsum dolor sit amet, consectetur/";
177
178 s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
179 assert(s_short == "123/123/");
180 s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
181 assert(s_short == "123/123/123/123/");
182 s_short.insert(s_short.begin(), s_short.begin(), s_short.end());
183 assert(s_short == "123/123/123/123/123/123/123/123/");
184
185 s_long.insert(s_long.begin(), s_long.begin(), s_long.end());
186 assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
187 }
188
189 { // test assigning a different type
190 typedef std::string S;
191 const uint8_t p[] = "ABCD";
192
193 S s;
194 s.insert(s.begin(), p, p + 4);
195 assert(s == "ABCD");
196 }
197
198 { // test with a move iterator that returns char&&
199 typedef input_iterator<const char*> It;
200 typedef std::move_iterator<It> MoveIt;
201 const char p[] = "ABCD";
202 std::string s;
203 s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
204 assert(s == "ABCD");
205 }
206 { // test with a move iterator that returns char&&
207 typedef forward_iterator<const char*> It;
208 typedef std::move_iterator<It> MoveIt;
209 const char p[] = "ABCD";
210 std::string s;
211 s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
212 assert(s == "ABCD");
213 }
214 { // test with a move iterator that returns char&&
215 typedef const char* It;
216 typedef std::move_iterator<It> MoveIt;
217 const char p[] = "ABCD";
218 std::string s;
219 s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
220 assert(s == "ABCD");
221 }
222
223 return 0;
224 }
225