16 #include <type_traits> 51 template <
typename derived_t, std::Iterator base_t>
52 class inherited_iterator_base :
public std::conditional_t<std::is_pointer_v<base_t>, empty_type, base_t>
69 using iterator_category = iterator_tag_t<base_t>;
76 constexpr inherited_iterator_base()
77 noexcept(
std::is_nothrow_default_constructible_v<base_t>) = default;
78 constexpr inherited_iterator_base(inherited_iterator_base const & rhs)
79 noexcept(
std::is_nothrow_copy_constructible_v<base_t>) = default;
80 constexpr inherited_iterator_base(inherited_iterator_base && rhs)
81 noexcept(
std::is_nothrow_move_constructible_v<base_t>) = default;
82 constexpr inherited_iterator_base & operator=(inherited_iterator_base const & rhs)
83 noexcept(
std::is_nothrow_copy_assignable_v<base_t>) = default;
84 constexpr inherited_iterator_base & operator=(inherited_iterator_base && rhs)
85 noexcept(
std::is_nothrow_move_assignable_v<base_t>) = default;
86 ~inherited_iterator_base()
87 noexcept(
std::is_nothrow_destructible_v<base_t>) = default;
90 constexpr inherited_iterator_base(base_t it) noexcept(
std::is_nothrow_move_constructible_v<base_t>)
92 requires !
std::is_pointer_v<base_t>
94 : base_t{std::move(it)}
98 constexpr inherited_iterator_base(base_t it) noexcept
100 requires std::is_pointer_v<base_t>
102 : member{std::move(it)}
111 constexpr
bool operator==(derived_t
const & rhs)
const 113 noexcept(noexcept(std::declval<base_t &>() == std::declval<base_t &>()))
115 requires
std::EqualityComparable<base_t>
118 return *this_to_base() == *rhs.this_to_base();
122 constexpr
bool operator!=(derived_t
const & rhs)
const 123 noexcept(noexcept(std::declval<base_t &>() == std::declval<base_t &>()))
125 requires
std::EqualityComparable<base_t>
128 return !(*
this == rhs);
132 constexpr
bool operator<(derived_t
const & rhs)
const 133 noexcept(noexcept(std::declval<base_t &>() < std::declval<base_t &>()))
135 requires
std::StrictTotallyOrdered<base_t>
138 return *this_to_base() < *rhs.this_to_base();
142 constexpr
bool operator>(derived_t
const & rhs)
const 143 noexcept(noexcept(std::declval<base_t &>() > std::declval<base_t &>()))
145 requires
std::StrictTotallyOrdered<base_t>
148 return *this_to_base() > *rhs.this_to_base();
152 constexpr
bool operator<=(derived_t
const & rhs)
const 153 noexcept(noexcept(std::declval<base_t &>() > std::declval<base_t &>()))
155 requires
std::StrictTotallyOrdered<base_t>
158 return !(*
this > rhs);
162 constexpr
bool operator>=(derived_t
const & rhs)
const 163 noexcept(noexcept(std::declval<base_t &>() < std::declval<base_t &>()))
165 requires
std::StrictTotallyOrdered<base_t>
168 return !(*
this < rhs);
176 constexpr derived_t & operator++() noexcept(noexcept(++
std::declval<base_t &>()))
179 requires
std::InputIterator<base_t>
183 return *this_derived();
187 constexpr derived_t operator++(
int) noexcept(noexcept(++std::declval<derived_t &>()) &&
188 noexcept(derived_t(std::declval<base_t &>())))
190 requires
std::InputIterator<base_t>
193 derived_t cpy{*this_to_base()};
199 constexpr derived_t & operator--() noexcept(noexcept(--
std::declval<base_t &>()))
201 requires
std::BidirectionalIterator<base_t>
205 return *this_derived();
209 constexpr derived_t operator--(
int) noexcept(noexcept(--std::declval<derived_t &>()) &&
210 noexcept(derived_t{std::declval<base_t &>()}))
215 derived_t cpy{*this_to_base()};
221 constexpr derived_t & operator+=(difference_type
const skip) noexcept(noexcept(std::declval<base_t &>() += skip))
226 *this_to_base() += skip;
227 return *this_derived();
231 constexpr derived_t operator+(difference_type
const skip)
const 232 noexcept(noexcept(std::declval<derived_t &>() += skip) && noexcept(derived_t{std::declval<base_t &>()}))
237 derived_t cpy{*this_to_base()};
242 constexpr
friend derived_t operator+(difference_type
const skip, derived_t
const & it)
243 noexcept(noexcept(it + skip))
252 constexpr derived_t & operator-=(difference_type
const skip) noexcept(noexcept(std::declval<derived_t &>() += skip))
257 return *this_derived() += -skip;
261 constexpr derived_t operator-(difference_type
const skip)
const 262 noexcept(noexcept(std::declval<derived_t &>() -= skip) && noexcept(derived_t(std::declval<base_t &>())))
264 requires
std::RandomAccessIterator<base_t>
267 derived_t cpy{*this_to_base()};
272 constexpr
friend derived_t operator-(difference_type
const skip, derived_t
const & it)
273 noexcept(noexcept(std::declval<derived_t &>() - skip))
282 constexpr difference_type operator-(derived_t
const rhs)
const 283 noexcept(noexcept(std::declval<base_t &>() - std::declval<base_t &>()))
285 requires
std::RandomAccessIterator<base_t>
288 assert(*rhs.this_to_base() <= *this_to_base());
289 return static_cast<difference_type
>(*this_to_base() - *rhs.this_to_base());
296 constexpr reference operator*() const noexcept(noexcept(*
std::declval<base_t &>()))
299 requires
std::InputIterator<base_t>
302 return **this_to_base();
306 constexpr pointer operator->() const noexcept(noexcept(*
std::declval<base_t &>()))
308 requires
std::InputIterator<base_t>
311 return &*this_to_base();
315 constexpr decltype(
auto) operator[](
std::make_signed_t<difference_type> const n) const
316 noexcept(noexcept(*
std::declval<derived_t &>()) && noexcept(
std::declval<derived_t &>() + 3))
318 requires
std::RandomAccessIterator<base_t>
321 return *(*this_derived() + n);
333 constexpr derived_t * this_derived()
335 return static_cast<derived_t*
>(
this);
339 constexpr derived_t
const * this_derived()
const 341 return static_cast<derived_t
const *
>(
this);
345 constexpr base_t * this_to_base()
347 if constexpr (std::is_pointer_v<base_t>)
350 return static_cast<base_t*
>(
this);
354 constexpr base_t
const * this_to_base()
const 356 if constexpr (std::is_pointer_v<base_t>)
359 return static_cast<base_t
const *
>(
this);
The concept RandomAccessIterator refines std::BidirectionalIterator by adding support for constant ti...
Provides C++20 additions to the <iterator> header.
SeqAn specific customisations in the standard namespace.
Provides various transformation traits for use on iterators.
Definition: aligned_sequence_concept.hpp:35
The concept BidirectionalIterator refines std::ForwardIterator by adding the ability to move an itera...