SeqAn3 3.3.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// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <cassert>
16#include <iterator>
17#include <type_traits>
18
20
21namespace seqan3::detail
22{
23
40template <typename range_type, template <typename...> typename derived_t_template, typename... args_t>
42{
43protected:
50
52 template <typename range_type2, template <typename...> typename derived_t_template2, typename... args2_t>
54
56 using derived_t = derived_t_template<range_type>;
57
58public:
60 using difference_type = typename range_type::difference_type; // TODO should be range_ but is broken in ranges
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; //TODO: there is no type trait for this, yet :o
73
78 constexpr random_access_iterator_base() = default;
89
91 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
92 {}
94 constexpr random_access_iterator_base(range_type & host, position_type const pos) noexcept : host{&host}, pos{pos}
95 {}
96
98 template <typename range_type2>
99 requires std::is_const_v<range_type>
100 && (!std::is_const_v<range_type2>) && std::is_same_v<std::remove_const_t<range_type>, range_type2>
103 host{rhs.host},
104 pos{rhs.pos}
105 {}
107
115 template <typename range_type2>
116 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
118 {
119 return pos == rhs.pos;
120 }
121
123 template <typename range_type2>
124 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
126 {
127 return !(*this == rhs);
128 }
129
131 template <typename range_type2>
132 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
134 {
135 return static_cast<bool>(pos < rhs.pos);
136 }
137
139 template <typename range_type2>
140 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
142 {
143 return pos > rhs.pos;
144 }
145
147 template <typename range_type2>
148 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
150 {
151 return pos <= rhs.pos;
152 }
153
155 template <typename range_type2>
156 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
158 {
159 return pos >= rhs.pos;
160 }
162
168 constexpr derived_t & operator++() noexcept
169 {
170 ++pos;
171 return *this_derived();
172 }
173
175 constexpr derived_t operator++(int) noexcept
176 {
177 derived_t cpy{*this_derived()};
178 ++pos;
179 return cpy;
180 }
181
183 constexpr derived_t & operator--() noexcept
184 {
185 --pos;
186 return *this_derived();
187 }
188
190 constexpr derived_t operator--(int) noexcept
191 {
192 derived_t cpy{*this_derived()};
193 --pos;
194 return cpy;
195 }
196
198 constexpr derived_t & operator+=(difference_type const skip) noexcept
199 {
200 pos += skip;
201 return *this_derived();
202 }
203
205 constexpr derived_t operator+(difference_type const skip) const noexcept
206 {
207 derived_t cpy{*this_derived()};
208 return cpy += skip;
209 }
210
212 constexpr friend derived_t operator+(difference_type const skip, derived_t const & it) noexcept
213 {
214 return it + skip;
215 }
216
218 constexpr derived_t & operator-=(difference_type const skip) noexcept
219 {
220 pos -= skip;
221 return *this_derived();
222 }
223
225 constexpr derived_t operator-(difference_type const skip) const noexcept
226 {
227 derived_t cpy{*this_derived()};
228 return cpy -= skip;
229 }
230
232 constexpr friend derived_t operator-(difference_type const skip, derived_t const & it) noexcept
233 {
234 return it - skip;
235 }
236
238 constexpr friend difference_type operator-(derived_t const & lhs, derived_t const & rhs) noexcept
239 {
240 return static_cast<difference_type>(lhs.pos - rhs.pos);
241 }
243
249 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
250 {
251 return (*host)[pos];
252 }
253
255 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
256 {
257 return &host[pos];
258 }
259
261 constexpr reference operator[](position_type const n) const noexcept(noexcept((*host)[pos + n]))
262 {
263 return (*host)[pos + n];
264 }
266
267private:
270 {
271 return static_cast<derived_t *>(this);
272 }
273
275 constexpr derived_t const * this_derived() const
276 {
277 return static_cast<derived_t const *>(this);
278 }
279};
280
289template <typename range_type>
290class random_access_iterator : public random_access_iterator_base<range_type, random_access_iterator>
291{
292private:
296 using typename base::position_type;
297
298public:
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;
310
312 using base::base;
313};
314
315} // namespace seqan3::detail
A CRTP base template for creating random access iterators.
Definition: random_access_iterator.hpp:42
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:117
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:101
constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
Return pointer to this iterator.
Definition: random_access_iterator.hpp:255
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:238
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:133
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:157
constexpr derived_t const * this_derived() const
Cast this to derived type.
Definition: random_access_iterator.hpp:275
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:149
constexpr derived_t & operator-=(difference_type const skip) noexcept
Decrement iterator by skip.
Definition: random_access_iterator.hpp:218
constexpr random_access_iterator_base(range_type &host) noexcept
Construct by host, default position pointer with 0.
Definition: random_access_iterator.hpp:91
constexpr random_access_iterator_base(range_type &host, position_type const pos) noexcept
Construct by host and explicit position.
Definition: random_access_iterator.hpp:94
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:66
typename range_type::const_reference const_reference
Use const reference type provided by container.
Definition: random_access_iterator.hpp:68
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:141
std::make_unsigned_t< typename range_type::difference_type > position_type
Use container's size_type as a position.
Definition: random_access_iterator.hpp:47
constexpr derived_t operator++(int) noexcept
Post-increment, return previous iterator state.
Definition: random_access_iterator.hpp:175
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:261
constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
Dereference operator returns element currently pointed at.
Definition: random_access_iterator.hpp:249
std::add_pointer_t< range_type > host
Iterator stores pointer to underlying container structure.
Definition: random_access_iterator.hpp:45
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:212
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:225
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:70
constexpr derived_t operator+(difference_type const skip) const noexcept
Forward copy of this iterator.
Definition: random_access_iterator.hpp:205
constexpr derived_t operator--(int) noexcept
Post-decrement, return previous iterator state.
Definition: random_access_iterator.hpp:190
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:72
constexpr derived_t & operator--() noexcept
Pre-decrement, return updated iterator.
Definition: random_access_iterator.hpp:183
typename range_type::value_type value_type
Value type of container elements.
Definition: random_access_iterator.hpp:62
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:125
constexpr derived_t & operator++() noexcept
Pre-increment, return updated iterator.
Definition: random_access_iterator.hpp:168
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:232
position_type pos
Store position index for container.
Definition: random_access_iterator.hpp:49
typename range_type::difference_type difference_type
Type for distances between iterators.
Definition: random_access_iterator.hpp:60
constexpr derived_t * this_derived()
Cast this to derived type.
Definition: random_access_iterator.hpp:269
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:198
~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:56
A generic random access iterator that delegates most operations to the range.
Definition: random_access_iterator.hpp:291
T is_same_v
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.