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 requires std::is_const_v<range_type>
55 &&
std::is_same_v<derived_t_template2<args2_t...>, derived_t_template<args_t...>>
56 friend class random_access_iterator_base;
59 using derived_t = derived_t_template<range_type>;
63 using difference_type =
typename range_type::difference_type;
65 using value_type =
typename range_type::value_type;
68 typename range_type::const_reference,
69 typename range_type::reference>;
71 using const_reference =
typename range_type::const_reference;
73 using pointer = value_type *;
81 constexpr random_access_iterator_base() =
default;
83 constexpr random_access_iterator_base(random_access_iterator_base
const &) =
default;
85 constexpr random_access_iterator_base & operator=(random_access_iterator_base
const &) =
default;
87 constexpr random_access_iterator_base(random_access_iterator_base &&) =
default;
89 constexpr random_access_iterator_base & operator=(random_access_iterator_base &&) =
default;
91 ~random_access_iterator_base() =
default;
94 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
97 constexpr random_access_iterator_base(range_type & host, position_type
const pos) noexcept : host{&host}, pos{pos}
101 template <
typename range_type2>
102 requires std::is_const_v<range_type>
104 constexpr random_access_iterator_base(
105 random_access_iterator_base<range_type2, derived_t_template>
const & rhs) noexcept :
118 template <
typename range_type2>
120 constexpr bool operator==(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
122 return pos == rhs.pos;
126 template <
typename range_type2>
128 constexpr bool operator!=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
130 return !(*
this == rhs);
134 template <
typename range_type2>
136 constexpr bool operator<(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
138 return static_cast<bool>(pos < rhs.pos);
142 template <
typename range_type2>
144 constexpr bool operator>(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
146 return pos > rhs.pos;
150 template <
typename range_type2>
152 constexpr bool operator<=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
154 return pos <= rhs.pos;
158 template <
typename range_type2>
160 constexpr bool operator>=(random_access_iterator_base<range_type2, derived_t_template>
const & rhs)
const noexcept
162 return pos >= rhs.pos;
171 constexpr derived_t & operator++() noexcept
174 return *this_derived();
178 constexpr derived_t operator++(
int)
noexcept
180 derived_t cpy{*this_derived()};
186 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+=(difference_type
const skip)
noexcept
204 return *this_derived();
208 constexpr derived_t operator+(difference_type
const skip)
const noexcept
210 derived_t cpy{*this_derived()};
215 constexpr friend derived_t operator+(difference_type
const skip, derived_t
const & it)
noexcept
221 constexpr derived_t & operator-=(difference_type
const skip)
noexcept
224 return *this_derived();
228 constexpr derived_t operator-(difference_type
const skip)
const noexcept
230 derived_t cpy{*this_derived()};
235 constexpr friend derived_t operator-(difference_type
const skip, derived_t
const & it)
noexcept
241 constexpr friend difference_type operator-(derived_t
const & lhs, derived_t
const & rhs)
noexcept
243 return static_cast<difference_type
>(lhs.pos - rhs.pos);
252 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
258 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
264 constexpr reference operator[](position_type
const n)
const noexcept(
noexcept((*host)[pos + n]))
266 return (*host)[pos + n];
272 constexpr derived_t * this_derived()
274 return static_cast<derived_t *
>(
this);
278 constexpr derived_t
const * this_derived()
const
280 return static_cast<derived_t
const *
>(
this);
292template <
typename range_type>
293class random_access_iterator :
public random_access_iterator_base<range_type, random_access_iterator>
297 using base = random_access_iterator_base<range_type, random_access_iterator>;
299 using typename base::position_type;
306 using typename base::const_reference;
307 using typename base::difference_type;
308 using typename base::iterator_category;
309 using typename base::pointer;
310 using typename base::reference;
311 using typename base::value_type;