]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/stl_interfaces/test/forward.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 <boost/stl_interfaces/iterator_interface.hpp>
8 #include "ill_formed.hpp"
10 #include <boost/core/lightweight_test.hpp>
15 #include <type_traits>
19 using decrementable_t
= decltype(--std::declval
<T
&>());
21 struct basic_forward_iter
22 : boost::stl_interfaces::
23 iterator_interface
<basic_forward_iter
, std::forward_iterator_tag
, int>
25 basic_forward_iter() : it_(nullptr) {}
26 basic_forward_iter(int * it
) : it_(it
) {}
28 int & operator*() const { return *it_
; }
29 basic_forward_iter
& operator++()
35 operator==(basic_forward_iter lhs
, basic_forward_iter rhs
) noexcept
37 return lhs
.it_
== rhs
.it_
;
40 using base_type
= boost::stl_interfaces::
41 iterator_interface
<basic_forward_iter
, std::forward_iterator_tag
, int>;
42 using base_type::operator++;
48 BOOST_STL_INTERFACES_STATIC_ASSERT_CONCEPT(
49 basic_forward_iter
, std::forward_iterator
)
50 BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
52 std::forward_iterator_tag
,
53 std::forward_iterator_tag
,
59 static_assert(ill_formed
<decrementable_t
, basic_forward_iter
>::value
, "");
61 template<typename ValueType
>
62 struct forward_iter
: boost::stl_interfaces::iterator_interface
<
63 forward_iter
<ValueType
>,
64 std::forward_iterator_tag
,
67 forward_iter() : it_(nullptr) {}
68 forward_iter(ValueType
* it
) : it_(it
) {}
71 typename E
= std::enable_if_t
<
72 std::is_convertible
<ValueType2
*, ValueType
*>::value
>>
73 forward_iter(forward_iter
<ValueType2
> it
) : it_(it
.it_
)
76 ValueType
& operator*() const { return *it_
; }
77 forward_iter
& operator++()
82 friend bool operator==(forward_iter lhs
, forward_iter rhs
) noexcept
84 return lhs
.it_
== rhs
.it_
;
87 using base_type
= boost::stl_interfaces::iterator_interface
<
88 forward_iter
<ValueType
>,
89 std::forward_iterator_tag
,
91 using base_type::operator++;
96 template<typename ValueType2
>
97 friend struct forward_iter
;
100 using forward
= forward_iter
<int>;
101 using const_forward
= forward_iter
<int const>;
103 static_assert(ill_formed
<decrementable_t
, forward
>::value
, "");
104 static_assert(ill_formed
<decrementable_t
, const_forward
>::value
, "");
106 BOOST_STL_INTERFACES_STATIC_ASSERT_CONCEPT(forward
, std::forward_iterator
)
107 BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
109 std::forward_iterator_tag
,
110 std::forward_iterator_tag
,
116 BOOST_STL_INTERFACES_STATIC_ASSERT_CONCEPT(const_forward
, std::forward_iterator
)
117 BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
119 std::forward_iterator_tag
,
120 std::forward_iterator_tag
,
127 std::array
<int, 10> ints
= {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
134 #include "view_tests.hpp"
137 using data_t
= decltype(std::declval
<T
>().data());
145 boost::stl_interfaces::element_layout::discontiguous
>>::value
,
153 boost::stl_interfaces::element_layout::discontiguous
> const>::
158 using size_t_
= decltype(std::declval
<T
>().size());
166 boost::stl_interfaces::element_layout::discontiguous
>>::value
,
174 boost::stl_interfaces::element_layout::discontiguous
> const>::
179 using back_t_
= decltype(std::declval
<T
>().back());
187 boost::stl_interfaces::element_layout::discontiguous
>>::value
,
195 boost::stl_interfaces::element_layout::discontiguous
> const>::
200 using index_operator_t
= decltype(std::declval
<T
>()[0]);
208 boost::stl_interfaces::element_layout::discontiguous
>>::value
,
216 boost::stl_interfaces::element_layout::discontiguous
> const>::
225 basic_forward_iter
first(ints
.data());
226 basic_forward_iter
last(ints
.data() + ints
.size());
229 std::array
<int, 10> ints_copy
;
230 std::copy(first
, last
, ints_copy
.begin());
231 BOOST_TEST(ints_copy
== ints
);
235 std::array
<int, 10> iota_ints
;
236 basic_forward_iter
first(iota_ints
.data());
237 basic_forward_iter
last(iota_ints
.data() + iota_ints
.size());
238 std::iota(first
, last
, 0);
239 BOOST_TEST(iota_ints
== ints
);
245 forward
first(ints
.data());
246 forward
last(ints
.data() + ints
.size());
247 const_forward
first_copy(first
);
248 const_forward
last_copy(last
);
249 std::equal(first
, last
, first_copy
, last_copy
);
254 forward
first(ints
.data());
255 forward
last(ints
.data() + ints
.size());
256 while (first
!= last
)
262 forward
first(ints
.data());
263 forward
last(ints
.data() + ints
.size());
266 std::array
<int, 10> ints_copy
;
267 std::copy(first
, last
, ints_copy
.begin());
268 BOOST_TEST(ints_copy
== ints
);
272 std::array
<int, 10> iota_ints
;
273 forward
first(iota_ints
.data());
274 forward
last(iota_ints
.data() + iota_ints
.size());
275 std::iota(first
, last
, 0);
276 BOOST_TEST(iota_ints
== ints
);
282 const_forward
first(ints
.data());
283 const_forward
last(ints
.data() + ints
.size());
286 std::array
<int, 10> ints_copy
;
287 std::copy(first
, last
, ints_copy
.begin());
288 BOOST_TEST(ints_copy
== ints
);
292 BOOST_TEST(std::binary_search(first
, last
, 3));
297 basic_forward_iter
first(ints
.data());
298 basic_forward_iter
last(ints
.data() + ints
.size());
300 auto r
= range
<boost::stl_interfaces::element_layout::discontiguous
>(
303 range
<boost::stl_interfaces::element_layout::discontiguous
>(
308 std::array
<int, 10> ints_copy
;
309 std::copy(r
.begin(), r
.end(), ints_copy
.begin());
310 BOOST_TEST(ints_copy
== ints
);
312 BOOST_TEST(empty
.begin() == empty
.end());
317 BOOST_TEST(!r
.empty());
320 BOOST_TEST(empty
.empty());
324 BOOST_TEST(!cr
.empty());
327 auto const cempty
= empty
;
328 BOOST_TEST(cempty
.empty());
334 BOOST_TEST(r
.front() == 0);
337 BOOST_TEST(cr
.front() == 0);
341 return boost::report_errors();