27namespace seqan3::detail
62template <
typename index_t>
63 requires (std::integral<index_t> || simd_index<index_t>)
64class coordinate_matrix
74 struct convert_to_matrix_coordinate
77 index_t column_index{};
85 auto operator()(index_t
const row_index)
noexcept
87 return matrix_index<index_t>{row_index_type{row_index}, column_index_type{column_index}};
92 template <
typename simd_index_t>
93 using lazy_scalar_type_t =
typename simd_traits<simd_index_t>::scalar_type;
96 using size_type = lazy_conditional_t<simd_concept<index_t>, lazy<lazy_scalar_type_t, index_t>, index_t>;
102 size_type column_count{};
104 size_type row_count{};
110 coordinate_matrix() =
default;
111 coordinate_matrix(coordinate_matrix
const &) =
default;
112 coordinate_matrix(coordinate_matrix &&) =
default;
113 coordinate_matrix & operator=(coordinate_matrix
const &) =
default;
114 coordinate_matrix & operator=(coordinate_matrix &&) =
default;
115 ~coordinate_matrix() =
default;
135 template <std::
integral column_index_t, std::
integral row_index_t>
136 void resize(column_index_type<column_index_t>
const column_count,
137 row_index_type<row_index_t>
const row_count)
noexcept
139 this->column_count = column_count.get();
140 this->row_count = row_count.get();
148 iterator
begin() const noexcept
150 return iterator{size_type{}, row_count};
154 iterator
end() const noexcept
156 return iterator{column_count, row_count};
174template <
typename index_t>
175 requires (std::integral<index_t> || simd_index<index_t>)
176class coordinate_matrix<index_t>::iterator
180 using iota_view_t = lazy_conditional_t<simd_index<index_t>,
181 lazy<iota_simd_view, index_t>,
182 decltype(std::views::iota(size_type{}, size_type{}))>;
184 index_t column_id{0};
186 size_type row_count{0};
193 using value_type =
decltype(std::declval<iota_view_t>()
196 using reference = value_type;
198 using pointer = void;
208 iterator() =
default;
209 iterator(iterator
const &) =
default;
210 iterator(iterator &&) =
default;
211 iterator & operator=(iterator
const &) =
default;
212 iterator & operator=(iterator &&) =
default;
213 ~iterator() =
default;
221 explicit iterator(size_type column_id, size_type row_count) noexcept : row_count{std::move(row_count)}
223 if constexpr (simd_index<index_t>)
224 this->column_id = simd::fill<index_t>(std::move(column_id));
226 this->column_id = std::move(column_id);
235 auto operator*()
const
237 if constexpr (simd_index<index_t>)
239 return views::iota_simd<index_t>(size_type{}, row_count)
244 return std::views::iota(size_type{}, row_count)
255 iterator & operator++()
258 if constexpr (simd_index<index_t>)
259 column_id = column_id + simd::fill<index_t>(1);
267 iterator operator++(
int)
280 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);
Provides algorithms to modify seqan3::simd::simd_type.
Provides seqan3::aligned_allocator.
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: traits.hpp:470
Provides seqan3::detail::counted_simd_iterator and seqan3::views::iota_simd.
Provides lazy template instantiation traits.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
Provides seqan3::simd::simd_traits.
Provides type traits for working with templates.
Provides seqan3::simd::simd_concept.