13#ifndef RANGES_V3_ITERATOR_MOVE_ITERATORS_HPP
14#define RANGES_V3_ITERATOR_MOVE_ITERATORS_HPP
25#include <range/v3/detail/prologue.hpp>
39 using iterator_type = I;
40 using difference_type = iter_difference_t<I>;
41 using value_type = iter_value_t<I>;
42 using iterator_category = std::input_iterator_tag;
43 using reference = iter_rvalue_reference_t<I>;
45 constexpr move_iterator() =
default;
46 explicit move_iterator(I i)
50 requires convertible_to<O, I>)
51 move_iterator(move_iterator<O>
const & i)
55 requires convertible_to<O, I>)
56 move_iterator & operator=(move_iterator<O>
const & i)
66 auto CPP_auto_fun(
operator*)()(
const)
68 return iter_move(current_)
86 -> CPP_ret(move_iterator)(
89 return move_iterator(current_++);
93 -> CPP_ret(move_iterator &)(
101 -> CPP_ret(move_iterator)(
104 return move_iterator(current_--);
107 auto operator+(difference_type n)
const
108 -> CPP_ret(move_iterator)(
111 return move_iterator(current_ + n);
114 auto operator+=(difference_type n)
115 -> CPP_ret(move_iterator &)(
122 auto operator-(difference_type n)
const
123 -> CPP_ret(move_iterator)(
126 return move_iterator(current_ - n);
129 auto operator-=(difference_type n)
130 -> CPP_ret(move_iterator &)(
137 auto operator[](difference_type n)
const
138 -> CPP_ret(reference)(
141 return iter_move(current_ + n);
144 template<
typename I2>
145 friend auto operator==(move_iterator
const & x, move_iterator<I2>
const & y)
146 -> CPP_broken_friend_ret(
bool)(
147 requires equality_comparable_with<I, I2>)
149 return x.base() == y.base();
151 template<
typename I2>
152 friend auto operator!=(move_iterator
const & x, move_iterator<I2>
const & y)
153 -> CPP_broken_friend_ret(
bool)(
154 requires equality_comparable_with<I, I2>)
158 template<
typename I2>
159 friend auto operator<(move_iterator
const & x, move_iterator<I2>
const & y)
160 -> CPP_broken_friend_ret(
bool)(
161 requires totally_ordered_with<I, I2>)
163 return x.base() < y.base();
165 template<
typename I2>
166 friend auto operator<=(move_iterator
const & x, move_iterator<I2>
const & y)
167 -> CPP_broken_friend_ret(
bool)(
168 requires totally_ordered_with<I, I2>)
172 template<
typename I2>
173 friend auto operator>(move_iterator
const & x, move_iterator<I2>
const & y)
174 -> CPP_broken_friend_ret(
bool)(
175 requires totally_ordered_with<I, I2>)
179 template<
typename I2>
180 friend auto operator>=(move_iterator
const & x, move_iterator<I2>
const & y)
181 -> CPP_broken_friend_ret(
bool)(
182 requires totally_ordered_with<I, I2>)
187 template<
typename I2>
188 friend auto operator-(move_iterator
const & x, move_iterator<I2>
const & y)
189 -> CPP_broken_friend_ret(iter_difference_t<I2>)(
192 return x.base() - y.base();
195 friend auto operator+(iter_difference_t<I> n,
196 move_iterator
const & x)
197 -> CPP_broken_friend_ret(move_iterator)(
206 template(
typename I)(
223 constexpr move_sentinel()
226 constexpr explicit move_sentinel(S s)
227 : sent_(detail::move(s))
229 template(
typename OS)(
230 requires convertible_to<OS, S>)
231 constexpr explicit move_sentinel(move_sentinel<OS>
const & that)
234 template(
typename OS)(
235 requires convertible_to<OS, S>)
236 move_sentinel & operator=(move_sentinel<OS>
const & that)
248 -> CPP_broken_friend_ret(
bool)(
251 return i.base() == s.base();
255 -> CPP_broken_friend_ret(
bool)(
258 return s.base() == i.base();
262 -> CPP_broken_friend_ret(
bool)(
265 return i.base() != s.base();
269 -> CPP_broken_friend_ret(
bool)(
272 return s.base() != i.base();
278 template(
typename I)(
285 template(
typename S)(
298 template<
typename I,
bool IsReadable>
299 struct move_into_cursor_types_
303 struct move_into_cursor_types_<I, true>
305 using value_type = iter_value_t<I>;
306 using single_pass =
meta::bool_<(bool)single_pass_iterator_<I>>;
310 using move_into_cursor_types =
314 struct move_into_cursor : move_into_cursor_types<I>
324 constexpr explicit mixin(move_into_cursor && cur)
325 :
basic_mixin<move_into_cursor>(static_cast<move_into_cursor &&>(cur))
327 constexpr explicit mixin(move_into_cursor
const & cur)
332 : mixin{move_into_cursor{std::move(it)}}
336 return this->get().it_;
342 explicit move_into_cursor(I it)
349 template(
typename T)(
351 void write(T && t)
noexcept(
noexcept(*it_ = std::move(t)))
355 template(
typename T)(
357 void write(T && t)
const noexcept(
noexcept(*it_ = std::move(t)))
362 auto read() const noexcept(noexcept(*std::declval<I const &>()))
363 -> CPP_ret(iter_reference_t<I>)(
369 auto equal(move_into_cursor
const & that)
const
373 return it_ == that.it_;
383 auto advance(iter_difference_t<I> n)
390 auto distance_to(move_into_cursor
const & that)
const
391 -> CPP_ret(iter_difference_t<I>)(
394 return that.it_ - it_;
396 template(
typename II = I
const)(
398 constexpr iter_rvalue_reference_t<II> move() const
399 noexcept(has_nothrow_iter_move_v<II>)
401 return iter_move(it_);
405 constexpr move_into_cursor() =
default;
413 constexpr move_into_iterator<I> operator()(I it)
const
415 return move_into_iterator<I>{std::move(it)};
424 using ranges::make_move_iterator;
432RANGES_DIAGNOSTIC_PUSH
433RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
438 struct iterator_traits<::ranges::move_iterator<I>>
440 using iterator_category = std::input_iterator_tag;
441 using difference_type = typename ::ranges::move_iterator<I>::difference_type;
442 using value_type = typename ::ranges::move_iterator<I>::value_type;
443 using reference = typename ::ranges::move_iterator<I>::reference;
451#include <range/v3/detail/epilogue.hpp>
The bidirectional_iterator concept.
The forward_iterator concept.
The indirectly_readable concept.
The indirectly_writable concept.
The random_access_iterator concept.
The sentinel_for concept.
The sized_sentinel_for concept.
#define CPP_broken_friend_member
INTERNAL ONLY.
Definition concepts.hpp:447
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
meta::if_c< std::is_reference< R >::value, meta::_t< std::remove_reference< R > > &&, detail::decay_t< R > > move_t
Definition move.hpp:57
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition meta.hpp:168
typename T::type _t
Type alias for T::type.
Definition meta.hpp:141
Definition adjacent_find.hpp:67
Definition basic_iterator.hpp:47
Definition move_iterators.hpp:205
Definition move_iterators.hpp:277
Definition move_iterators.hpp:411
Definition move_iterators.hpp:33
Definition move_iterators.hpp:218