27 namespace seqan3::detail
62 template <
typename index_t>
64 requires (std::integral<index_t> || simd_index<index_t>)
66 class coordinate_matrix
76 struct convert_to_matrix_coordinate
79 index_t column_index{};
87 auto operator()(index_t
const row_index) noexcept
89 return matrix_index{row_index_type{row_index}, column_index_type{column_index}};
94 template <
typename simd_index_t>
95 using lazy_scalar_type_t =
typename simd_traits<simd_index_t>::scalar_type;
98 using size_type = lazy_conditional_t<simd_concept<index_t>, lazy<lazy_scalar_type_t, index_t>, index_t>;
104 size_type column_count{};
106 size_type row_count{};
112 coordinate_matrix() =
default;
113 coordinate_matrix(coordinate_matrix
const &) =
default;
114 coordinate_matrix(coordinate_matrix &&) =
default;
115 coordinate_matrix & operator=(coordinate_matrix
const &) =
default;
116 coordinate_matrix & operator=(coordinate_matrix &&) =
default;
117 ~coordinate_matrix() =
default;
137 template <std::
integral column_index_t, std::
integral row_index_t>
138 void resize(column_index_type<column_index_t>
const column_count,
139 row_index_type<row_index_t>
const row_count) noexcept
141 this->column_count = column_count.get();
142 this->row_count = row_count.get();
149 iterator
begin() const noexcept
152 return iterator{size_type{}, row_count};
156 iterator
end() const noexcept
158 return iterator{column_count, row_count};
176 template <
typename index_t>
178 requires (std::integral<index_t> || simd_index<index_t>)
180 class coordinate_matrix<index_t>::iterator
184 using iota_view_t = lazy_conditional_t<simd_index<index_t>,
185 lazy<iota_simd_view, index_t>,
186 decltype(std::views::iota(size_type{}, size_type{}))>;
188 index_t column_id{0};
190 size_type row_count{0};
196 using value_type = decltype(std::declval<iota_view_t>()
200 using reference = value_type;
202 using pointer = void;
212 iterator() =
default;
213 iterator(iterator
const &) =
default;
214 iterator(iterator &&) =
default;
215 iterator & operator=(iterator
const &) =
default;
216 iterator & operator=(iterator &&) =
default;
217 ~iterator() =
default;
225 explicit iterator(size_type column_id, size_type row_count) noexcept :
228 if constexpr (simd_index<index_t>)
229 this->column_id = simd::fill<index_t>(
std::move(column_id));
239 auto operator*()
const
242 if constexpr (simd_index<index_t>)
244 return views::iota_simd<index_t>(size_type{}, row_count)
249 return std::views::iota(size_type{}, row_count)
259 iterator & operator++()
267 iterator operator++(
int)
279 friend bool operator==(iterator
const & lhs, iterator
const & rhs)
282 if constexpr (simd_index<index_t>)
283 return lhs.column_id[0] == rhs.column_id[0];
285 return lhs.column_id == rhs.column_id;
289 friend bool operator!=(iterator
const & lhs, iterator
const & rhs)
291 return !(lhs == rhs);