23namespace seqan3::detail
44template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
45 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
46 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
47class combined_score_and_trace_matrix
57 score_matrix_t score_matrix{};
59 trace_matrix_t trace_matrix{};
65 combined_score_and_trace_matrix() =
default;
66 combined_score_and_trace_matrix(combined_score_and_trace_matrix
const &) =
default;
67 combined_score_and_trace_matrix(combined_score_and_trace_matrix &&) =
default;
68 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix
const &) =
default;
69 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix &&) =
default;
70 ~combined_score_and_trace_matrix() =
default;
94 template <std::
integral column_index_t, std::
integral row_index_t>
95 void resize(column_index_type<column_index_t>
const column_count,
96 row_index_type<row_index_t>
const row_count,
97 score_type
const initial_score = score_type{})
99 score_matrix_t tmp_score_matrix{};
100 tmp_score_matrix.resize(column_count, row_count, initial_score);
102 trace_matrix_t tmp_trace_matrix{};
103 tmp_trace_matrix.resize(column_count, row_count);
105 score_matrix = std::move(tmp_score_matrix);
106 trace_matrix = std::move(tmp_trace_matrix);
115 return iterator{score_matrix.begin(), trace_matrix.begin()};
119 iterator
begin()
const =
delete;
124 return sentinel{score_matrix.end()};
128 sentinel
end()
const =
delete;
139 auto trace_path(matrix_coordinate
const & from_coordinate)
const
141 return trace_matrix.trace_path(from_coordinate);
156template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
157 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
158 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
159class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::iterator
163 using score_matrix_reference_type = std::ranges::range_reference_t<score_matrix_t>;
165 using trace_matrix_reference_type = std::ranges::range_reference_t<trace_matrix_t>;
167 static_assert(std::ranges::viewable_range<score_matrix_reference_type>);
168 static_assert(std::ranges::viewable_range<trace_matrix_reference_type>);
171 using combined_column_type =
172 decltype(
views::zip(std::declval<score_matrix_reference_type>(), std::declval<trace_matrix_reference_type>()));
174 using score_matrix_iter_type = std::ranges::iterator_t<score_matrix_t>;
176 using trace_matrix_iter_type = std::ranges::iterator_t<trace_matrix_t>;
179 template <std::ranges::input_range other_score_matrix_t, std::ranges::input_range other_trace_matrix_t>
180 requires (std::ranges::input_range<std::ranges::range_reference_t<other_score_matrix_t>>
181 && std::ranges::input_range<std::ranges::range_reference_t<other_trace_matrix_t>>)
182 friend class combined_score_and_trace_matrix;
185 static constexpr auto transform_to_combined_matrix_cell = std::views::transform(
188 using fwd_tuple_t =
decltype(tpl);
189 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
193 score_matrix_iter_type score_matrix_it;
195 trace_matrix_iter_type trace_matrix_it;
202 using value_type =
decltype(std::declval<combined_column_type>() | transform_to_combined_matrix_cell);
204 using reference = value_type;
206 using pointer = void;
216 iterator() =
default;
217 iterator(iterator
const &) =
default;
218 iterator(iterator &&) =
default;
219 iterator & operator=(iterator
const &) =
default;
220 iterator & operator=(iterator &&) =
default;
221 ~iterator() =
default;
228 explicit iterator(score_matrix_iter_type score_matrix_it, trace_matrix_iter_type trace_matrix_it) noexcept :
229 score_matrix_it{std::move(score_matrix_it)},
230 trace_matrix_it{std::move(trace_matrix_it)}
238 reference operator*()
const
240 return views::zip(*score_matrix_it, *trace_matrix_it) | transform_to_combined_matrix_cell;
248 iterator & operator++()
270template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
271 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
272 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
273class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::sentinel
277 using score_matrix_sentinel_type = std::ranges::sentinel_t<score_matrix_t>;
280 score_matrix_sentinel_type score_matrix_sentinel{};
286 sentinel() =
default;
287 sentinel(sentinel
const &) =
default;
288 sentinel(sentinel &&) =
default;
289 sentinel & operator=(sentinel
const &) =
default;
290 sentinel & operator=(sentinel &&) =
default;
291 ~sentinel() =
default;
297 explicit sentinel(score_matrix_sentinel_type score_matrix_sentinel) noexcept :
298 score_matrix_sentinel{std::move(score_matrix_sentinel)}
306 friend bool operator==(iterator
const & lhs, sentinel
const & rhs)
noexcept
308 return rhs.equal(lhs);
312 friend bool operator==(sentinel
const & lhs, iterator
const & rhs)
noexcept
318 friend bool operator!=(iterator
const & lhs, sentinel
const & rhs)
noexcept
320 return !(lhs == rhs);
324 friend bool operator!=(sentinel
const & lhs, iterator
const & rhs)
noexcept
326 return !(lhs == rhs);
340 constexpr bool equal(iterator
const & iter)
const noexcept
342 return iter.score_matrix_it == score_matrix_sentinel;
Provides seqan3::detail::affine_cell_proxy.
Provides various transformation traits used by the range module.
seqan::std::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:27
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
Provides concepts that do not have equivalents in C++20.
Provides seqan3::views::zip.