18namespace seqan3::detail
37template <
typename range_type,
template <
typename...>
typename derived_t_template,
typename... args_t>
38class random_access_iterator_base
46 position_type pos{
static_cast<position_type
>(0)};
49 template <
typename range_type2,
template <
typename...>
typename derived_t_template2,
typename... args2_t>
50 friend class random_access_iterator_base;
53 using derived_t = derived_t_template<range_type>;
57 using difference_type =
typename range_type::difference_type;
59 using value_type =
typename range_type::value_type;
62 typename range_type::const_reference,
63 typename range_type::reference>;
65 using const_reference =
typename range_type::const_reference;
67 using pointer = value_type *;
75 constexpr random_access_iterator_base() =
default;
77 constexpr random_access_iterator_base(random_access_iterator_base
const &) =
default;
79 constexpr random_access_iterator_base & operator=(random_access_iterator_base
const &) =
default;
81 constexpr random_access_iterator_base(random_access_iterator_base &&) =
default;
83 constexpr random_access_iterator_base & operator=(random_access_iterator_base &&) =
default;
85 ~random_access_iterator_base() =
default;
88 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
91 constexpr random_access_iterator_base(range_type & host, position_type
const pos) noexcept : host{&host}, pos{pos}
95 template <
typename range_type2>
96 requires std::is_const_v<range_type> && (!std::is_const_v<range_type2>)
98 constexpr random_access_iterator_base(
99 random_access_iterator_base<range_type2, derived_t_template>
const & rhs) noexcept :
112 template <
typename range_type2>
114 constexpr bool operator==(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
116 return pos == rhs.pos;
120 template <
typename range_type2>
122 constexpr bool operator!=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
124 return !(*
this == rhs);
128 template <
typename range_type2>
130 constexpr bool operator<(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
132 return static_cast<bool>(pos < rhs.pos);
136 template <
typename range_type2>
138 constexpr bool operator>(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
140 return pos > rhs.pos;
144 template <
typename range_type2>
146 constexpr bool operator<=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
148 return pos <= rhs.pos;
152 template <
typename range_type2>
154 constexpr bool operator>=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
156 return pos >= rhs.pos;
165 constexpr derived_t & operator++() noexcept
168 return *this_derived();
172 constexpr derived_t operator++(
int)
noexcept
174 derived_t cpy{*this_derived()};
180 constexpr derived_t & operator--() noexcept
183 return *this_derived();
187 constexpr derived_t operator--(
int)
noexcept
189 derived_t cpy{*this_derived()};
195 constexpr derived_t & operator+=(difference_type
const skip)
noexcept
198 return *this_derived();
202 constexpr derived_t operator+(difference_type
const skip)
const noexcept
204 derived_t cpy{*this_derived()};
209 constexpr friend derived_t operator+(difference_type
const skip, derived_t
const & it)
noexcept
215 constexpr derived_t & operator-=(difference_type
const skip)
noexcept
218 return *this_derived();
222 constexpr derived_t operator-(difference_type
const skip)
const noexcept
224 derived_t cpy{*this_derived()};
229 constexpr friend derived_t operator-(difference_type
const skip, derived_t
const & it)
noexcept
235 constexpr friend difference_type operator-(derived_t
const & lhs, derived_t
const & rhs)
noexcept
237 return static_cast<difference_type
>(lhs.pos - rhs.pos);
246 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
252 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
258 constexpr reference operator[](position_type
const n)
const noexcept(
noexcept((*host)[pos + n]))
260 return (*host)[pos + n];
266 constexpr derived_t * this_derived()
268 return static_cast<derived_t *
>(
this);
272 constexpr derived_t
const * this_derived()
const
274 return static_cast<derived_t
const *
>(
this);
286template <
typename range_type>
287class random_access_iterator :
public random_access_iterator_base<range_type, random_access_iterator>
291 using base = random_access_iterator_base<range_type, random_access_iterator>;
293 using typename base::position_type;
300 using typename base::const_reference;
301 using typename base::difference_type;
302 using typename base::iterator_category;
303 using typename base::pointer;
304 using typename base::reference;
305 using typename base::value_type;