16 #include <type_traits> 41 template <
typename range_type,
template <
typename...>
typename derived_t_template>
42 class random_access_iterator_base
50 position_type pos{
static_cast<position_type
>(0)};
53 template <
typename range_type2,
template <
typename...>
typename derived_t_template2>
55 requires std::is_const_v<range_type> && !std::is_const_v<range_type2> &&
56 std::is_same_v<std::remove_const_t<range_type>, range_type2> &&
57 std::is_same_v<derived_t_template2, derived_t_template>
59 friend class random_access_iterator_base;
62 using derived_t = derived_t_template<range_type>;
66 using difference_type =
typename range_type::difference_type;
68 using value_type =
typename range_type::value_type;
71 typename range_type::const_reference,
72 typename range_type::reference>;
74 using const_reference =
typename range_type::const_reference;
76 using pointer = value_type *;
83 constexpr random_access_iterator_base() =
default;
86 constexpr random_access_iterator_base(random_access_iterator_base
const &) =
default;
88 constexpr random_access_iterator_base &
operator=(random_access_iterator_base
const &) =
default;
90 constexpr random_access_iterator_base (random_access_iterator_base &&) =
default;
92 constexpr random_access_iterator_base &
operator=(random_access_iterator_base &&) =
default;
94 ~random_access_iterator_base() =
default;
97 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host} {}
99 constexpr random_access_iterator_base(range_type & host, position_type
const pos) noexcept :
100 host{&host}, pos{pos}
104 template <
typename range_type2>
106 requires std::is_const_v<range_type> && !std::is_const_v<range_type2> &&
107 std::is_same_v<std::remove_const_t<range_type>, range_type2>
109 constexpr random_access_iterator_base(random_access_iterator_base<range_type2, derived_t_template>
const & rhs) noexcept :
110 host{rhs.host}, pos{rhs.pos}
120 template <
typename range_type2>
125 constexpr
bool operator==(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
127 return pos == rhs.pos;
131 template <
typename range_type2>
135 constexpr
bool operator!=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
137 return !(*
this == rhs);
141 template <
typename range_type2>
145 constexpr
bool operator<(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
147 return static_cast<bool>(pos < rhs.pos);
151 template <
typename range_type2>
155 constexpr
bool operator>(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
157 return pos > rhs.pos;
161 template <
typename range_type2>
165 constexpr
bool operator<=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
167 return pos <= rhs.pos;
171 template <
typename range_type2>
175 constexpr
bool operator>=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
177 return pos >= rhs.pos;
185 constexpr derived_t & operator++() noexcept
189 return *this_derived();
193 constexpr derived_t operator++(
int) noexcept
195 derived_t cpy{*this_derived()};
201 constexpr derived_t & operator--() noexcept
204 return *this_derived();
208 constexpr derived_t operator--(
int) noexcept
210 derived_t cpy{*this_derived()};
216 constexpr derived_t & operator+=(difference_type
const skip) noexcept
219 return *this_derived();
223 constexpr derived_t operator+(difference_type
const skip)
const noexcept
225 derived_t cpy{*this_derived()};
230 constexpr
friend derived_t operator+(difference_type
const skip, derived_t
const & it) noexcept
236 constexpr derived_t & operator-=(difference_type
const skip) noexcept
239 return *this_derived();
243 constexpr derived_t operator-(difference_type
const skip)
const noexcept
245 derived_t cpy{*this_derived()};
250 constexpr
friend derived_t operator-(difference_type
const skip, derived_t
const & it) noexcept
256 constexpr difference_type operator-(derived_t
const lhs)
const noexcept
258 return static_cast<difference_type
>(pos - lhs.pos);
266 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
273 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
279 constexpr reference operator[](position_type
const n)
const noexcept(noexcept((*host)[pos+n]))
281 return (*host)[pos + n];
288 constexpr derived_t* this_derived()
290 return static_cast<derived_t*
>(
this);
294 constexpr derived_t
const * this_derived()
const 296 return static_cast<derived_t
const *
>(
this);
308 template <
typename range_type>
309 class random_access_iterator :
310 public random_access_iterator_base<range_type, random_access_iterator>
314 using base = random_access_iterator_base<range_type, random_access_iterator>;
316 using typename base::position_type;
323 using typename base::difference_type;
324 using typename base::value_type;
325 using typename base::reference;
326 using typename base::const_reference;
327 using typename base::pointer;
328 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:35