]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/index/test/varray_old.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / geometry / index / test / varray_old.cpp
1 // Boost.Geometry Index
2 // Unit Test
3
4 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
5
6 // This file was modified by Oracle on 2020.
7 // Modifications copyright (c) 2020 Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9
10 // Use, modification and distribution is subject to the Boost Software License,
11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
13
14 #include <boost/test/included/test_exec_monitor.hpp>
15 #include <boost/test/impl/execution_monitor.ipp>
16
17 #include <boost/geometry/index/detail/varray.hpp>
18
19 using namespace boost::geometry::index::detail;
20
21 class value_ndc
22 {
23 public:
24 explicit value_ndc(int a) : aa(a) {}
25 ~value_ndc() {}
26 bool operator==(value_ndc const& v) const { return aa == v.aa; }
27 private:
28 value_ndc(value_ndc const&) {}
29 value_ndc & operator=(value_ndc const&) { return *this; }
30 int aa;
31 };
32
33 class value_nd
34 {
35 public:
36 explicit value_nd(int a) : aa(a) {}
37 ~value_nd() {}
38 bool operator==(value_nd const& v) const { return aa == v.aa; }
39 private:
40 int aa;
41 };
42
43 class value_nc
44 {
45 public:
46 explicit value_nc(int a = 0) : aa(a) {}
47 ~value_nc() {}
48 bool operator==(value_nc const& v) const { return aa == v.aa; }
49 private:
50 value_nc(value_nc const&) {}
51 value_nc & operator=(value_ndc const&) { return *this; }
52 int aa;
53 };
54
55 class counting_value
56 {
57 public:
58 explicit counting_value(int a = 0) : aa(a) { ++c(); }
59 counting_value(counting_value const& v) : aa(v.aa) { ++c(); }
60 counting_value & operator=(counting_value const& v) { aa = v.aa; return *this; }
61 ~counting_value() { --c(); }
62 bool operator==(counting_value const& v) const { return aa == v.aa; }
63 static size_t count() { return c(); }
64 private:
65 static size_t & c() { static size_t co = 0; return co; }
66 int aa;
67 };
68
69 template <typename T, size_t N>
70 void test_ctor_ndc()
71 {
72 varray<T, N> s;
73 BOOST_CHECK(s.size() == 0);
74 BOOST_CHECK(s.capacity() == N);
75 BOOST_CHECK_THROW( s.at(0), std::out_of_range );
76 }
77
78 template <typename T, size_t N>
79 void test_ctor_nc(size_t n)
80 {
81 varray<T, N> s(n);
82 BOOST_CHECK(s.size() == n);
83 BOOST_CHECK(s.capacity() == N);
84 BOOST_CHECK_THROW( s.at(n), std::out_of_range );
85 if ( ! std::is_trivially_constructible<T>::value )
86 {
87 for ( size_t i = 0 ; i < n ; ++i )
88 BOOST_CHECK(T() == s[i]);
89 }
90 }
91
92 template <typename T, size_t N>
93 void test_ctor_nd(size_t n, T const& v)
94 {
95 varray<T, N> s(n, v);
96 BOOST_CHECK(s.size() == n);
97 BOOST_CHECK(s.capacity() == N);
98 BOOST_CHECK_THROW( s.at(n), std::out_of_range );
99 if ( 1 < n )
100 {
101 BOOST_CHECK(v == s[0]);
102 BOOST_CHECK(v == s.at(0));
103 BOOST_CHECK(v == s[1]);
104 BOOST_CHECK(v == s.at(1));
105 s[0] = T(10);
106 BOOST_CHECK(T(10) == s[0]);
107 BOOST_CHECK(T(10) == s.at(0));
108 s.at(1) = T(20);
109 BOOST_CHECK(T(20) == s[1]);
110 BOOST_CHECK(T(20) == s.at(1));
111 }
112 }
113
114 template <typename T, size_t N>
115 void test_resize_nc(size_t n)
116 {
117 varray<T, N> s;
118
119 s.resize(n);
120 BOOST_CHECK(s.size() == n);
121 BOOST_CHECK(s.capacity() == N);
122 BOOST_CHECK_THROW( s.at(n), std::out_of_range );
123
124 if ( ! std::is_trivially_constructible<T>::value )
125 {
126 for ( size_t i = 0 ; i < n ; ++i )
127 BOOST_CHECK(T() == s[i]);
128 }
129 }
130
131 template <typename T, size_t N>
132 void test_resize_nd(size_t n, T const& v)
133 {
134 varray<T, N> s;
135
136 s.resize(n, v);
137 BOOST_CHECK(s.size() == n);
138 BOOST_CHECK(s.capacity() == N);
139 BOOST_CHECK_THROW( s.at(n), std::out_of_range );
140 if ( 1 < n )
141 {
142 BOOST_CHECK(v == s[0]);
143 BOOST_CHECK(v == s.at(0));
144 BOOST_CHECK(v == s[1]);
145 BOOST_CHECK(v == s.at(1));
146 s[0] = T(10);
147 BOOST_CHECK(T(10) == s[0]);
148 BOOST_CHECK(T(10) == s.at(0));
149 s.at(1) = T(20);
150 BOOST_CHECK(T(20) == s[1]);
151 BOOST_CHECK(T(20) == s.at(1));
152 }
153 }
154
155 template <typename T, size_t N>
156 void test_push_back_nd()
157 {
158 varray<T, N> s;
159
160 BOOST_CHECK(s.size() == 0);
161 BOOST_CHECK_THROW( s.at(0), std::out_of_range );
162
163 for ( size_t i = 0 ; i < N ; ++i )
164 {
165 s.push_back(T(i));
166 BOOST_CHECK(s.size() == i + 1);
167 BOOST_CHECK_THROW( s.at(i + 1), std::out_of_range );
168 BOOST_CHECK(T(i) == s.at(i));
169 BOOST_CHECK(T(i) == s[i]);
170 BOOST_CHECK(T(i) == s.back());
171 BOOST_CHECK(T(0) == s.front());
172 }
173 }
174
175 template <typename T, size_t N>
176 void test_pop_back_nd()
177 {
178 varray<T, N> s;
179
180 for ( size_t i = 0 ; i < N ; ++i )
181 s.push_back(T(i));
182
183 for ( size_t i = N ; i > 1 ; --i )
184 {
185 s.pop_back();
186 BOOST_CHECK(s.size() == i - 1);
187 BOOST_CHECK_THROW( s.at(i - 1), std::out_of_range );
188 BOOST_CHECK(T(i - 2) == s.at(i - 2));
189 BOOST_CHECK(T(i - 2) == s[i - 2]);
190 BOOST_CHECK(T(i - 2) == s.back());
191 BOOST_CHECK(T(0) == s.front());
192 }
193 }
194
195 template <typename It1, typename It2>
196 void test_compare_ranges(It1 first1, It1 last1, It2 first2, It2 last2)
197 {
198 BOOST_CHECK(std::distance(first1, last1) == std::distance(first2, last2));
199 for ( ; first1 != last1 && first2 != last2 ; ++first1, ++first2 )
200 BOOST_CHECK(*first1 == *first2);
201 }
202
203 template <typename T, size_t N>
204 void test_copy_and_assign_nd(T const& val)
205 {
206 varray<T, N> s;
207 std::vector<T> v;
208 std::list<T> l;
209
210 for ( size_t i = 0 ; i < N ; ++i )
211 {
212 s.push_back(T(i));
213 v.push_back(T(i));
214 l.push_back(T(i));
215 }
216 // copy ctor
217 {
218 varray<T, N> s1(s);
219 BOOST_CHECK(s.size() == s1.size());
220 test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
221 }
222 // copy assignment
223 {
224 varray<T, N> s1;
225 BOOST_CHECK(0 == s1.size());
226 s1 = s;
227 BOOST_CHECK(s.size() == s1.size());
228 test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
229 }
230 // ctor(Iter, Iter)
231 {
232 varray<T, N> s1(s.begin(), s.end());
233 BOOST_CHECK(s.size() == s1.size());
234 test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
235 }
236 {
237 varray<T, N> s1(v.begin(), v.end());
238 BOOST_CHECK(v.size() == s1.size());
239 test_compare_ranges(v.begin(), v.end(), s1.begin(), s1.end());
240 }
241 {
242 varray<T, N> s1(l.begin(), l.end());
243 BOOST_CHECK(l.size() == s1.size());
244 test_compare_ranges(l.begin(), l.end(), s1.begin(), s1.end());
245 }
246 // assign(Iter, Iter)
247 {
248 varray<T, N> s1;
249 BOOST_CHECK(0 == s1.size());
250 s1.assign(s.begin(), s.end());
251 BOOST_CHECK(s.size() == s1.size());
252 test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
253 }
254 {
255 varray<T, N> s1;
256 BOOST_CHECK(0 == s1.size());
257 s1.assign(v.begin(), v.end());
258 BOOST_CHECK(v.size() == s1.size());
259 test_compare_ranges(v.begin(), v.end(), s1.begin(), s1.end());
260 }
261 {
262 varray<T, N> s1;
263 BOOST_CHECK(0 == s1.size());
264 s1.assign(l.begin(), l.end());
265 BOOST_CHECK(l.size() == s1.size());
266 test_compare_ranges(l.begin(), l.end(), s1.begin(), s1.end());
267 }
268 // assign(N, V)
269 {
270 varray<T, N> s1(s);
271 test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
272 std::vector<T> a(N, val);
273 s1.assign(N, val);
274 test_compare_ranges(a.begin(), a.end(), s1.begin(), s1.end());
275 }
276 }
277
278 template <typename T, size_t N>
279 void test_iterators_nd()
280 {
281 varray<T, N> s;
282 std::vector<T> v;
283
284 for ( size_t i = 0 ; i < N ; ++i )
285 {
286 s.push_back(T(i));
287 v.push_back(T(i));
288 }
289
290 test_compare_ranges(s.begin(), s.end(), v.begin(), v.end());
291 test_compare_ranges(s.rbegin(), s.rend(), v.rbegin(), v.rend());
292
293 s.assign(v.rbegin(), v.rend());
294
295 test_compare_ranges(s.begin(), s.end(), v.rbegin(), v.rend());
296 test_compare_ranges(s.rbegin(), s.rend(), v.begin(), v.end());
297 }
298
299 template <typename T, size_t N>
300 void test_erase_nd()
301 {
302 varray<T, N> s;
303
304 for ( size_t i = 0 ; i < N ; ++i )
305 s.push_back(T(i));
306
307 // erase(pos)
308 {
309 for ( size_t i = 0 ; i < N ; ++i )
310 {
311 varray<T, N> s1(s);
312 s1.erase(s1.begin() + i);
313 BOOST_CHECK(s1.size() == N - 1);
314 for ( size_t j = 0 ; j < i ; ++j )
315 BOOST_CHECK(s1[j] == T(j));
316 for ( size_t j = i+1 ; j < N ; ++j )
317 BOOST_CHECK(s1[j-1] == T(j));
318 }
319 }
320 // erase(first, last)
321 {
322 size_t n = N/3;
323 for ( size_t i = 0 ; i <= N ; ++i )
324 {
325 varray<T, N> s1(s);
326 size_t removed = i + n < N ? n : N - i;
327 s1.erase(s1.begin() + i, s1.begin() + i + removed);
328 BOOST_CHECK(s1.size() == N - removed);
329 for ( size_t j = 0 ; j < i ; ++j )
330 BOOST_CHECK(s1[j] == T(j));
331 for ( size_t j = i+n ; j < N ; ++j )
332 BOOST_CHECK(s1[j-n] == T(j));
333 }
334 }
335 }
336
337 template <typename T, size_t N>
338 void test_insert_nd(T const& val)
339 {
340 size_t h = N/2;
341
342 varray<T, N> s, ss;
343 std::vector<T> v;
344 std::list<T> l;
345
346 for ( size_t i = 0 ; i < h ; ++i )
347 {
348 s.push_back(T(i));
349 ss.push_back(T(100 + i));
350 v.push_back(T(100 + i));
351 l.push_back(T(100 + i));
352 }
353
354 // insert(pos, val)
355 {
356 for ( size_t i = 0 ; i <= h ; ++i )
357 {
358 varray<T, N> s1(s);
359 s1.insert(s1.begin() + i, val);
360 BOOST_CHECK(s1.size() == h+1);
361 for ( size_t j = 0 ; j < i ; ++j )
362 BOOST_CHECK(s1[j] == T(j));
363 BOOST_CHECK(s1[i] == val);
364 for ( size_t j = 0 ; j < h-i ; ++j )
365 BOOST_CHECK(s1[j+i+1] == T(j+i));
366 }
367 }
368 // insert(pos, n, val)
369 {
370 size_t n = size_t(h/1.5f);
371 for ( size_t i = 0 ; i <= h ; ++i )
372 {
373 varray<T, N> s1(s);
374 s1.insert(s1.begin() + i, n, val);
375 BOOST_CHECK(s1.size() == h+n);
376 for ( size_t j = 0 ; j < i ; ++j )
377 BOOST_CHECK(s1[j] == T(j));
378 for ( size_t j = 0 ; j < n ; ++j )
379 BOOST_CHECK(s1[j+i] == val);
380 for ( size_t j = 0 ; j < h-i ; ++j )
381 BOOST_CHECK(s1[j+i+n] == T(j+i));
382 }
383 }
384 // insert(pos, first, last)
385 {
386 size_t n = size_t(h/1.5f);
387 for ( size_t i = 0 ; i <= h ; ++i )
388 {
389 varray<T, N> s1(s);
390 s1.insert(s1.begin() + i, ss.begin(), ss.begin() + n);
391 BOOST_CHECK(s1.size() == h+n);
392 for ( size_t j = 0 ; j < i ; ++j )
393 BOOST_CHECK(s1[j] == T(j));
394 for ( size_t j = 0 ; j < n ; ++j )
395 BOOST_CHECK(s1[j+i] == T(100 + j));
396 for ( size_t j = 0 ; j < h-i ; ++j )
397 BOOST_CHECK(s1[j+i+n] == T(j+i));
398 }
399 }
400 {
401 size_t n = size_t(h/1.5f);
402 for ( size_t i = 0 ; i <= h ; ++i )
403 {
404 varray<T, N> s1(s);
405 s1.insert(s1.begin() + i, v.begin(), v.begin() + n);
406 BOOST_CHECK(s1.size() == h+n);
407 for ( size_t j = 0 ; j < i ; ++j )
408 BOOST_CHECK(s1[j] == T(j));
409 for ( size_t j = 0 ; j < n ; ++j )
410 BOOST_CHECK(s1[j+i] == T(100 + j));
411 for ( size_t j = 0 ; j < h-i ; ++j )
412 BOOST_CHECK(s1[j+i+n] == T(j+i));
413 }
414 }
415 {
416 size_t n = size_t(h/1.5f);
417 for ( size_t i = 0 ; i <= h ; ++i )
418 {
419 varray<T, N> s1(s);
420 typename std::list<T>::iterator it = l.begin();
421 std::advance(it, n);
422 s1.insert(s1.begin() + i, l.begin(), it);
423 BOOST_CHECK(s1.size() == h+n);
424 for ( size_t j = 0 ; j < i ; ++j )
425 BOOST_CHECK(s1[j] == T(j));
426 for ( size_t j = 0 ; j < n ; ++j )
427 BOOST_CHECK(s1[j+i] == T(100 + j));
428 for ( size_t j = 0 ; j < h-i ; ++j )
429 BOOST_CHECK(s1[j+i+n] == T(j+i));
430 }
431 }
432 }
433
434 int test_main(int, char* [])
435 {
436 BOOST_CHECK(counting_value::count() == 0);
437
438 test_ctor_ndc<int, 10>();
439 test_ctor_ndc<value_ndc, 10>();
440 test_ctor_ndc<counting_value, 10>();
441 BOOST_CHECK(counting_value::count() == 0);
442
443 test_ctor_nc<int, 10>(5);
444 test_ctor_nc<value_nc, 10>(5);
445 test_ctor_nc<counting_value, 10>(5);
446 BOOST_CHECK(counting_value::count() == 0);
447
448 test_ctor_nd<int, 10>(5, 1);
449 test_ctor_nd<value_nd, 10>(5, value_nd(1));
450 test_ctor_nd<counting_value, 10>(5, counting_value(1));
451 BOOST_CHECK(counting_value::count() == 0);
452
453 test_resize_nc<int, 10>(5);
454 test_resize_nc<value_nc, 10>(5);
455 test_resize_nc<counting_value, 10>(5);
456 BOOST_CHECK(counting_value::count() == 0);
457
458 test_resize_nd<int, 10>(5, 1);
459 test_resize_nd<value_nd, 10>(5, value_nd(1));
460 test_resize_nd<counting_value, 10>(5, counting_value(1));
461 BOOST_CHECK(counting_value::count() == 0);
462
463 test_push_back_nd<int, 10>();
464 test_push_back_nd<value_nd, 10>();
465 test_push_back_nd<counting_value, 10>();
466 BOOST_CHECK(counting_value::count() == 0);
467
468 test_pop_back_nd<int, 10>();
469 test_pop_back_nd<value_nd, 10>();
470 test_pop_back_nd<counting_value, 10>();
471 BOOST_CHECK(counting_value::count() == 0);
472
473 test_copy_and_assign_nd<int, 10>(1);
474 test_copy_and_assign_nd<value_nd, 10>(value_nd(1));
475 test_copy_and_assign_nd<counting_value, 10>(counting_value(1));
476 BOOST_CHECK(counting_value::count() == 0);
477
478 test_iterators_nd<int, 10>();
479 test_iterators_nd<value_nd, 10>();
480 test_iterators_nd<counting_value, 10>();
481 BOOST_CHECK(counting_value::count() == 0);
482
483 test_erase_nd<int, 10>();
484 test_erase_nd<value_nd, 10>();
485 test_erase_nd<counting_value, 10>();
486 BOOST_CHECK(counting_value::count() == 0);
487
488 test_insert_nd<int, 10>(50);
489 test_insert_nd<value_nd, 10>(value_nd(50));
490 test_insert_nd<counting_value, 10>(counting_value(50));
491 BOOST_CHECK(counting_value::count() == 0);
492
493 return 0;
494 }