]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/stl_interfaces/test/output.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 <boost/core/lightweight_test.hpp>
13 #include <type_traits>
16 struct basic_output_iter
17 : boost::stl_interfaces::
18 iterator_interface
<basic_output_iter
, std::output_iterator_tag
, int>
20 basic_output_iter() : it_(nullptr) {}
21 basic_output_iter(int * it
) : it_(it
) {}
23 int & operator*() noexcept
{ return *it_
; }
24 basic_output_iter
& operator++() noexcept
30 using base_type
= boost::stl_interfaces::
31 iterator_interface
<basic_output_iter
, std::output_iterator_tag
, int>;
32 using base_type::operator++;
38 using output
= basic_output_iter
;
40 #if 201703L < __cplusplus && defined(__cpp_lib_concepts)
41 static_assert(std::output_iterator
<output
, int>, "");
43 BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
45 std::output_iterator_tag
,
46 std::output_iterator_tag
,
52 template<typename Container
>
53 struct back_insert_iter
: boost::stl_interfaces::iterator_interface
<
54 back_insert_iter
<Container
>,
55 std::output_iterator_tag
,
56 typename
Container::value_type
,
57 back_insert_iter
<Container
> &>
59 back_insert_iter() : c_(nullptr) {}
60 back_insert_iter(Container
& c
) : c_(std::addressof(c
)) {}
62 back_insert_iter
& operator*() noexcept
{ return *this; }
63 back_insert_iter
& operator++() noexcept
{ return *this; }
65 back_insert_iter
& operator=(typename
Container::value_type
const & v
)
70 back_insert_iter
& operator=(typename
Container::value_type
&& v
)
72 c_
->push_back(std::move(v
));
76 using base_type
= boost::stl_interfaces::iterator_interface
<
77 back_insert_iter
<Container
>,
78 std::output_iterator_tag
,
79 typename
Container::value_type
,
80 back_insert_iter
<Container
> &>;
81 using base_type::operator++;
87 using back_insert
= back_insert_iter
<std::vector
<int>>;
89 #if 201703L < __cplusplus && defined(__cpp_lib_concepts)
90 static_assert(std::output_iterator
<back_insert
, int>, "");
92 BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
94 std::output_iterator_tag
,
95 std::output_iterator_tag
,
102 std::vector
<int> ints
= {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
109 std::vector
<int> ints_copy(ints
.size());
110 std::copy(ints
.begin(), ints
.end(), output(&ints_copy
[0]));
111 BOOST_TEST(ints_copy
== ints
);
116 std::vector
<int> ints_copy
;
117 std::copy(ints
.begin(), ints
.end(), back_insert(ints_copy
));
118 BOOST_TEST(ints_copy
== ints
);
123 std::vector
<int> ints_copy
;
124 back_insert
out(ints_copy
);
125 for (int i
= 0; i
< 10; ++i
)
129 return boost::report_errors();