45 #include <range/v3/utility/iterator_traits.hpp> 46 #include <range/v3/range_traits.hpp> 75 template <
typename derived_t, std::Iterator base_t>
76 class inherited_iterator_base :
public base_t
83 using difference_type =
typename std::iterator_traits<base_t>::difference_type;
84 using value_type =
typename std::iterator_traits<base_t>::value_type;
85 using reference =
typename std::iterator_traits<base_t>::reference;
86 using pointer =
typename std::iterator_traits<base_t>::pointer;
87 using iterator_category =
typename std::iterator_traits<base_t>::iterator_category;
93 inherited_iterator_base() =
default;
94 constexpr inherited_iterator_base(inherited_iterator_base
const & rhs) =
default;
95 constexpr inherited_iterator_base(inherited_iterator_base && rhs) =
default;
96 constexpr inherited_iterator_base &
operator=(inherited_iterator_base
const & rhs) =
default;
97 constexpr inherited_iterator_base &
operator=(inherited_iterator_base && rhs) =
default;
98 ~inherited_iterator_base() =
default;
100 inherited_iterator_base(base_t it) : base_t{it} {}
107 constexpr
bool operator==(derived_t
const & rhs)
const noexcept(noexcept(base_t{} == base_t{}))
109 requires
std::EqualityComparable<base_t>
112 return *this_to_base() ==
static_cast<base_t
>(rhs);
115 constexpr
bool operator!=(derived_t
const & rhs)
const noexcept(noexcept(base_t{} == base_t{}))
117 requires
std::EqualityComparable<base_t>
120 return !(*
this == rhs);
123 constexpr
bool operator<(derived_t
const & rhs)
const noexcept(noexcept(base_t{} < base_t{}))
128 return *this_to_base() <
static_cast<base_t
>(rhs);
131 constexpr
bool operator>(derived_t
const & rhs)
const noexcept(noexcept(base_t{} > base_t{}))
136 return *this_to_base() >
static_cast<base_t
>(rhs);
139 constexpr
bool operator<=(derived_t
const & rhs)
const noexcept(noexcept(base_t{} < base_t{}))
144 return !(*
this > rhs);
147 constexpr
bool operator>=(derived_t
const & rhs)
const noexcept(noexcept(base_t{} < base_t{}))
152 return !(*
this < rhs);
160 constexpr derived_t & operator++() noexcept(noexcept(++base_t{}))
163 requires
std::InputIterator<base_t>
167 return *this_derived();
171 constexpr derived_t operator++(
int) noexcept(noexcept(++base_t{}))
176 inherited_iterator_base cpy{*
this};
178 return static_cast<derived_t
>(cpy);
182 constexpr derived_t & operator--() noexcept(noexcept(--base_t{}))
184 requires
std::BidirectionalIterator<base_t>
188 return *this_derived();
192 constexpr derived_t operator--(
int) noexcept(noexcept(--base_t{}))
197 inherited_iterator_base cpy{*
this};
199 return static_cast<derived_t
>(cpy);
203 constexpr derived_t & operator+=(difference_type
const skip) noexcept(noexcept(base_t{} += skip))
205 requires
std::RandomAccessIterator<base_t>
208 *this_to_base() += skip;
209 return *this_derived();
213 constexpr derived_t operator+(difference_type
const skip)
const noexcept(noexcept(base_t{} += skip))
215 requires
std::RandomAccessIterator<base_t>
218 derived_t cpy{*this_derived()};
223 constexpr
friend derived_t operator+(difference_type
const skip, derived_t
const & it) noexcept(noexcept(base_t{} += skip))
225 requires
std::RandomAccessIterator<base_t>
232 constexpr derived_t & operator-=(difference_type
const skip) noexcept(noexcept(base_t{} -= skip))
234 requires
std::RandomAccessIterator<base_t>
237 *this_to_base() -= skip;
238 return *this_derived();
242 constexpr derived_t operator-(difference_type
const skip)
const noexcept(noexcept(base_t{} -= skip))
244 requires
std::RandomAccessIterator<base_t>
247 derived_t cpy{*this_derived()};
252 constexpr
friend derived_t operator-(difference_type
const skip, derived_t
const & it) noexcept(noexcept(base_t{} -= skip))
254 requires
std::RandomAccessIterator<base_t>
261 constexpr difference_type operator-(derived_t
const rhs)
const noexcept
266 assert(static_cast<base_t>(rhs) > *this_to_base());
267 return static_cast<difference_type
>(*this_to_base() -
static_cast<base_t
>(rhs));
274 constexpr reference operator*() const noexcept(noexcept(*base_t{}))
277 requires
std::InputIterator<base_t>
280 return **this_to_base();
284 constexpr pointer operator->() const noexcept(noexcept(*base_t{}))
286 requires
std::InputIterator<base_t>
289 return &*this_to_base();
293 constexpr reference operator[](std::make_signed_t<difference_type>
const n)
const noexcept(noexcept(base_t{}[0]))
295 requires
std::RandomAccessIterator<base_t>
298 return this_to_base()[n];
305 derived_t * this_derived()
307 return static_cast<derived_t*
>(
this);
311 derived_t
const * this_derived()
const 313 return static_cast<derived_t
const *
>(
this);
317 base_t * this_to_base()
319 return static_cast<base_t*
>(
this);
323 base_t
const * this_to_base()
const 325 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.
Definition: align_result.hpp:221
t & operator=(t1 const &rhs)
Assignment operator.
Adaptations of concepts from the Ranges TS.
Definition: aligned_sequence_concept.hpp:288
Provides C++20 additions to the type_traits header.
The concept BidirectionalIterator refines std::ForwardIterator by adding the ability to move an itera...
Requires std::EqualityComparable and all remaing comparison operators (<, <=, >, >=).