SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
random_access_iterator.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <cassert>
13#include <iterator>
14#include <type_traits>
15
17
18namespace seqan3::detail
19{
20
37template <typename range_type, template <typename...> typename derived_t_template, typename... args_t>
39{
40protected:
47
49 template <typename range_type2, template <typename...> typename derived_t_template2, typename... args2_t>
51
53 using derived_t = derived_t_template<range_type>;
54
55public:
57 using difference_type = typename range_type::difference_type; // TODO should be range_ but is broken in ranges
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; //TODO: there is no type trait for this, yet :o
70
75 constexpr random_access_iterator_base() = default;
86
88 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
89 {}
91 constexpr random_access_iterator_base(range_type & host, position_type const pos) noexcept : host{&host}, pos{pos}
92 {}
93
95 template <typename range_type2>
96 requires std::is_const_v<range_type>
97 && (!std::is_const_v<range_type2>) && std::is_same_v<std::remove_const_t<range_type>, range_type2>
100 host{rhs.host},
101 pos{rhs.pos}
102 {}
104
112 template <typename range_type2>
113 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
115 {
116 return pos == rhs.pos;
117 }
118
120 template <typename range_type2>
121 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
123 {
124 return !(*this == rhs);
125 }
126
128 template <typename range_type2>
129 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
131 {
132 return static_cast<bool>(pos < rhs.pos);
133 }
134
136 template <typename range_type2>
137 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
139 {
140 return pos > rhs.pos;
141 }
142
144 template <typename range_type2>
145 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
147 {
148 return pos <= rhs.pos;
149 }
150
152 template <typename range_type2>
153 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
155 {
156 return pos >= rhs.pos;
157 }
159
165 constexpr derived_t & operator++() noexcept
166 {
167 ++pos;
168 return *this_derived();
169 }
170
172 constexpr derived_t operator++(int) noexcept
173 {
174 derived_t cpy{*this_derived()};
175 ++pos;
176 return cpy;
177 }
178
180 constexpr derived_t & operator--() noexcept
181 {
182 --pos;
183 return *this_derived();
184 }
185
187 constexpr derived_t operator--(int) noexcept
188 {
189 derived_t cpy{*this_derived()};
190 --pos;
191 return cpy;
192 }
193
195 constexpr derived_t & operator+=(difference_type const skip) noexcept
196 {
197 pos += skip;
198 return *this_derived();
199 }
200
202 constexpr derived_t operator+(difference_type const skip) const noexcept
203 {
204 derived_t cpy{*this_derived()};
205 return cpy += skip;
206 }
207
209 constexpr friend derived_t operator+(difference_type const skip, derived_t const & it) noexcept
210 {
211 return it + skip;
212 }
213
215 constexpr derived_t & operator-=(difference_type const skip) noexcept
216 {
217 pos -= skip;
218 return *this_derived();
219 }
220
222 constexpr derived_t operator-(difference_type const skip) const noexcept
223 {
224 derived_t cpy{*this_derived()};
225 return cpy -= skip;
226 }
227
229 constexpr friend derived_t operator-(difference_type const skip, derived_t const & it) noexcept
230 {
231 return it - skip;
232 }
233
235 constexpr friend difference_type operator-(derived_t const & lhs, derived_t const & rhs) noexcept
236 {
237 return static_cast<difference_type>(lhs.pos - rhs.pos);
238 }
240
246 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
247 {
248 return (*host)[pos];
249 }
250
252 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
253 {
254 return &host[pos];
255 }
256
258 constexpr reference operator[](position_type const n) const noexcept(noexcept((*host)[pos + n]))
259 {
260 return (*host)[pos + n];
261 }
263
264private:
267 {
268 return static_cast<derived_t *>(this);
269 }
270
272 constexpr derived_t const * this_derived() const
273 {
274 return static_cast<derived_t const *>(this);
275 }
276};
277
286template <typename range_type>
287class random_access_iterator : public random_access_iterator_base<range_type, random_access_iterator>
288{
289private:
293 using typename base::position_type;
294
295public:
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;
307
309 using base::base;
310};
311
312} // namespace seqan3::detail
A CRTP base template for creating random access iterators.
Definition random_access_iterator.hpp:39
constexpr bool operator==(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is equal to rhs.
Definition random_access_iterator.hpp:114
constexpr random_access_iterator_base(random_access_iterator_base< range_type2, derived_t_template > const &rhs) noexcept
Constructor for const version from non-const version.
Definition random_access_iterator.hpp:98
constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
Return pointer to this iterator.
Definition random_access_iterator.hpp:252
constexpr friend difference_type operator-(derived_t const &lhs, derived_t const &rhs) noexcept
Return offset between this and remote iterator's position.
Definition random_access_iterator.hpp:235
constexpr bool operator<(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is less than rhs.
Definition random_access_iterator.hpp:130
constexpr bool operator>=(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is greater than or equal to rhs.
Definition random_access_iterator.hpp:154
constexpr derived_t const * this_derived() const
Cast this to derived type.
Definition random_access_iterator.hpp:272
constexpr bool operator<=(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is less than or equal to rhs.
Definition random_access_iterator.hpp:146
constexpr derived_t & operator-=(difference_type const skip) noexcept
Decrement iterator by skip.
Definition random_access_iterator.hpp:215
constexpr random_access_iterator_base(range_type &host) noexcept
Construct by host, default position pointer with 0.
Definition random_access_iterator.hpp:88
constexpr random_access_iterator_base(range_type &host, position_type const pos) noexcept
Construct by host and explicit position.
Definition random_access_iterator.hpp:91
std::conditional_t< std::is_const_v< range_type >, typename range_type::const_reference, typename range_type::reference > reference
Use reference type defined by container.
Definition random_access_iterator.hpp:63
typename range_type::const_reference const_reference
Use const reference type provided by container.
Definition random_access_iterator.hpp:65
constexpr bool operator>(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is greater than rhs.
Definition random_access_iterator.hpp:138
std::make_unsigned_t< typename range_type::difference_type > position_type
Use container's size_type as a position.
Definition random_access_iterator.hpp:44
constexpr derived_t operator++(int) noexcept
Post-increment, return previous iterator state.
Definition random_access_iterator.hpp:172
constexpr reference operator[](position_type const n) const noexcept(noexcept((*host)[pos+n]))
Return underlying container value currently pointed at.
Definition random_access_iterator.hpp:258
constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
Dereference operator returns element currently pointed at.
Definition random_access_iterator.hpp:246
std::add_pointer_t< range_type > host
Iterator stores pointer to underlying container structure.
Definition random_access_iterator.hpp:42
constexpr friend derived_t operator+(difference_type const skip, derived_t const &it) noexcept
Non-member operator+ delegates to non-friend operator+.
Definition random_access_iterator.hpp:209
constexpr random_access_iterator_base(random_access_iterator_base &&)=default
Move constructor.
constexpr derived_t operator-(difference_type const skip) const noexcept
Return decremented copy of this iterator.
Definition random_access_iterator.hpp:222
constexpr random_access_iterator_base(random_access_iterator_base const &)=default
Copy constructor.
constexpr random_access_iterator_base & operator=(random_access_iterator_base &&)=default
Move assignment.
value_type * pointer
Pointer type is pointer of container element type.
Definition random_access_iterator.hpp:67
constexpr derived_t operator+(difference_type const skip) const noexcept
Forward copy of this iterator.
Definition random_access_iterator.hpp:202
constexpr derived_t operator--(int) noexcept
Post-decrement, return previous iterator state.
Definition random_access_iterator.hpp:187
constexpr random_access_iterator_base & operator=(random_access_iterator_base const &)=default
Copy construction via assignment.
std::random_access_iterator_tag iterator_category
Tag this class as a random access iterator.
Definition random_access_iterator.hpp:69
constexpr derived_t & operator--() noexcept
Pre-decrement, return updated iterator.
Definition random_access_iterator.hpp:180
typename range_type::value_type value_type
Value type of container elements.
Definition random_access_iterator.hpp:59
constexpr bool operator!=(random_access_iterator_base< range_type2, derived_t_template > const &rhs) const noexcept
Checks whether *this is not equal to rhs.
Definition random_access_iterator.hpp:122
constexpr derived_t & operator++() noexcept
Pre-increment, return updated iterator.
Definition random_access_iterator.hpp:165
constexpr friend derived_t operator-(difference_type const skip, derived_t const &it) noexcept
Non-member operator- delegates to non-friend operator-.
Definition random_access_iterator.hpp:229
position_type pos
Store position index for container.
Definition random_access_iterator.hpp:46
typename range_type::difference_type difference_type
Type for distances between iterators.
Definition random_access_iterator.hpp:57
constexpr derived_t * this_derived()
Cast this to derived type.
Definition random_access_iterator.hpp:266
constexpr random_access_iterator_base()=default
Default constructor.
constexpr derived_t & operator+=(difference_type const skip) noexcept
Forward this iterator.
Definition random_access_iterator.hpp:195
~random_access_iterator_base()=default
Use default deconstructor.
derived_t_template< range_type > derived_t
Because this is CRTP, we know the full derived type:
Definition random_access_iterator.hpp:53
A generic random access iterator that delegates most operations to the range.
Definition random_access_iterator.hpp:288
T is_same_v
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides platform and dependency checks.
Hide me