1 // Boost.Geometry Index
4 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
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
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)
14 #include <boost/test/included/test_exec_monitor.hpp>
15 #include <boost/test/impl/execution_monitor.ipp>
17 #include <boost/geometry/index/detail/varray.hpp>
19 using namespace boost::geometry::index::detail
;
24 explicit value_ndc(int a
) : aa(a
) {}
26 bool operator==(value_ndc
const& v
) const { return aa
== v
.aa
; }
28 value_ndc(value_ndc
const&) {}
29 value_ndc
& operator=(value_ndc
const&) { return *this; }
36 explicit value_nd(int a
) : aa(a
) {}
38 bool operator==(value_nd
const& v
) const { return aa
== v
.aa
; }
46 explicit value_nc(int a
= 0) : aa(a
) {}
48 bool operator==(value_nc
const& v
) const { return aa
== v
.aa
; }
50 value_nc(value_nc
const&) {}
51 value_nc
& operator=(value_ndc
const&) { return *this; }
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(); }
65 static size_t & c() { static size_t co
= 0; return co
; }
69 template <typename T
, size_t N
>
73 BOOST_CHECK(s
.size() == 0);
74 BOOST_CHECK(s
.capacity() == N
);
75 BOOST_CHECK_THROW( s
.at(0), std::out_of_range
);
78 template <typename T
, size_t N
>
79 void test_ctor_nc(size_t 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
)
87 for ( size_t i
= 0 ; i
< n
; ++i
)
88 BOOST_CHECK(T() == s
[i
]);
92 template <typename T
, size_t N
>
93 void test_ctor_nd(size_t n
, T
const& v
)
96 BOOST_CHECK(s
.size() == n
);
97 BOOST_CHECK(s
.capacity() == N
);
98 BOOST_CHECK_THROW( s
.at(n
), std::out_of_range
);
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));
106 BOOST_CHECK(T(10) == s
[0]);
107 BOOST_CHECK(T(10) == s
.at(0));
109 BOOST_CHECK(T(20) == s
[1]);
110 BOOST_CHECK(T(20) == s
.at(1));
114 template <typename T
, size_t N
>
115 void test_resize_nc(size_t n
)
120 BOOST_CHECK(s
.size() == n
);
121 BOOST_CHECK(s
.capacity() == N
);
122 BOOST_CHECK_THROW( s
.at(n
), std::out_of_range
);
124 if ( ! std::is_trivially_constructible
<T
>::value
)
126 for ( size_t i
= 0 ; i
< n
; ++i
)
127 BOOST_CHECK(T() == s
[i
]);
131 template <typename T
, size_t N
>
132 void test_resize_nd(size_t n
, T
const& v
)
137 BOOST_CHECK(s
.size() == n
);
138 BOOST_CHECK(s
.capacity() == N
);
139 BOOST_CHECK_THROW( s
.at(n
), std::out_of_range
);
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));
147 BOOST_CHECK(T(10) == s
[0]);
148 BOOST_CHECK(T(10) == s
.at(0));
150 BOOST_CHECK(T(20) == s
[1]);
151 BOOST_CHECK(T(20) == s
.at(1));
155 template <typename T
, size_t N
>
156 void test_push_back_nd()
160 BOOST_CHECK(s
.size() == 0);
161 BOOST_CHECK_THROW( s
.at(0), std::out_of_range
);
163 for ( size_t i
= 0 ; i
< N
; ++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());
175 template <typename T
, size_t N
>
176 void test_pop_back_nd()
180 for ( size_t i
= 0 ; i
< N
; ++i
)
183 for ( size_t i
= N
; i
> 1 ; --i
)
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());
195 template <typename It1
, typename It2
>
196 void test_compare_ranges(It1 first1
, It1 last1
, It2 first2
, It2 last2
)
198 BOOST_CHECK(std::distance(first1
, last1
) == std::distance(first2
, last2
));
199 for ( ; first1
!= last1
&& first2
!= last2
; ++first1
, ++first2
)
200 BOOST_CHECK(*first1
== *first2
);
203 template <typename T
, size_t N
>
204 void test_copy_and_assign_nd(T
const& val
)
210 for ( size_t i
= 0 ; i
< N
; ++i
)
219 BOOST_CHECK(s
.size() == s1
.size());
220 test_compare_ranges(s
.begin(), s
.end(), s1
.begin(), s1
.end());
225 BOOST_CHECK(0 == s1
.size());
227 BOOST_CHECK(s
.size() == s1
.size());
228 test_compare_ranges(s
.begin(), s
.end(), s1
.begin(), s1
.end());
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());
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());
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());
246 // assign(Iter, Iter)
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());
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());
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());
271 test_compare_ranges(s
.begin(), s
.end(), s1
.begin(), s1
.end());
272 std::vector
<T
> a(N
, val
);
274 test_compare_ranges(a
.begin(), a
.end(), s1
.begin(), s1
.end());
278 template <typename T
, size_t N
>
279 void test_iterators_nd()
284 for ( size_t i
= 0 ; i
< N
; ++i
)
290 test_compare_ranges(s
.begin(), s
.end(), v
.begin(), v
.end());
291 test_compare_ranges(s
.rbegin(), s
.rend(), v
.rbegin(), v
.rend());
293 s
.assign(v
.rbegin(), v
.rend());
295 test_compare_ranges(s
.begin(), s
.end(), v
.rbegin(), v
.rend());
296 test_compare_ranges(s
.rbegin(), s
.rend(), v
.begin(), v
.end());
299 template <typename T
, size_t N
>
304 for ( size_t i
= 0 ; i
< N
; ++i
)
309 for ( size_t i
= 0 ; i
< N
; ++i
)
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
));
320 // erase(first, last)
323 for ( size_t i
= 0 ; i
<= N
; ++i
)
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
));
337 template <typename T
, size_t N
>
338 void test_insert_nd(T
const& val
)
346 for ( size_t i
= 0 ; i
< h
; ++i
)
349 ss
.push_back(T(100 + i
));
350 v
.push_back(T(100 + i
));
351 l
.push_back(T(100 + i
));
356 for ( size_t i
= 0 ; i
<= h
; ++i
)
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
));
368 // insert(pos, n, val)
370 size_t n
= size_t(h
/1.5f
);
371 for ( size_t i
= 0 ; i
<= h
; ++i
)
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
));
384 // insert(pos, first, last)
386 size_t n
= size_t(h
/1.5f
);
387 for ( size_t i
= 0 ; i
<= h
; ++i
)
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
));
401 size_t n
= size_t(h
/1.5f
);
402 for ( size_t i
= 0 ; i
<= h
; ++i
)
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
));
416 size_t n
= size_t(h
/1.5f
);
417 for ( size_t i
= 0 ; i
<= h
; ++i
)
420 typename
std::list
<T
>::iterator it
= l
.begin();
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
));
434 int test_main(int, char* [])
436 BOOST_CHECK(counting_value::count() == 0);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);