20namespace seqan3::detail
35enum struct matrix_major_order : uint8_t
72template <
typename derived_t, matrix_major_order order>
73class two_dimensional_matrix_iterator_base
80 template <
typename other_derived_t, matrix_major_order other_order>
81 friend class two_dimensional_matrix_iterator_base;
87 constexpr two_dimensional_matrix_iterator_base() =
default;
89 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base
const &) =
default;
91 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base &&) =
default;
93 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base
const &) =
default;
95 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base &&) =
default;
97 ~two_dimensional_matrix_iterator_base() =
default;
101 template <
typename _derived_t>
102 using difference_type =
typename _derived_t::difference_type;
105 template <
typename _derived_t>
106 using reference =
typename _derived_t::reference;
109 template <
typename _derived_t>
110 using pointer =
typename _derived_t::pointer;
117 template <
typename dummy_t = derived_t>
118 constexpr reference<dummy_t> operator*() const noexcept
120 return *as_derived().host_iter;
124 template <
typename dummy_t = derived_t>
127 return *(as_derived() +
offset);
131 template <
typename dummy_t = derived_t>
132 constexpr reference<dummy_t> operator[](matrix_offset
const &
offset)
const noexcept
134 return *(as_derived() +
offset);
138 template <
typename dummy_t = derived_t>
139 constexpr pointer<dummy_t> operator->() const noexcept
154 SEQAN3_DOXYGEN_ONLY(
constexpr seqan3::detail::matrix_coordinate coordinate()
const noexcept {})
175 SEQAN3_DOXYGEN_ONLY(
constexpr derived_t &
operator+=(matrix_offset
const &
offset)
noexcept {})
178 constexpr derived_t &
operator++() noexcept
180 if constexpr (order == matrix_major_order::column)
181 return as_derived() += matrix_offset{row_index_type{1}, column_index_type{0}};
183 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{1}};
187 constexpr derived_t operator++(
int)
noexcept
189 derived_t previous{as_derived()};
195 template <
typename dummy_t = derived_t>
198 if constexpr (order == matrix_major_order::column)
199 return as_derived() += matrix_offset{row_index_type{
offset}, column_index_type{0}};
201 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{
offset}};
205 template <
typename dummy_t = derived_t>
208 derived_t
next{as_derived()};
214 template <
typename dummy_t = derived_t>
221 constexpr derived_t operator+(matrix_offset
const &
offset)
const noexcept
223 derived_t
next{as_derived()};
229 constexpr friend derived_t operator+(matrix_offset
const &
offset, derived_t
const iter)
235 constexpr derived_t & operator--() noexcept
237 if constexpr (order == matrix_major_order::column)
238 return as_derived() += matrix_offset{row_index_type{-1}, column_index_type{0}};
240 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{-1}};
244 constexpr derived_t operator--(
int)
noexcept
246 derived_t previous{as_derived()};
252 template <
typename dummy_t = derived_t>
259 template <
typename dummy_t = derived_t>
262 derived_t
next{as_derived()};
268 constexpr derived_t & operator-=(matrix_offset
const &
offset)
noexcept
270 return as_derived() += matrix_offset{row_index_type{-
offset.row}, column_index_type{-
offset.col}};
274 constexpr derived_t operator-(matrix_offset
const &
offset)
const noexcept
276 derived_t
next{as_derived()};
282 template <
typename dummy_t = derived_t>
285 return lhs.as_host_iter() - rhs.as_host_iter();
295 template <
typename other_derived_t>
296 requires std::constructible_from<derived_t, other_derived_t>
297 || std::constructible_from<other_derived_t, derived_t>
298 constexpr bool operator==(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
300 return as_derived().host_iter == rhs.as_derived().host_iter;
304 template <
typename other_derived_t>
305 requires std::constructible_from<derived_t, other_derived_t>
306 || std::constructible_from<other_derived_t, derived_t>
307 constexpr bool operator!=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
309 return !(*
this == rhs);
313 template <
typename other_derived_t>
314 requires std::constructible_from<derived_t, other_derived_t>
315 || std::constructible_from<other_derived_t, derived_t>
316 constexpr bool operator<(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
318 return as_derived().host_iter < rhs.as_derived().host_iter;
322 template <
typename other_derived_t>
323 requires std::constructible_from<derived_t, other_derived_t>
324 || std::constructible_from<other_derived_t, derived_t>
325 constexpr bool operator<=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
327 return as_derived().host_iter <= rhs.as_derived().host_iter;
331 template <
typename other_derived_t>
332 requires std::constructible_from<derived_t, other_derived_t>
333 || std::constructible_from<other_derived_t, derived_t>
334 constexpr bool operator>(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
336 return as_derived().host_iter > rhs.as_derived().host_iter;
340 template <
typename other_derived_t>
341 requires std::constructible_from<derived_t, other_derived_t>
342 || std::constructible_from<other_derived_t, derived_t>
343 constexpr bool operator>=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
345 return as_derived().host_iter >= rhs.as_derived().host_iter;
351 constexpr auto const & as_host_iter()
const
353 return as_derived().host_iter;
357 constexpr derived_t & as_derived()
359 return static_cast<derived_t &
>(*this);
363 constexpr derived_t
const & as_derived()
const
365 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.