13#ifndef RANGES_V3_ITERATOR_REVERSE_ITERATOR_HPP
14#define RANGES_V3_ITERATOR_REVERSE_ITERATOR_HPP
23#include <range/v3/detail/prologue.hpp>
37 CPP_assert(bidirectional_iterator<I>);
40 using value_type = iter_value_t<I>;
42 template<
typename OtherI>
43 friend struct reverse_cursor;
44 struct mixin : basic_mixin<reverse_cursor>
48 using basic_mixin<reverse_cursor>::basic_mixin;
50 constexpr explicit mixin(reverse_cursor && cur)
51 : basic_mixin<reverse_cursor>(static_cast<reverse_cursor &&>(cur))
53 constexpr explicit mixin(reverse_cursor
const & cur)
54 : basic_mixin<reverse_cursor>(cur)
58 : mixin{reverse_cursor{it}}
60 constexpr I base()
const
62 return this->get().base();
68 constexpr reverse_cursor(I it)
71 constexpr iter_reference_t<I> read()
const
75 constexpr I arrow()
const
81 constexpr I base()
const
86 requires sentinel_for<J, I>)
87 constexpr bool equal(reverse_cursor<J>
const & that)
const
89 return it_ == that.it_;
100 constexpr auto advance(iter_difference_t<I> n)
102 requires random_access_iterator<I>)
106 template(
typename J)(
107 requires sized_sentinel_for<J, I>)
108 constexpr iter_difference_t<I> distance_to(reverse_cursor<J>
const & that)
111 return it_ - that.base();
113 constexpr iter_rvalue_reference_t<I> move() const
114 noexcept(noexcept((
void)I(I(it_)), (
void)--const_cast<I &>(it_),
119 return iter_move(tmp);
123 reverse_cursor() =
default;
124 template(
typename U)(
125 requires convertible_to<U, I>)
126 constexpr reverse_cursor(reverse_cursor<U>
const & u)
135 template(
typename I)(
147 using ranges::make_reverse_iterator;
153#include <range/v3/detail/epilogue.hpp>
The bidirectional_iterator concept.
Definition basic_iterator.hpp:532
Definition reverse_iterator.hpp:134