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 requires (order == other_order)
85 friend class two_dimensional_matrix_iterator_base;
91 constexpr two_dimensional_matrix_iterator_base() =
default;
93 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base
const &) =
default;
95 constexpr two_dimensional_matrix_iterator_base(two_dimensional_matrix_iterator_base &&) =
default;
97 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base
const &) =
default;
99 constexpr two_dimensional_matrix_iterator_base & operator=(two_dimensional_matrix_iterator_base &&) =
default;
101 ~two_dimensional_matrix_iterator_base() =
default;
105 template <
typename _derived_t>
106 using difference_type =
typename _derived_t::difference_type;
109 template <
typename _derived_t>
110 using reference =
typename _derived_t::reference;
113 template <
typename _derived_t>
114 using pointer =
typename _derived_t::pointer;
121 template <
typename dummy_t = derived_t>
122 constexpr reference<dummy_t> operator*() const noexcept
124 return *as_derived().host_iter;
128 template <
typename dummy_t = derived_t>
131 return *(as_derived() +
offset);
135 template <
typename dummy_t = derived_t>
136 constexpr reference<dummy_t> operator[](matrix_offset
const & offset)
const noexcept
138 return *(as_derived() +
offset);
142 template <
typename dummy_t = derived_t>
143 constexpr pointer<dummy_t> operator->() const noexcept
158 SEQAN3_DOXYGEN_ONLY(
constexpr seqan3::detail::matrix_coordinate coordinate()
const noexcept {})
179 SEQAN3_DOXYGEN_ONLY(
constexpr derived_t &
operator+=(matrix_offset
const & offset)
noexcept {})
182 constexpr derived_t &
operator++() noexcept
184 if constexpr (order == matrix_major_order::column)
185 return as_derived() += matrix_offset{row_index_type{1}, column_index_type{0}};
187 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{1}};
191 constexpr derived_t operator++(
int)
noexcept
193 derived_t previous{as_derived()};
199 template <
typename dummy_t = derived_t>
202 if constexpr (order == matrix_major_order::column)
203 return as_derived() += matrix_offset{row_index_type{
offset}, column_index_type{0}};
205 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{
offset}};
209 template <
typename dummy_t = derived_t>
212 derived_t
next{as_derived()};
218 template <
typename dummy_t = derived_t>
225 constexpr derived_t operator+(matrix_offset
const & offset)
const noexcept
227 derived_t
next{as_derived()};
233 constexpr friend derived_t operator+(matrix_offset
const & offset, derived_t
const iter)
239 constexpr derived_t & operator--() noexcept
241 if constexpr (order == matrix_major_order::column)
242 return as_derived() += matrix_offset{row_index_type{-1}, column_index_type{0}};
244 return as_derived() += matrix_offset{row_index_type{0}, column_index_type{-1}};
248 constexpr derived_t operator--(
int)
noexcept
250 derived_t previous{as_derived()};
256 template <
typename dummy_t = derived_t>
263 template <
typename dummy_t = derived_t>
266 derived_t
next{as_derived()};
272 constexpr derived_t & operator-=(matrix_offset
const & offset)
noexcept
274 return as_derived() += matrix_offset{row_index_type{-
offset.row}, column_index_type{-
offset.col}};
278 constexpr derived_t operator-(matrix_offset
const & offset)
const noexcept
280 derived_t
next{as_derived()};
286 template <
typename dummy_t = derived_t>
289 return lhs.as_host_iter() - rhs.as_host_iter();
299 template <
typename other_derived_t>
300 requires std::constructible_from<derived_t, other_derived_t>
301 || std::constructible_from<other_derived_t, derived_t>
302 constexpr bool operator==(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
304 return as_derived().host_iter == rhs.as_derived().host_iter;
308 template <
typename other_derived_t>
309 requires std::constructible_from<derived_t, other_derived_t>
310 || std::constructible_from<other_derived_t, derived_t>
311 constexpr bool operator!=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
313 return !(*
this == rhs);
317 template <
typename other_derived_t>
318 requires std::constructible_from<derived_t, other_derived_t>
319 || std::constructible_from<other_derived_t, derived_t>
320 constexpr bool operator<(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
322 return as_derived().host_iter < rhs.as_derived().host_iter;
326 template <
typename other_derived_t>
327 requires std::constructible_from<derived_t, other_derived_t>
328 || std::constructible_from<other_derived_t, derived_t>
329 constexpr bool operator<=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
331 return as_derived().host_iter <= rhs.as_derived().host_iter;
335 template <
typename other_derived_t>
336 requires std::constructible_from<derived_t, other_derived_t>
337 || std::constructible_from<other_derived_t, derived_t>
338 constexpr bool operator>(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
340 return as_derived().host_iter > rhs.as_derived().host_iter;
344 template <
typename other_derived_t>
345 requires std::constructible_from<derived_t, other_derived_t>
346 || std::constructible_from<other_derived_t, derived_t>
347 constexpr bool operator>=(two_dimensional_matrix_iterator_base<other_derived_t, order>
const & rhs)
const noexcept
349 return as_derived().host_iter >= rhs.as_derived().host_iter;
355 constexpr auto const & as_host_iter()
const
357 return as_derived().host_iter;
361 constexpr derived_t & as_derived()
363 return static_cast<derived_t &
>(*this);
367 constexpr derived_t
const & as_derived()
const
369 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.