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 //===----------------------------------------------------------------------===//
10 // REQUIRES: long_tests
14 // template <class InputIterator>
15 // iterator insert (const_iterator p, InputIterator f, InputIterator l);
21 #include "test_macros.h"
22 #include "test_iterators.h"
24 #include "test_allocator.h"
25 #include "min_allocator.h"
29 make(int size, int start = 0 )
31 const int b = 4096 / sizeof(int);
35 init = (start+1) / b + ((start+1) % b != 0);
40 for (int i = 0; i < init-start; ++i)
42 for (int i = 0; i < size; ++i)
44 for (int i = 0; i < start; ++i)
51 test(int P, const C& c0, const C& c2)
54 typedef typename C::const_iterator CI;
55 typedef input_iterator<CI> BCI;
57 std::size_t c1_osize = c1.size();
58 CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
59 assert(i == c1.begin() + P);
60 assert(c1.size() == c1_osize + c2.size());
61 assert(static_cast<std::size_t>(distance(c1.begin(), c1.end())) == c1.size());
63 for (int j = 0; j < P; ++j, ++i)
65 for (int j = 0; static_cast<std::size_t>(j) < c2.size(); ++j, ++i)
67 for (int j = P; static_cast<std::size_t>(j) < c1_osize; ++j, ++i)
71 typedef typename C::const_iterator CI;
72 typedef forward_iterator<CI> BCI;
74 std::size_t c1_osize = c1.size();
75 CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
76 assert(i == c1.begin() + P);
77 assert(c1.size() == c1_osize + c2.size());
78 assert(static_cast<std::size_t>(distance(c1.begin(), c1.end())) == c1.size());
80 for (int j = 0; j < P; ++j, ++i)
82 for (int j = 0; static_cast<std::size_t>(j) < c2.size(); ++j, ++i)
84 for (int j = P; static_cast<std::size_t>(j) < c1_osize; ++j, ++i)
88 typedef typename C::const_iterator CI;
89 typedef bidirectional_iterator<CI> BCI;
91 std::size_t c1_osize = c1.size();
92 CI i = c1.insert(c1.begin() + P, BCI(c2.begin()), BCI(c2.end()));
93 assert(i == c1.begin() + P);
94 assert(c1.size() == c1_osize + c2.size());
95 assert(static_cast<std::size_t>(distance(c1.begin(), c1.end())) == c1.size());
97 for (int j = 0; j < P; ++j, ++i)
99 for (int j = 0; static_cast<std::size_t>(j) < c2.size(); ++j, ++i)
101 for (int j = P; static_cast<std::size_t>(j) < c1_osize; ++j, ++i)
108 testN(int start, int N, int M)
110 for (int i = 0; i <= 3; ++i)
112 if (0 <= i && i <= N)
114 C c1 = make<C>(N, start);
119 for (int i = M-1; i <= M+1; ++i)
121 if (0 <= i && i <= N)
123 C c1 = make<C>(N, start);
128 for (int i = N/2-1; i <= N/2+1; ++i)
130 if (0 <= i && i <= N)
132 C c1 = make<C>(N, start);
137 for (int i = N - M - 1; i <= N - M + 1; ++i)
139 if (0 <= i && i <= N)
141 C c1 = make<C>(N, start);
146 for (int i = N - M - 1; i <= N - M + 1; ++i)
148 if (0 <= i && i <= N)
150 C c1 = make<C>(N, start);
155 for (int i = N - 3; i <= N; ++i)
157 if (0 <= i && i <= N)
159 C c1 = make<C>(N, start);
168 testI(int P, C& c1, const C& c2)
170 typedef typename C::const_iterator CI;
171 typedef input_iterator<CI> ICI;
172 std::size_t c1_osize = c1.size();
173 CI i = c1.insert(c1.begin() + P, ICI(c2.begin()), ICI(c2.end()));
174 assert(i == c1.begin() + P);
175 assert(c1.size() == c1_osize + c2.size());
176 assert(static_cast<std::size_t>(distance(c1.begin(), c1.end())) == c1.size());
178 for (int j = 0; j < P; ++j, ++i)
180 for (int j = 0; static_cast<std::size_t>(j) < c2.size(); ++j, ++i)
182 for (int j = P; static_cast<std::size_t>(j) < c1_osize; ++j, ++i)
188 testNI(int start, int N, int M)
190 for (int i = 0; i <= 3; ++i)
192 if (0 <= i && i <= N)
194 C c1 = make<C>(N, start);
199 for (int i = M-1; i <= M+1; ++i)
201 if (0 <= i && i <= N)
203 C c1 = make<C>(N, start);
208 for (int i = N/2-1; i <= N/2+1; ++i)
210 if (0 <= i && i <= N)
212 C c1 = make<C>(N, start);
217 for (int i = N - M - 1; i <= N - M + 1; ++i)
219 if (0 <= i && i <= N)
221 C c1 = make<C>(N, start);
226 for (int i = N - 3; i <= N; ++i)
228 if (0 <= i && i <= N)
230 C c1 = make<C>(N, start);
241 #if TEST_STD_VER >= 11
243 typedef typename C::const_iterator CI;
247 c.insert(c.end(), std::move_iterator<I>(&mo), std::move_iterator<I>(&mo+1));
250 for (CI i = c.begin(); i != c.end(); ++i, ++j)
251 assert(*i == MoveOnly(j));
254 typedef input_iterator<MoveOnly*> I;
255 c.insert(c.end(), std::move_iterator<I>(I(&mo)), std::move_iterator<I>(I(&mo+1)));
258 for (CI i = c.begin(); i != c.end(); ++i, ++j)
259 assert(*i == MoveOnly(j));
266 int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
267 const int N = sizeof(rng)/sizeof(rng[0]);
268 for (int i = 0; i < N; ++i)
269 for (int j = 0; j < N; ++j)
270 for (int k = 0; k < N; ++k)
271 testN<std::deque<int> >(rng[i], rng[j], rng[k]);
272 testNI<std::deque<int> >(1500, 2000, 1000);
273 #if TEST_STD_VER >= 11
274 test_move<std::deque<MoveOnly, limited_allocator<MoveOnly, 2000> > >();
277 #if TEST_STD_VER >= 11
279 int rng[] = {0, 1, 2, 3, 1023, 1024, 1025, 2047, 2048, 2049};
280 const int N = sizeof(rng)/sizeof(rng[0]);
281 for (int i = 0; i < N; ++i)
282 for (int j = 0; j < N; ++j)
283 for (int k = 0; k < N; ++k)
284 testN<std::deque<int, min_allocator<int>> >(rng[i], rng[j], rng[k]);
285 testNI<std::deque<int> >(1500, 2000, 1000);
286 test_move<std::deque<MoveOnly, min_allocator<MoveOnly> > >();