19#include <seqan3/utility/simd/concept.hpp>
23namespace seqan3::detail
48template <
typename score_t>
50class score_matrix_single_column
54 using physical_column_t =
std::vector<score_t, aligned_allocator<score_t,
alignof(score_t)>>;
58 class matrix_iterator;
61 physical_column_t optimal_column{};
63 physical_column_t horizontal_column{};
65 virtual_column_t vertical_column{};
67 size_t number_of_columns{};
73 score_matrix_single_column() =
default;
74 score_matrix_single_column(score_matrix_single_column
const &) =
default;
75 score_matrix_single_column(score_matrix_single_column &&) =
default;
76 score_matrix_single_column & operator=(score_matrix_single_column
const &) =
default;
77 score_matrix_single_column & operator=(score_matrix_single_column &&) =
default;
78 ~score_matrix_single_column() =
default;
108 template <std::
integral column_index_t, std::
integral row_index_t>
109 void resize(column_index_type<column_index_t>
const number_of_columns,
110 row_index_type<row_index_t>
const number_of_rows,
111 score_t
const initial_value = score_t{})
113 this->number_of_columns = number_of_columns.get();
114 optimal_column.
clear();
115 horizontal_column.clear();
117 optimal_column.resize(number_of_rows.get(), initial_value);
119 horizontal_column.resize(number_of_rows.get(), initial_value);
120 vertical_column =
views::repeat_n(initial_value, number_of_rows.get());
127 matrix_iterator
begin()
129 return matrix_iterator{*
this, 0u};
133 matrix_iterator
begin()
const =
delete;
136 matrix_iterator
end()
138 return matrix_iterator{*
this, number_of_columns};
142 matrix_iterator
end()
const =
delete;
157template <
typename score_t>
159class score_matrix_single_column<score_t>::matrix_iterator
163 using matrix_column_t =
decltype(
views::zip(std::declval<physical_column_t &>(),
164 std::declval<physical_column_t &>(),
165 std::declval<virtual_column_t &>()));
168 static constexpr auto transform_to_affine_cell = std::views::transform(
171 using fwd_tuple_t =
decltype(tpl);
172 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
176 score_matrix_single_column * host_ptr{
nullptr};
178 size_t current_column_id{};
185 using value_type =
decltype(std::declval<matrix_column_t>() | transform_to_affine_cell);
187 using reference = value_type;
189 using pointer = void;
199 matrix_iterator() noexcept = default;
200 matrix_iterator(matrix_iterator const &) noexcept = default;
201 matrix_iterator(matrix_iterator &&) noexcept = default;
202 matrix_iterator & operator=(matrix_iterator const &) noexcept = default;
203 matrix_iterator & operator=(matrix_iterator &&) noexcept = default;
204 ~matrix_iterator() = default;
211 explicit matrix_iterator(score_matrix_single_column & host_matrix,
size_t const initial_column_id) noexcept :
213 current_column_id{initial_column_id}
221 reference operator*()
const
223 return views::zip(host_ptr->optimal_column, host_ptr->horizontal_column, host_ptr->vertical_column)
224 | transform_to_affine_cell;
232 matrix_iterator & operator++()
249 friend bool operator==(matrix_iterator
const & lhs, matrix_iterator
const & rhs)
noexcept
251 return lhs.current_column_id == rhs.current_column_id;
255 friend bool operator!=(matrix_iterator
const & lhs, matrix_iterator
const & rhs)
noexcept
257 return !(lhs == rhs);
Provides seqan3::detail::affine_cell_proxy.
Provides seqan3::aligned_allocator.
seqan::stl::views::zip zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition zip.hpp:24
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition repeat_n.hpp:88
A type that satisfies std::is_arithmetic_v<t>.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
Provides seqan3::views::repeat_n.
Provides concepts that do not have equivalents in C++20.
Provides seqan3::views::zip.