45 #include <range/v3/utility/iterator_traits.hpp> 46 #include <range/v3/range_traits.hpp> 71 template <
typename range_type,
template <
typename...>
typename derived_t_template>
72 class random_access_iterator_base
76 typename std::add_pointer_t<range_type> host{
nullptr};
78 using position_type =
typename range_type::size_type;
80 position_type pos{
static_cast<position_type
>(0)};
83 template <
typename range_type2,
template <
typename...>
typename derived_t_template2>
85 requires std::is_const_v<range_type> && !std::is_const_v<range_type2> &&
86 std::is_same_v<std::remove_const_t<range_type>, range_type2> &&
87 std::is_same_v<derived_t_template2, derived_t_template>
89 friend class random_access_iterator_base;
92 using derived_t = derived_t_template<range_type>;
96 using difference_type =
typename range_type::difference_type;
98 using value_type =
typename range_type::value_type;
100 using reference = std::conditional_t<std::is_const_v<range_type>,
101 typename range_type::const_reference,
102 typename range_type::reference>;
104 using const_reference =
typename range_type::const_reference;
106 using pointer = value_type *;
108 using iterator_category = std::random_access_iterator_tag;
113 constexpr random_access_iterator_base() =
default;
116 constexpr random_access_iterator_base(random_access_iterator_base
const &) =
default;
118 constexpr random_access_iterator_base &
operator=(random_access_iterator_base
const &) =
default;
120 constexpr random_access_iterator_base (random_access_iterator_base &&) =
default;
122 constexpr random_access_iterator_base &
operator=(random_access_iterator_base &&) =
default;
124 ~random_access_iterator_base() =
default;
127 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host} {}
129 constexpr random_access_iterator_base(range_type & host, position_type
const pos) noexcept :
130 host{&host}, pos{pos}
134 template <
typename range_type2>
136 requires std::is_const_v<range_type> && !std::is_const_v<range_type2> &&
137 std::is_same_v<std::remove_const_t<range_type>, range_type2>
139 constexpr random_access_iterator_base(random_access_iterator_base<range_type2, derived_t_template>
const & rhs) noexcept :
140 host{rhs.host}, pos{rhs.pos}
149 template <
typename range_type2>
151 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
153 constexpr
bool operator==(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
155 return pos == rhs.pos;
158 template <
typename range_type2>
160 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
162 constexpr
bool operator!=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
164 return pos != rhs.pos;
167 template <
typename range_type2>
169 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
171 constexpr
bool operator<(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
173 return static_cast<bool>(pos < rhs.pos);
176 template <
typename range_type2>
178 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
180 constexpr
bool operator>(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
182 return pos > rhs.pos;
185 template <
typename range_type2>
187 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
189 constexpr
bool operator<=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
191 return pos <= rhs.pos;
194 template <
typename range_type2>
196 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
198 constexpr
bool operator>=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
200 return pos >= rhs.pos;
208 constexpr derived_t & operator++() noexcept
212 return *this_derived();
216 constexpr derived_t operator++(
int) noexcept
218 derived_t cpy{*this_derived()};
224 constexpr derived_t & operator--() noexcept
227 return *this_derived();
231 constexpr derived_t operator--(
int) noexcept
233 derived_t cpy{*this_derived()};
239 constexpr derived_t & operator+=(difference_type
const skip) noexcept
242 return *this_derived();
246 constexpr derived_t operator+(difference_type
const skip)
const noexcept
248 derived_t cpy{*this_derived()};
253 constexpr
friend derived_t operator+(difference_type
const skip, derived_t
const & it) noexcept
259 constexpr derived_t & operator-=(difference_type
const skip) noexcept
262 return *this_derived();
266 constexpr derived_t operator-(difference_type
const skip)
const noexcept
268 derived_t cpy{*this_derived()};
273 constexpr
friend derived_t operator-(difference_type
const skip, derived_t
const & it) noexcept
279 constexpr difference_type operator-(derived_t
const lhs)
const noexcept
281 return static_cast<difference_type
>(pos - lhs.pos);
289 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
296 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
302 constexpr reference operator[](position_type
const n)
const noexcept(noexcept((*host)[pos+n]))
304 return (*host)[pos + n];
311 derived_t* this_derived()
313 return static_cast<derived_t*
>(
this);
317 derived_t
const * this_derived()
const 319 return static_cast<derived_t
const *
>(
this);
331 template <
typename range_type>
332 class random_access_iterator :
333 public random_access_iterator_base<range_type, random_access_iterator>
337 using base = random_access_iterator_base<range_type, random_access_iterator>;
339 using typename base::position_type;
346 using typename base::difference_type;
347 using typename base::value_type;
348 using typename base::reference;
349 using typename base::const_reference;
350 using typename base::pointer;
351 using typename base::iterator_category;
bool operator>(type const &lhs, type const &rhs)
Less-than, greater-than and -or-equal comparisons.
Provides C++20 additions to the <iterator> header.
bool operator!=(type const &lhs, type const &rhs)
(In-)Equality comparison.
t & operator=(t1 const &rhs)
Assignment operator.
bool operator==(type const &lhs, type const &rhs)
(In-)Equality comparison.
bool operator>=(type const &lhs, type const &rhs)
Less-than, greater-than and -or-equal comparisons.
Definition: aligned_sequence_concept.hpp:288
Provides C++20 additions to the type_traits header.