23namespace seqan3::detail
38enum struct matrix_major_order : uint8_t
75template <
typename derived_t, matrix_major_order order>
76class two_dimensional_matrix_iterator_base
83 template <
typename other_derived_t, matrix_major_order other_order>
84 friend class two_dimensional_matrix_iterator_base;
90 constexpr two_dimensional_matrix_iterator_base() =
default;
92 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base
const &) =
default;
94 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base &&) =
default;
96 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base
const &) =
default;
98 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base &&) =
default;
100 ~two_dimensional_matrix_iterator_base() =
default;
104 template <
typename _derived_t>
105 using difference_type =
typename _derived_t::difference_type;
108 template <
typename _derived_t>
109 using reference =
typename _derived_t::reference;
112 template <
typename _derived_t>
113 using pointer =
typename _derived_t::pointer;
120 template <
typename dummy_t = derived_t>
121 constexpr reference<dummy_t> operator*() const noexcept
123 return *as_derived().host_iter;
127 template <
typename dummy_t = derived_t>
128 constexpr reference<dummy_t> operator[](std::iter_difference_t<dummy_t>
const offset)
const noexcept
130 return *(as_derived() +
offset);
134 template <
typename dummy_t = derived_t>
135 constexpr reference<dummy_t> operator[](matrix_offset
const &
offset)
const noexcept
137 return *(as_derived() +
offset);
141 template <
typename dummy_t = derived_t>
142 constexpr pointer<dummy_t> operator->() const noexcept
157 SEQAN3_DOXYGEN_ONLY(
constexpr seqan3::detail::matrix_coordinate coordinate()
const noexcept {})
178 SEQAN3_DOXYGEN_ONLY(
constexpr derived_t &
operator+=(matrix_offset
const &
offset)
noexcept {})
181 constexpr derived_t &
operator++() noexcept
183 if constexpr (order == matrix_major_order::column)
184 return as_derived() += matrix_offset{row_index_type{1}, column_index_type{0}};
186 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{1}};
190 constexpr derived_t operator++(
int)
noexcept
192 derived_t previous{as_derived()};
198 template <
typename dummy_t = derived_t>
199 constexpr derived_t & operator+=(std::iter_difference_t<dummy_t>
const offset)
noexcept
201 if constexpr (order == matrix_major_order::column)
202 return as_derived() += matrix_offset{row_index_type{
offset}, column_index_type{0}};
204 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{
offset}};
208 template <
typename dummy_t = derived_t>
209 constexpr derived_t operator+(std::iter_difference_t<dummy_t>
const offset)
const noexcept
211 derived_t
next{as_derived()};
217 template <
typename dummy_t = derived_t>
218 constexpr friend derived_t operator+(std::iter_difference_t<dummy_t>
const offset, derived_t
const iter)
224 constexpr derived_t operator+(matrix_offset
const &
offset)
const noexcept
226 derived_t
next{as_derived()};
232 constexpr friend derived_t operator+(matrix_offset
const &
offset, derived_t
const iter)
238 constexpr derived_t & operator--() noexcept
240 if constexpr (order == matrix_major_order::column)
241 return as_derived() += matrix_offset{row_index_type{-1}, column_index_type{0}};
243 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{-1}};
247 constexpr derived_t operator--(
int)
noexcept
249 derived_t previous{as_derived()};
255 template <
typename dummy_t = derived_t>
256 constexpr derived_t & operator-=(std::iter_difference_t<dummy_t>
const offset)
noexcept
262 template <
typename dummy_t = derived_t>
263 constexpr derived_t operator-(std::iter_difference_t<dummy_t>
const offset)
const noexcept
265 derived_t
next{as_derived()};
271 constexpr derived_t & operator-=(matrix_offset
const &
offset)
noexcept
273 return as_derived() += matrix_offset{row_index_type{-
offset.row}, column_index_type{-
offset.col}};
277 constexpr derived_t operator-(matrix_offset
const &
offset)
const noexcept
279 derived_t
next{as_derived()};
285 template <
typename dummy_t = derived_t>
286 friend constexpr std::iter_difference_t<dummy_t> operator-(derived_t
const lhs, derived_t
const rhs)
noexcept
288 return lhs.as_host_iter() - rhs.as_host_iter();
298 template <
typename other_derived_t>
299 requires std::constructible_from<derived_t, other_derived_t>
300 || std::constructible_from<other_derived_t, derived_t>
301 constexpr bool operator==(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
303 return as_derived().host_iter == rhs.as_derived().host_iter;
307 template <
typename other_derived_t>
308 requires std::constructible_from<derived_t, other_derived_t>
309 || std::constructible_from<other_derived_t, derived_t>
310 constexpr bool operator!=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
312 return !(*
this == rhs);
316 template <
typename other_derived_t>
317 requires std::constructible_from<derived_t, other_derived_t>
318 || std::constructible_from<other_derived_t, derived_t>
319 constexpr bool operator<(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
321 return as_derived().host_iter < rhs.as_derived().host_iter;
325 template <
typename other_derived_t>
326 requires std::constructible_from<derived_t, other_derived_t>
327 || std::constructible_from<other_derived_t, derived_t>
328 constexpr bool operator<=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
330 return as_derived().host_iter <= rhs.as_derived().host_iter;
334 template <
typename other_derived_t>
335 requires std::constructible_from<derived_t, other_derived_t>
336 || std::constructible_from<other_derived_t, derived_t>
337 constexpr bool operator>(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
339 return as_derived().host_iter > rhs.as_derived().host_iter;
343 template <
typename other_derived_t>
344 requires std::constructible_from<derived_t, other_derived_t>
345 || std::constructible_from<other_derived_t, derived_t>
346 constexpr bool operator>=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
348 return as_derived().host_iter >= rhs.as_derived().host_iter;
354 constexpr auto const & as_host_iter()
const
356 return as_derived().host_iter;
360 constexpr derived_t & as_derived()
362 return static_cast<derived_t &
>(*this);
366 constexpr derived_t
const & as_derived()
const
368 return static_cast<derived_t
const &
>(*this);
Provides various type traits on generic types.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
Provides various transformation traits for use on iterators.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.