]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/stl_interfaces/test/static_vec.cpp
1 // Copyright (C) 2019 T. Zachary Laine
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 #include "../example/static_vector.hpp"
8 #include "ill_formed.hpp"
10 #include <boost/core/lightweight_test.hpp>
14 // Instantiate all the members we can.
15 template struct static_vector
<int, 1024>;
17 using vec_type
= static_vector
<int, 10>;
20 void test_default_ctor()
23 BOOST_TEST(v
.empty());
24 BOOST_TEST(v
.size() == 0u);
26 BOOST_TEST(v
.max_size() == 10u);
27 BOOST_TEST(v
.capacity() == 10u);
33 BOOST_TEST_THROWS(v
.at(0), std::out_of_range
);
35 vec_type
const & cv
= v
;
36 BOOST_TEST(cv
.empty());
37 BOOST_TEST(cv
.size() == 0u);
39 BOOST_TEST(cv
.max_size() == 10u);
40 BOOST_TEST(cv
.capacity() == 10u);
46 BOOST_TEST_THROWS(cv
.at(0), std::out_of_range
);
50 void test_other_ctors_assign_ctor()
54 BOOST_TEST(!v
.empty());
55 BOOST_TEST(v
.size() == 3u);
57 vec_type
v2(std::initializer_list
<int>{0, 0, 0});
62 std::initializer_list
<int> il
{3, 2, 1};
64 BOOST_TEST(!v
.empty());
65 BOOST_TEST(v
.size() == 3u);
67 static_assert(std::is_same
<decltype(v
= il
), vec_type
&>::value
, "");
75 std::initializer_list
<int> il
{3, 2, 1};
78 BOOST_TEST(!v
.empty());
79 BOOST_TEST(v
.size() == 3u);
81 static_assert(std::is_same
<decltype(v
.assign(il
)), void>::value
, "");
90 BOOST_TEST(!v
.empty());
91 BOOST_TEST(v
.size() == 3u);
93 vec_type v2
= {4, 4, 4};
100 BOOST_TEST(!v
.empty());
101 BOOST_TEST(v
.size() == 3u);
103 static_assert(std::is_same
<decltype(v
.assign(3, 4)), void>::value
, "");
105 vec_type v2
= {4, 4, 4};
110 std::array
<int, 3> a
= {{1, 2, 3}};
112 vec_type
v(a
.begin(), a
.end());
113 BOOST_TEST(!v
.empty());
114 BOOST_TEST(v
.size() == 3u);
116 vec_type v2
= {1, 2, 3};
121 std::array
<int, 3> a
= {{1, 2, 3}};
124 v
.assign(a
.begin(), a
.end());
125 BOOST_TEST(!v
.empty());
126 BOOST_TEST(v
.size() == 3u);
129 std::is_same
<decltype(v
.assign(a
.begin(), a
.end())), void>::value
,
132 vec_type v2
= {1, 2, 3};
143 static_assert(std::is_same
<decltype(v
.resize(1)), void>::value
, "");
146 BOOST_TEST(v
== vec_type(3));
149 BOOST_TEST(v
== vec_type(6));
156 BOOST_TEST(v
== vec_type(3));
159 BOOST_TEST(v
== vec_type
{});
164 void test_assignment_copy_move_equality()
167 vec_type v2
= {4, 4, 4};
175 vec_type v2
= {4, 4, 4};
177 static_assert(std::is_same
<decltype(v
= v2
), vec_type
&>::value
, "");
179 std::is_same
<decltype(v
= std::move(v2
)), vec_type
&>::value
, "");
186 vec_type v2
= {4, 4, 4};
188 vec_type
v(std::move(v2
));
189 BOOST_TEST(v
== (vec_type(3, 4)));
190 BOOST_TEST(v2
.empty());
195 vec_type v2
= {4, 4, 4};
198 BOOST_TEST(v
== (vec_type(3, 4)));
199 BOOST_TEST(v2
.empty());
204 void test_comparisons()
206 vec_type sm
= {1, 2, 3};
207 vec_type md
= {1, 2, 3, 4};
208 vec_type lg
= {1, 2, 3, 4, 5};
210 BOOST_TEST(sm
== sm
);
211 BOOST_TEST(!(sm
== md
));
212 BOOST_TEST(!(sm
== lg
));
214 BOOST_TEST(!(sm
!= sm
));
215 BOOST_TEST(sm
!= md
);
216 BOOST_TEST(sm
!= lg
);
218 BOOST_TEST(!(sm
< sm
));
222 BOOST_TEST(sm
<= sm
);
223 BOOST_TEST(sm
<= md
);
224 BOOST_TEST(sm
<= lg
);
226 BOOST_TEST(!(sm
> sm
));
227 BOOST_TEST(!(sm
> md
));
228 BOOST_TEST(!(sm
> lg
));
230 BOOST_TEST(sm
>= sm
);
231 BOOST_TEST(!(sm
>= md
));
232 BOOST_TEST(!(sm
>= lg
));
235 BOOST_TEST(!(md
== sm
));
236 BOOST_TEST(md
== md
);
237 BOOST_TEST(!(md
== lg
));
239 BOOST_TEST(!(md
< sm
));
240 BOOST_TEST(!(md
< md
));
243 BOOST_TEST(!(md
<= sm
));
244 BOOST_TEST(md
<= md
);
245 BOOST_TEST(md
<= lg
);
248 BOOST_TEST(!(md
> md
));
249 BOOST_TEST(!(md
> lg
));
251 BOOST_TEST(md
>= sm
);
252 BOOST_TEST(md
>= md
);
253 BOOST_TEST(!(md
>= lg
));
256 BOOST_TEST(!(lg
== sm
));
257 BOOST_TEST(!(lg
== md
));
258 BOOST_TEST(lg
== lg
);
260 BOOST_TEST(!(lg
< sm
));
261 BOOST_TEST(!(lg
< md
));
262 BOOST_TEST(!(lg
< lg
));
264 BOOST_TEST(!(lg
<= sm
));
265 BOOST_TEST(!(lg
<= md
));
266 BOOST_TEST(lg
<= lg
);
270 BOOST_TEST(!(lg
> lg
));
272 BOOST_TEST(lg
>= sm
);
273 BOOST_TEST(lg
>= md
);
274 BOOST_TEST(lg
>= lg
);
284 static_assert(std::is_same
<decltype(v1
.swap(v2
)), void>::value
, "");
285 static_assert(std::is_same
<decltype(swap(v1
, v2
)), void>::value
, "");
289 BOOST_TEST(v1
.size() == 4u);
290 BOOST_TEST(v2
.size() == 3u);
292 BOOST_TEST(v1
== vec_type(4, 3));
293 BOOST_TEST(v2
== vec_type(3, 4));
302 BOOST_TEST(v1
.size() == 4u);
303 BOOST_TEST(v2
.size() == 3u);
305 BOOST_TEST(v1
== vec_type(4, 3));
306 BOOST_TEST(v2
== vec_type(3, 4));
310 template<typename Iter
>
311 using writable_iter_t
= decltype(
312 *std::declval
<Iter
>() =
313 std::declval
<typename
std::iterator_traits
<Iter
>::value_type
>());
318 decltype(std::declval
<vec_type
const &>().begin())>::value
,
323 decltype(std::declval
<vec_type
const &>().end())>::value
,
326 ill_formed
<writable_iter_t
, decltype(std::declval
<vec_type
&>().cbegin())>::
330 ill_formed
<writable_iter_t
, decltype(std::declval
<vec_type
&>().cend())>::
337 decltype(std::declval
<vec_type
const &>().rbegin())>::value
,
342 decltype(std::declval
<vec_type
const &>().rend())>::value
,
347 decltype(std::declval
<vec_type
&>().crbegin())>::value
,
350 ill_formed
<writable_iter_t
, decltype(std::declval
<vec_type
&>().crend())>::
354 void test_iterators()
357 vec_type v
= {3, 2, 1};
360 std::is_same
<decltype(v
.begin()), vec_type::iterator
>::value
, "");
362 std::is_same
<decltype(v
.end()), vec_type::iterator
>::value
, "");
364 std::is_same
<decltype(v
.cbegin()), vec_type::const_iterator
>::value
,
367 std::is_same
<decltype(v
.cend()), vec_type::const_iterator
>::value
,
370 std::is_same
<decltype(v
.rbegin()), vec_type::reverse_iterator
>::
374 std::is_same
<decltype(v
.rbegin()), vec_type::reverse_iterator
>::
379 decltype(v
.crbegin()),
380 vec_type::const_reverse_iterator
>::value
,
384 decltype(v
.crbegin()),
385 vec_type::const_reverse_iterator
>::value
,
388 std::array
<int, 3> const a
= {{3, 2, 1}};
389 std::array
<int, 3> const ra
= {{1, 2, 3}};
391 BOOST_TEST(std::equal(v
.begin(), v
.end(), a
.begin(), a
.end()));
392 BOOST_TEST(std::equal(v
.cbegin(), v
.cend(), a
.begin(), a
.end()));
394 BOOST_TEST(std::equal(v
.rbegin(), v
.rend(), ra
.begin(), ra
.end()));
395 BOOST_TEST(std::equal(v
.crbegin(), v
.crend(), ra
.begin(), ra
.end()));
399 BOOST_TEST(v
== vec_type({8, 2, 9}));
403 vec_type
const v
= {3, 2, 1};
406 std::is_same
<decltype(v
.begin()), vec_type::const_iterator
>::value
,
409 std::is_same
<decltype(v
.end()), vec_type::const_iterator
>::value
,
412 std::is_same
<decltype(v
.cbegin()), vec_type::const_iterator
>::value
,
415 std::is_same
<decltype(v
.cend()), vec_type::const_iterator
>::value
,
419 decltype(v
.rbegin()),
420 vec_type::const_reverse_iterator
>::value
,
424 decltype(v
.rbegin()),
425 vec_type::const_reverse_iterator
>::value
,
429 decltype(v
.crbegin()),
430 vec_type::const_reverse_iterator
>::value
,
434 decltype(v
.crbegin()),
435 vec_type::const_reverse_iterator
>::value
,
438 std::array
<int, 3> const a
= {{3, 2, 1}};
439 std::array
<int, 3> const ra
= {{1, 2, 3}};
441 BOOST_TEST(std::equal(v
.begin(), v
.end(), a
.begin(), a
.end()));
442 BOOST_TEST(std::equal(v
.cbegin(), v
.cend(), a
.begin(), a
.end()));
444 BOOST_TEST(std::equal(v
.rbegin(), v
.rend(), ra
.begin(), ra
.end()));
445 BOOST_TEST(std::equal(v
.crbegin(), v
.crend(), ra
.begin(), ra
.end()));
450 void test_emplace_insert()
457 std::is_same
<decltype(v
.emplace_back(0)), vec_type::reference
>::
461 std::is_same
<decltype(v
.emplace_back(i
)), vec_type::reference
>::
466 BOOST_TEST(v
.front() == i
);
467 BOOST_TEST(v
.back() == i
);
470 BOOST_TEST(v
.front() == i
);
471 BOOST_TEST(v
.back() == 1);
474 BOOST_TEST(v
.front() == i
);
475 BOOST_TEST(v
.back() == 2);
477 BOOST_TEST(v
== vec_type({0, 1, 2}));
486 decltype(v
.emplace(v
.begin(), 0)),
487 vec_type::iterator
>::value
,
491 decltype(v
.emplace(v
.begin(), i
)),
492 vec_type::iterator
>::value
,
495 v
.emplace(v
.begin(), i
);
496 BOOST_TEST(v
== vec_type({0, 1, 2}));
498 v
.emplace(v
.end(), 3);
499 BOOST_TEST(v
== vec_type({0, 1, 2, 3}));
501 v
.emplace(v
.begin() + 2, 9);
502 BOOST_TEST(v
== vec_type({0, 1, 9, 2, 3}));
508 std::array
<int, 2> a1
= {{0, 0}};
509 std::array
<int, 1> a2
= {{3}};
510 std::array
<int, 3> a3
= {{9, 9, 9}};
514 decltype(v
.insert(v
.begin(), a1
.begin(), a1
.end())),
515 vec_type::iterator
>::value
,
518 auto const it0
= v
.insert(v
.begin(), a1
.begin(), a1
.end());
519 BOOST_TEST(v
== vec_type({0, 0, 1, 2}));
520 BOOST_TEST(it0
== v
.begin());
522 auto const it1
= v
.insert(v
.end(), a2
.begin(), a2
.end());
523 BOOST_TEST(v
== vec_type({0, 0, 1, 2, 3}));
524 BOOST_TEST(it1
== v
.begin() + 4);
526 auto const it2
= v
.insert(v
.begin() + 2, a3
.begin(), a3
.end());
527 BOOST_TEST(v
== vec_type({0, 0, 9, 9, 9, 1, 2, 3}));
528 BOOST_TEST(it2
== v
.begin() + 2);
536 std::is_same
<decltype(v
.insert(v
.begin(), 0)), vec_type::iterator
>::
540 std::is_same
<decltype(v
.insert(v
.begin(), i
)), vec_type::iterator
>::
544 v
.insert(v
.begin(), i
);
545 BOOST_TEST(v
== vec_type({0, 1, 2}));
547 v
.insert(v
.end(), 3);
548 BOOST_TEST(v
== vec_type({0, 1, 2, 3}));
550 v
.insert(v
.begin() + 2, 9);
551 BOOST_TEST(v
== vec_type({0, 1, 9, 2, 3}));
559 decltype(v
.insert(v
.begin(), 3, 0)),
560 vec_type::iterator
>::value
,
563 v
.insert(v
.begin(), 2, 0);
564 BOOST_TEST(v
== vec_type({0, 0, 1, 2}));
566 v
.insert(v
.end(), 1, 3);
567 BOOST_TEST(v
== vec_type({0, 0, 1, 2, 3}));
569 v
.insert(v
.begin() + 2, 3, 9);
570 BOOST_TEST(v
== vec_type({0, 0, 9, 9, 9, 1, 2, 3}));
578 decltype(v
.insert(v
.begin(), std::initializer_list
<int>{0, 0})),
579 vec_type::iterator
>::value
,
582 v
.insert(v
.begin(), std::initializer_list
<int>{0, 0});
583 BOOST_TEST(v
== vec_type({0, 0, 1, 2}));
585 v
.insert(v
.end(), std::initializer_list
<int>{3});
586 BOOST_TEST(v
== vec_type({0, 0, 1, 2, 3}));
588 v
.insert(v
.begin() + 2, std::initializer_list
<int>{9, 9, 9});
589 BOOST_TEST(v
== vec_type({0, 0, 9, 9, 9, 1, 2, 3}));
597 vec_type v
= {3, 2, 1};
601 decltype(v
.erase(v
.begin(), v
.end())),
602 vec_type::iterator
>::value
,
605 std::is_same
<decltype(v
.erase(v
.begin())), vec_type::iterator
>::
609 v
.erase(v
.begin(), v
.end());
610 BOOST_TEST(v
.empty());
611 BOOST_TEST(v
.size() == 0u);
615 vec_type v
= {3, 2, 1};
616 v
.erase(v
.begin() + 1, v
.end());
617 BOOST_TEST(!v
.empty());
618 BOOST_TEST(v
.size() == 1u);
619 BOOST_TEST(v
== vec_type(1, 3));
623 vec_type v
= {3, 2, 1};
624 v
.erase(v
.begin(), v
.end() - 1);
625 BOOST_TEST(!v
.empty());
626 BOOST_TEST(v
.size() == 1u);
627 BOOST_TEST(v
== vec_type(1, 1));
631 vec_type v
= {3, 2, 1};
633 BOOST_TEST(!v
.empty());
634 BOOST_TEST(v
.size() == 2u);
635 BOOST_TEST(v
== vec_type({2, 1}));
639 vec_type v
= {3, 2, 1};
640 v
.erase(v
.begin() + 1);
641 BOOST_TEST(!v
.empty());
642 BOOST_TEST(v
.size() == 2u);
643 BOOST_TEST(v
== vec_type({3, 1}));
647 vec_type v
= {3, 2, 1};
648 v
.erase(v
.begin() + 2);
649 BOOST_TEST(!v
.empty());
650 BOOST_TEST(v
.size() == 2u);
651 BOOST_TEST(v
== vec_type({3, 2}));
657 typename ValueType
= typename
Container::value_type
>
658 using lvalue_push_front_t
= decltype(
659 std::declval
<Container
&>().push_front(std::declval
<ValueType
const &>()));
662 typename ValueType
= typename
Container::value_type
>
663 using rvalue_push_front_t
= decltype(std::declval
<Container
&>().push_front(0));
664 template<typename Container
>
665 using pop_front_t
= decltype(std::declval
<Container
&>().pop_front());
667 static_assert(ill_formed
<lvalue_push_front_t
, vec_type
>::value
, "");
668 static_assert(ill_formed
<rvalue_push_front_t
, vec_type
>::value
, "");
669 static_assert(ill_formed
<pop_front_t
, vec_type
>::value
, "");
671 void test_front_back()
677 static_assert(std::is_same
<decltype(v
.push_back(0)), void>::value
, "");
678 static_assert(std::is_same
<decltype(v
.push_back(i
)), void>::value
, "");
679 static_assert(std::is_same
<decltype(v
.pop_back()), void>::value
, "");
682 BOOST_TEST(v
.front() == i
);
683 BOOST_TEST(v
.back() == i
);
686 BOOST_TEST(v
.front() == i
);
687 BOOST_TEST(v
.back() == 1);
690 BOOST_TEST(v
.front() == i
);
691 BOOST_TEST(v
.back() == 2);
693 static_assert(std::is_same
<decltype(v
.front()), int &>::value
, "");
694 static_assert(std::is_same
<decltype(v
.back()), int &>::value
, "");
698 BOOST_TEST(v
== vec_type({9, 1, 8}));
701 BOOST_TEST(v
== vec_type({9, 1}));
705 vec_type
const v
= {3, 2, 1};
706 BOOST_TEST(v
.front() == 3);
707 BOOST_TEST(v
.back() == 1);
710 std::is_same
<decltype(v
.front()), int const &>::value
, "");
711 static_assert(std::is_same
<decltype(v
.back()), int const &>::value
, "");
716 void test_data_index_at()
719 vec_type v
= {3, 2, 1};
720 BOOST_TEST(v
.data()[0] == 3);
721 BOOST_TEST(v
.data()[1] == 2);
722 BOOST_TEST(v
.data()[2] == 1);
723 BOOST_TEST(v
[0] == 3);
724 BOOST_TEST(v
[1] == 2);
725 BOOST_TEST(v
[2] == 1);
726 BOOST_TEST_NO_THROW(v
.at(0));
727 BOOST_TEST_NO_THROW(v
.at(1));
728 BOOST_TEST_NO_THROW(v
.at(2));
729 BOOST_TEST_THROWS(v
.at(3), std::out_of_range
);
731 static_assert(std::is_same
<decltype(v
.data()), int *>::value
, "");
732 static_assert(std::is_same
<decltype(v
[0]), int &>::value
, "");
733 static_assert(std::is_same
<decltype(v
.at(0)), int &>::value
, "");
737 BOOST_TEST(v
== vec_type({8, 9, 1}));
741 vec_type
const v
= {3, 2, 1};
742 BOOST_TEST(v
.data()[0] == 3);
743 BOOST_TEST(v
.data()[1] == 2);
744 BOOST_TEST(v
.data()[2] == 1);
745 BOOST_TEST(v
[0] == 3);
746 BOOST_TEST(v
[1] == 2);
747 BOOST_TEST(v
[2] == 1);
748 BOOST_TEST_NO_THROW(v
.at(0));
749 BOOST_TEST_NO_THROW(v
.at(1));
750 BOOST_TEST_NO_THROW(v
.at(2));
751 BOOST_TEST_THROWS(v
.at(3), std::out_of_range
);
753 static_assert(std::is_same
<decltype(v
.data()), int const *>::value
, "");
754 static_assert(std::is_same
<decltype(v
[0]), int const &>::value
, "");
755 static_assert(std::is_same
<decltype(v
.at(0)), int const &>::value
, "");
762 test_other_ctors_assign_ctor();
764 test_assignment_copy_move_equality();
768 test_emplace_insert();
771 test_data_index_at();
772 return boost::report_errors();