SeqAn3 3.3.0-rc.1
The Modern C++ library for sequence analysis.
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>
53 requires std::is_const_v<range_type>
54 && (!std::is_const_v<range_type2>) && std::is_same_v<std::remove_const_t<range_type>, range_type2>
55 && std::is_same_v<derived_t_template2<args2_t...>, derived_t_template<args_t...>>
57
59 using derived_t = derived_t_template<range_type>;
60
61public:
63 using difference_type = typename range_type::difference_type; // TODO should be range_ but is broken in ranges
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; //TODO: there is no type trait for this, yet :o
76
81 constexpr random_access_iterator_base() = default;
92
94 explicit constexpr random_access_iterator_base(range_type & host) noexcept : host{&host}
95 {}
97 constexpr random_access_iterator_base(range_type & host, position_type const pos) noexcept : host{&host}, pos{pos}
98 {}
99
101 template <typename range_type2>
102 requires std::is_const_v<range_type>
103 && (!std::is_const_v<range_type2>) && std::is_same_v<std::remove_const_t<range_type>, range_type2>
106 host{rhs.host},
107 pos{rhs.pos}
108 {}
110
118 template <typename range_type2>
119 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
121 {
122 return pos == rhs.pos;
123 }
124
126 template <typename range_type2>
127 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
129 {
130 return !(*this == rhs);
131 }
132
134 template <typename range_type2>
135 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
137 {
138 return static_cast<bool>(pos < rhs.pos);
139 }
140
142 template <typename range_type2>
143 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
145 {
146 return pos > rhs.pos;
147 }
148
150 template <typename range_type2>
151 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
153 {
154 return pos <= rhs.pos;
155 }
156
158 template <typename range_type2>
159 requires std::is_same_v<std::remove_const_t<range_type>, std::remove_const_t<range_type2>>
161 {
162 return pos >= rhs.pos;
163 }
165
171 constexpr derived_t & operator++() noexcept
172 {
173 ++pos;
174 return *this_derived();
175 }
176
178 constexpr derived_t operator++(int) noexcept
179 {
180 derived_t cpy{*this_derived()};
181 ++pos;
182 return cpy;
183 }
184
186 constexpr derived_t & operator--() noexcept
187 {
188 --pos;
189 return *this_derived();
190 }
191
193 constexpr derived_t operator--(int) noexcept
194 {
195 derived_t cpy{*this_derived()};
196 --pos;
197 return cpy;
198 }
199
201 constexpr derived_t & operator+=(difference_type const skip) noexcept
202 {
203 pos += skip;
204 return *this_derived();
205 }
206
208 constexpr derived_t operator+(difference_type const skip) const noexcept
209 {
210 derived_t cpy{*this_derived()};
211 return cpy += skip;
212 }
213
215 constexpr friend derived_t operator+(difference_type const skip, derived_t const & it) noexcept
216 {
217 return it + skip;
218 }
219
221 constexpr derived_t & operator-=(difference_type const skip) noexcept
222 {
223 pos -= skip;
224 return *this_derived();
225 }
226
228 constexpr derived_t operator-(difference_type const skip) const noexcept
229 {
230 derived_t cpy{*this_derived()};
231 return cpy -= skip;
232 }
233
235 constexpr friend derived_t operator-(difference_type const skip, derived_t const & it) noexcept
236 {
237 return it - skip;
238 }
239
241 constexpr friend difference_type operator-(derived_t const & lhs, derived_t const & rhs) noexcept
242 {
243 return static_cast<difference_type>(lhs.pos - rhs.pos);
244 }
246
252 constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
253 {
254 return (*host)[pos];
255 }
256
258 constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
259 {
260 return &host[pos];
261 }
262
264 constexpr reference operator[](position_type const n) const noexcept(noexcept((*host)[pos + n]))
265 {
266 return (*host)[pos + n];
267 }
269
270private:
273 {
274 return static_cast<derived_t *>(this);
275 }
276
278 constexpr derived_t const * this_derived() const
279 {
280 return static_cast<derived_t const *>(this);
281 }
282};
283
292template <typename range_type>
293class random_access_iterator : public random_access_iterator_base<range_type, random_access_iterator>
294{
295private:
299 using typename base::position_type;
300
301public:
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;
313
315 using base::base;
316};
317
318} // 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:120
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:104
constexpr pointer operator->() const noexcept(noexcept((&host)[pos]))
Return pointer to this iterator.
Definition: random_access_iterator.hpp:258
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:241
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:136
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:160
constexpr derived_t const * this_derived() const
Cast this to derived type.
Definition: random_access_iterator.hpp:278
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:152
constexpr derived_t & operator-=(difference_type const skip) noexcept
Decrement iterator by skip.
Definition: random_access_iterator.hpp:221
constexpr random_access_iterator_base(range_type &host) noexcept
Construct by host, default position pointer with 0.
Definition: random_access_iterator.hpp:94
constexpr random_access_iterator_base(range_type &host, position_type const pos) noexcept
Construct by host and explicit position.
Definition: random_access_iterator.hpp:97
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:69
typename range_type::const_reference const_reference
Use const reference type provided by container.
Definition: random_access_iterator.hpp:71
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:144
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:178
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:264
constexpr reference operator*() const noexcept(noexcept((*host)[pos]))
Dereference operator returns element currently pointed at.
Definition: random_access_iterator.hpp:252
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:215
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:228
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:73
constexpr derived_t operator+(difference_type const skip) const noexcept
Forward copy of this iterator.
Definition: random_access_iterator.hpp:208
constexpr derived_t operator--(int) noexcept
Post-decrement, return previous iterator state.
Definition: random_access_iterator.hpp:193
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:75
constexpr derived_t & operator--() noexcept
Pre-decrement, return updated iterator.
Definition: random_access_iterator.hpp:186
typename range_type::value_type value_type
Value type of container elements.
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 not equal to rhs.
Definition: random_access_iterator.hpp:128
constexpr derived_t & operator++() noexcept
Pre-increment, return updated iterator.
Definition: random_access_iterator.hpp:171
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:235
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:63
constexpr derived_t * this_derived()
Cast this to derived type.
Definition: random_access_iterator.hpp:272
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:201
~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:59
A generic random access iterator that delegates most operations to the range.
Definition: random_access_iterator.hpp:294
T is_same_v
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.