21namespace seqan3::detail
40template <
typename range_type,
template <
typename...>
typename derived_t_template,
typename... args_t>
41class random_access_iterator_base
49 position_type pos{
static_cast<position_type
>(0)};
52 template <
typename range_type2,
template <
typename...>
typename derived_t_template2,
typename... args2_t>
53 friend class random_access_iterator_base;
56 using derived_t = derived_t_template<range_type>;
60 using difference_type =
typename range_type::difference_type;
62 using value_type =
typename range_type::value_type;
65 typename range_type::const_reference,
66 typename range_type::reference>;
68 using const_reference =
typename range_type::const_reference;
70 using pointer = value_type *;
78 constexpr random_access_iterator_base() =
default;
80 constexpr random_access_iterator_base(random_access_iterator_base
const &) =
default;
82 constexpr random_access_iterator_base & operator=(random_access_iterator_base
const &) =
default;
84 constexpr random_access_iterator_base(random_access_iterator_base &&) =
default;
86 constexpr random_access_iterator_base & operator=(random_access_iterator_base &&) =
default;
88 ~random_access_iterator_base() =
default;
91 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
94 constexpr random_access_iterator_base(range_type & host, position_type
const pos) noexcept : host{&host}, pos{pos}
98 template <
typename range_type2>
99 requires std::is_const_v<range_type>
101 constexpr random_access_iterator_base(
102 random_access_iterator_base<range_type2, derived_t_template>
const & rhs) noexcept :
115 template <
typename range_type2>
117 constexpr bool operator==(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
119 return pos == rhs.pos;
123 template <
typename range_type2>
125 constexpr bool operator!=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
127 return !(*
this == rhs);
131 template <
typename range_type2>
133 constexpr bool operator<(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
135 return static_cast<bool>(pos < rhs.pos);
139 template <
typename range_type2>
141 constexpr bool operator>(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
143 return pos > rhs.pos;
147 template <
typename range_type2>
149 constexpr bool operator<=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
151 return pos <= rhs.pos;
155 template <
typename range_type2>
157 constexpr bool operator>=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
159 return pos >= rhs.pos;
168 constexpr derived_t & operator++() noexcept
171 return *this_derived();
175 constexpr derived_t operator++(
int)
noexcept
177 derived_t cpy{*this_derived()};
183 constexpr derived_t & operator--() noexcept
186 return *this_derived();
190 constexpr derived_t operator--(
int)
noexcept
192 derived_t cpy{*this_derived()};
198 constexpr derived_t & operator+=(difference_type
const skip)
noexcept
201 return *this_derived();
205 constexpr derived_t operator+(difference_type
const skip)
const noexcept
207 derived_t cpy{*this_derived()};
212 constexpr friend derived_t operator+(difference_type
const skip, derived_t
const & it)
noexcept
218 constexpr derived_t & operator-=(difference_type
const skip)
noexcept
221 return *this_derived();
225 constexpr derived_t operator-(difference_type
const skip)
const noexcept
227 derived_t cpy{*this_derived()};
232 constexpr friend derived_t operator-(difference_type
const skip, derived_t
const & it)
noexcept
238 constexpr friend difference_type operator-(derived_t
const & lhs, derived_t
const & rhs)
noexcept
240 return static_cast<difference_type
>(lhs.pos - rhs.pos);
249 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
255 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
261 constexpr reference operator[](position_type
const n)
const noexcept(
noexcept((*host)[pos + n]))
263 return (*host)[pos + n];
269 constexpr derived_t * this_derived()
271 return static_cast<derived_t *
>(
this);
275 constexpr derived_t
const * this_derived()
const
277 return static_cast<derived_t
const *
>(
this);
289template <
typename range_type>
290class random_access_iterator :
public random_access_iterator_base<range_type, random_access_iterator>
294 using base = random_access_iterator_base<range_type, random_access_iterator>;
296 using typename base::position_type;
303 using typename base::const_reference;
304 using typename base::difference_type;
305 using typename base::iterator_category;
306 using typename base::pointer;
307 using typename base::reference;
308 using typename base::value_type;