Horizon
Loading...
Searching...
No Matches
insert_iterators.hpp
Go to the documentation of this file.
1
2// Range v3 library
3//
4// Copyright Eric Niebler 2014-present
5//
6// Use, modification and distribution is subject to the
7// Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//
11// Project home: https://github.com/ericniebler/range-v3
12//
13#ifndef RANGES_V3_ITERATOR_INSERT_ITERATORS_HPP
14#define RANGES_V3_ITERATOR_INSERT_ITERATORS_HPP
15
16#include <cstddef>
17#include <utility>
18
20
22#include <range/v3/utility/addressof.hpp>
23
24#include <range/v3/detail/prologue.hpp>
25
26namespace ranges
27{
30 template<typename Container>
32 {
33 using container_type = Container;
34 using difference_type = std::ptrdiff_t;
35
36 constexpr back_insert_iterator() = default;
37 constexpr explicit back_insert_iterator(Container & x)
38 : container_(detail::addressof(x))
39 {}
40 back_insert_iterator & operator=(typename Container::value_type const & value)
41 {
42 container_->push_back(value);
43 return *this;
44 }
45 back_insert_iterator & operator=(typename Container::value_type && value)
46 {
47 container_->push_back(std::move(value));
48 return *this;
49 }
50 back_insert_iterator & operator*()
51 {
52 return *this;
53 }
54 back_insert_iterator & operator++()
55 {
56 return *this;
57 }
58 back_insert_iterator operator++(int)
59 {
60 return *this;
61 }
62
63 private:
64 Container * container_ = nullptr;
65 };
66
68 {
69 template<typename Container>
70 constexpr back_insert_iterator<Container> operator()(Container & x) const
71 {
73 }
74 };
75
77 RANGES_INLINE_VARIABLE(back_inserter_fn, back_inserter)
78
79 template<typename Container>
81 {
82 using container_type = Container;
83 using difference_type = std::ptrdiff_t;
84
85 constexpr front_insert_iterator() = default;
86 constexpr explicit front_insert_iterator(Container & x)
87 : container_(detail::addressof(x))
88 {}
89 front_insert_iterator & operator=(typename Container::value_type const & value)
90 {
91 container_->push_front(value);
92 return *this;
93 }
94 front_insert_iterator & operator=(typename Container::value_type && value)
95 {
96 container_->push_front(std::move(value));
97 return *this;
98 }
99 front_insert_iterator & operator*()
100 {
101 return *this;
102 }
103 front_insert_iterator & operator++()
104 {
105 return *this;
106 }
107 front_insert_iterator operator++(int)
108 {
109 return *this;
110 }
111
112 private:
113 Container * container_ = nullptr;
114 };
115
117 {
118 template<typename Cont>
119 constexpr front_insert_iterator<Cont> operator()(Cont & cont) const
120 {
121 return front_insert_iterator<Cont>{cont};
122 }
123 };
124
126 RANGES_INLINE_VARIABLE(front_inserter_fn, front_inserter)
127
128 template<typename Container>
130 {
131 using container_type = Container;
132 using difference_type = std::ptrdiff_t;
133
134 constexpr insert_iterator() = default;
135 constexpr explicit insert_iterator(Container & x, typename Container::iterator w)
136 : container_(detail::addressof(x))
137 , where_(w)
138 {}
139 insert_iterator & operator=(typename Container::value_type const & value)
140 {
141 where_ = ranges::next(container_->insert(where_, value));
142 return *this;
143 }
144 insert_iterator & operator=(typename Container::value_type && value)
145 {
146 where_ = ranges::next(container_->insert(where_, std::move(value)));
147 return *this;
148 }
149 insert_iterator & operator*()
150 {
151 return *this;
152 }
153 insert_iterator & operator++()
154 {
155 return *this;
156 }
157 insert_iterator & operator++(int)
158 {
159 return *this;
160 }
161
162 private:
163 Container * container_ = nullptr;
164 typename Container::iterator where_ = typename Container::iterator();
165 };
166
168 {
169 template<typename Cont>
170 constexpr insert_iterator<Cont> operator()(Cont & cont,
171 typename Cont::iterator where) const
172 {
173 return insert_iterator<Cont>{cont, std::move(where)};
174 }
175 };
176
178 RANGES_INLINE_VARIABLE(inserter_fn, inserter)
179
180 namespace cpp20
181 {
183 using ranges::back_inserter;
185 using ranges::front_inserter;
187 using ranges::inserter;
188 } // namespace cpp20
190} // namespace ranges
191
193RANGES_DIAGNOSTIC_PUSH
194RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
195
196namespace std
197{
198 template<typename Container>
199 struct iterator_traits<::ranges::back_insert_iterator<Container>>
200 : ::ranges::detail::std_output_iterator_traits<>
201 {};
202
203 template<typename Container>
204 struct iterator_traits<::ranges::front_insert_iterator<Container>>
205 : ::ranges::detail::std_output_iterator_traits<>
206 {};
207
208 template<typename Container>
209 struct iterator_traits<::ranges::insert_iterator<Container>>
210 : ::ranges::detail::std_output_iterator_traits<>
211 {};
212} // namespace std
213
214RANGES_DIAGNOSTIC_POP
216
217#include <range/v3/detail/epilogue.hpp>
218
219#endif // RANGES_V3_ITERATOR_INSERT_ITERATORS_HPP
The container_ concept std::vector is a container, std::array is not.
Definition insert_iterators.hpp:32
Definition insert_iterators.hpp:68
Definition insert_iterators.hpp:81
Definition insert_iterators.hpp:117
Definition insert_iterators.hpp:130
Definition insert_iterators.hpp:168