18#include <seqan3/utility/simd/algorithm.hpp>
19#include <seqan3/utility/simd/concept.hpp>
20#include <seqan3/utility/simd/simd_traits.hpp>
21#include <seqan3/utility/simd/views/iota_simd.hpp>
24namespace seqan3::detail
59template <
typename index_t>
60 requires (std::integral<index_t> || simd_index<index_t>)
61class coordinate_matrix
71 struct convert_to_matrix_coordinate
74 index_t column_index{};
82 auto operator()(index_t
const row_index)
noexcept
84 return matrix_index<index_t>{row_index_type{row_index}, column_index_type{column_index}};
89 template <
typename simd_index_t>
90 using lazy_scalar_type_t =
typename simd_traits<simd_index_t>::scalar_type;
93 using size_type = lazy_conditional_t<simd_concept<index_t>, lazy<lazy_scalar_type_t, index_t>, index_t>;
99 size_type column_count{};
101 size_type row_count{};
107 coordinate_matrix() =
default;
108 coordinate_matrix(coordinate_matrix
const &) =
default;
109 coordinate_matrix(coordinate_matrix &&) =
default;
110 coordinate_matrix & operator=(coordinate_matrix
const &) =
default;
111 coordinate_matrix & operator=(coordinate_matrix &&) =
default;
112 ~coordinate_matrix() =
default;
132 template <std::
integral column_index_t, std::
integral row_index_t>
133 void resize(column_index_type<column_index_t>
const column_count,
134 row_index_type<row_index_t>
const row_count)
noexcept
136 this->column_count = column_count.get();
137 this->row_count = row_count.get();
145 iterator
begin() const noexcept
147 return iterator{size_type{}, row_count};
151 iterator
end() const noexcept
153 return iterator{column_count, row_count};
171template <
typename index_t>
172 requires (std::integral<index_t> || simd_index<index_t>)
173class coordinate_matrix<index_t>::iterator
177 using iota_view_t = lazy_conditional_t<simd_index<index_t>,
178 lazy<iota_simd_view, index_t>,
179 decltype(std::views::iota(size_type{}, size_type{}))>;
181 index_t column_id{0};
183 size_type row_count{0};
190 using value_type =
decltype(std::declval<iota_view_t>()
191 | std::views::transform(convert_to_matrix_coordinate{index_t{} }));
193 using reference = value_type;
195 using pointer = void;
205 iterator() =
default;
206 iterator(iterator
const &) =
default;
207 iterator(iterator &&) =
default;
208 iterator & operator=(iterator
const &) =
default;
209 iterator & operator=(iterator &&) =
default;
210 ~iterator() =
default;
218 explicit iterator(size_type column_id, size_type row_count) noexcept : row_count{std::move(row_count)}
220 if constexpr (simd_index<index_t>)
221 this->column_id = simd::fill<index_t>(std::move(column_id));
223 this->column_id = std::move(column_id);
232 auto operator*()
const
234 if constexpr (simd_index<index_t>)
236 return views::iota_simd<index_t>(size_type{}, row_count)
237 | std::views::transform(convert_to_matrix_coordinate{column_id});
241 return std::views::iota(size_type{}, row_count)
242 | std::views::transform(convert_to_matrix_coordinate{column_id});
252 iterator & operator++()
255 if constexpr (simd_index<index_t>)
256 column_id = column_id + simd::fill<index_t>(1);
264 iterator operator++(
int)
277 friend bool operator==(iterator
const & lhs, iterator
const & rhs)
279 if constexpr (simd_index<index_t>)
280 return lhs.column_id[0] == rhs.column_id[0];
282 return lhs.column_id == rhs.column_id;
286 friend bool operator!=(iterator
const & lhs, iterator
const & rhs)
288 return !(lhs == rhs);
Provides seqan3::aligned_allocator.
Provides lazy template instantiation traits.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
Provides type traits for working with templates.