26 namespace seqan3::detail
51 template <
typename score_t>
55 class score_matrix_single_column
59 using physical_column_t =
std::vector<score_t, aligned_allocator<score_t,
alignof(score_t)>>;
63 class matrix_iterator;
66 physical_column_t optimal_column{};
68 physical_column_t horizontal_column{};
70 virtual_column_t vertical_column{};
72 size_t number_of_columns{};
78 score_matrix_single_column() =
default;
79 score_matrix_single_column(score_matrix_single_column
const &) =
default;
80 score_matrix_single_column(score_matrix_single_column &&) =
default;
81 score_matrix_single_column & operator=(score_matrix_single_column
const &) =
default;
82 score_matrix_single_column & operator=(score_matrix_single_column &&) =
default;
83 ~score_matrix_single_column() =
default;
112 template <std::
integral column_index_t, std::
integral row_index_t>
113 void resize(column_index_type<column_index_t>
const number_of_columns,
114 row_index_type<row_index_t>
const number_of_rows,
115 score_t
const initial_value = score_t{})
117 this->number_of_columns = number_of_columns.get();
118 optimal_column.clear();
119 horizontal_column.clear();
120 optimal_column.resize(number_of_rows.get(), initial_value);
121 horizontal_column.resize(number_of_rows.get(), initial_value);
122 vertical_column =
views::repeat_n(initial_value, number_of_rows.get());
128 matrix_iterator
begin()
131 return matrix_iterator{*
this, 0u};
135 matrix_iterator
begin()
const =
delete;
138 matrix_iterator
end()
140 return matrix_iterator{*
this, number_of_columns};
144 matrix_iterator
end()
const =
delete;
159 template <
typename score_t>
160 class score_matrix_single_column<score_t>::matrix_iterator
165 using matrix_column_t = decltype(views::zip(std::declval<physical_column_t &>(),
166 std::declval<physical_column_t &>(),
167 std::declval<virtual_column_t &>()));
173 using fwd_tuple_t = decltype(tpl);
174 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
178 score_matrix_single_column * host_ptr{
nullptr};
180 size_t current_column_id{};
186 using value_type = decltype(std::declval<matrix_column_t>() | transform_to_affine_cell);
189 using reference = value_type;
191 using pointer = void;
201 matrix_iterator() noexcept = default;
202 matrix_iterator(matrix_iterator const &) noexcept = default;
203 matrix_iterator(matrix_iterator &&) noexcept = default;
204 matrix_iterator & operator=(matrix_iterator const &) noexcept = default;
205 matrix_iterator & operator=(matrix_iterator &&) noexcept = default;
206 ~matrix_iterator() = default;
213 explicit matrix_iterator(score_matrix_single_column & host_matrix,
size_t const initial_column_id) noexcept :
215 current_column_id{initial_column_id}
222 reference operator*()
const
225 return views::zip(host_ptr->optimal_column, host_ptr->horizontal_column, host_ptr->vertical_column)
226 | transform_to_affine_cell;
233 matrix_iterator & operator++()
250 friend bool operator==(matrix_iterator
const & lhs, matrix_iterator
const & rhs) noexcept
253 return lhs.current_column_id == rhs.current_column_id;
257 friend bool operator!=(matrix_iterator
const & lhs, matrix_iterator
const & rhs) noexcept
259 return !(lhs == rhs);