1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // template<class InputIterator>
13 // iterator insert(const_iterator p, InputIterator first, InputIterator last);
15 #if _LIBCPP_DEBUG >= 1
16 #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
22 #include "test_iterators.h"
23 #include "min_allocator.h"
25 template <class S, class It>
27 test(S s, typename S::difference_type pos, It first, It last, S expected)
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);
36 #ifndef TEST_HAS_NO_EXCEPTIONS
37 template <class S, class It>
39 test_exceptions(S s, typename S::difference_type pos, It first, It last)
41 typename S::const_iterator p = s.cbegin() + pos;
44 s.insert(p, first, last);
48 LIBCPP_ASSERT(s.__invariants());
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
100 #if TEST_STD_VER >= 11
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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());
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());
162 #if _LIBCPP_DEBUG >= 1
167 const int N = sizeof(a)/sizeof(a[0]);
168 std::string::iterator i = v.insert(v2.cbegin() + 10, a, a+N);
173 { // test inserting into self
174 typedef std::string S;
176 S s_long = "Lorem ipsum dolor sit amet, consectetur/";
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/");
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/");
189 { // test assigning a different type
190 typedef std::string S;
191 const uint8_t p[] = "ABCD";
194 s.insert(s.begin(), p, p + 4);