Horizon
insert_iterators.hpp
Go to the documentation of this file.
1 // 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 
19 #include <range/v3/range_fwd.hpp>
20 
22 #include <range/v3/utility/addressof.hpp>
23 
24 #include <range/v3/detail/prologue.hpp>
25 
26 namespace 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 
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 
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 
167  struct inserter_fn
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 
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 
193 RANGES_DIAGNOSTIC_PUSH
194 RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
195 
196 namespace 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 
214 RANGES_DIAGNOSTIC_POP
216 
217 #include <range/v3/detail/epilogue.hpp>
218 
219 #endif // RANGES_V3_ITERATOR_INSERT_ITERATORS_HPP
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
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