SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
combined_score_and_trace_matrix.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <ranges>
13
19
20namespace seqan3::detail
21{
41template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
42 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
43 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
44class combined_score_and_trace_matrix
45{
46private:
49
50 class iterator;
51 class sentinel;
52
54 score_matrix_t score_matrix{};
56 trace_matrix_t trace_matrix{};
57
58public:
62 combined_score_and_trace_matrix() = default;
63 combined_score_and_trace_matrix(combined_score_and_trace_matrix const &) = default;
64 combined_score_and_trace_matrix(combined_score_and_trace_matrix &&) = default;
65 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix const &) = default;
66 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix &&) = default;
67 ~combined_score_and_trace_matrix() = default;
68
70
91 template <std::integral column_index_t, std::integral row_index_t>
92 void resize(column_index_type<column_index_t> const column_count,
93 row_index_type<row_index_t> const row_count,
94 score_type const initial_score = score_type{})
95 {
96 score_matrix_t tmp_score_matrix{};
97 tmp_score_matrix.resize(column_count, row_count, initial_score);
98
99 trace_matrix_t tmp_trace_matrix{};
100 tmp_trace_matrix.resize(column_count, row_count);
101
102 score_matrix = std::move(tmp_score_matrix);
103 trace_matrix = std::move(tmp_trace_matrix);
104 }
105
110 iterator begin()
111 {
112 return iterator{score_matrix.begin(), trace_matrix.begin()};
113 }
114
116 iterator begin() const = delete;
117
119 sentinel end()
120 {
121 return sentinel{score_matrix.end()};
122 }
123
125 sentinel end() const = delete;
127
136 auto trace_path(matrix_coordinate const & from_coordinate) const
137 {
138 return trace_matrix.trace_path(from_coordinate);
139 }
140};
141
153template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
154 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
155 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
156class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::iterator
157{
158private:
160 using score_matrix_reference_type = std::ranges::range_reference_t<score_matrix_t>;
162 using trace_matrix_reference_type = std::ranges::range_reference_t<trace_matrix_t>;
163
164 static_assert(std::ranges::viewable_range<score_matrix_reference_type>);
165 static_assert(std::ranges::viewable_range<trace_matrix_reference_type>);
166
168 using combined_column_type =
169 decltype(views::zip(std::declval<score_matrix_reference_type>(), std::declval<trace_matrix_reference_type>()));
171 using score_matrix_iter_type = std::ranges::iterator_t<score_matrix_t>;
173 using trace_matrix_iter_type = std::ranges::iterator_t<trace_matrix_t>;
174
175 // Befriend the base class.
176 template <std::ranges::input_range other_score_matrix_t, std::ranges::input_range other_trace_matrix_t>
177 requires (std::ranges::input_range<std::ranges::range_reference_t<other_score_matrix_t>>
178 && std::ranges::input_range<std::ranges::range_reference_t<other_trace_matrix_t>>)
179 friend class combined_score_and_trace_matrix;
180
182 static constexpr auto transform_to_combined_matrix_cell = std::views::transform(
183 [](auto && tpl) -> affine_cell_proxy<std::remove_cvref_t<decltype(tpl)>>
184 {
185 using fwd_tuple_t = decltype(tpl);
186 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
187 });
188
190 score_matrix_iter_type score_matrix_it;
192 trace_matrix_iter_type trace_matrix_it;
193
194public:
199 using value_type = decltype(std::declval<combined_column_type>() | transform_to_combined_matrix_cell);
201 using reference = value_type;
203 using pointer = void;
205 using difference_type = std::ptrdiff_t;
207 using iterator_concept = std::input_iterator_tag;
209
213 iterator() = default;
214 iterator(iterator const &) = default;
215 iterator(iterator &&) = default;
216 iterator & operator=(iterator const &) = default;
217 iterator & operator=(iterator &&) = default;
218 ~iterator() = default;
219
225 explicit iterator(score_matrix_iter_type score_matrix_it, trace_matrix_iter_type trace_matrix_it) noexcept :
226 score_matrix_it{std::move(score_matrix_it)},
227 trace_matrix_it{std::move(trace_matrix_it)}
228 {}
230
235 reference operator*() const
236 {
237 return views::zip(*score_matrix_it, *trace_matrix_it) | transform_to_combined_matrix_cell;
238 }
240
245 iterator & operator++()
246 {
247 ++score_matrix_it;
248 ++trace_matrix_it;
249 return *this;
250 }
251
253 void operator++(int)
254 {
255 ++(*this);
256 }
258};
259
267template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
268 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>>
269 && std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
270class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::sentinel
271{
272private:
274 using score_matrix_sentinel_type = std::ranges::sentinel_t<score_matrix_t>;
275
277 score_matrix_sentinel_type score_matrix_sentinel{};
278
279public:
283 sentinel() = default;
284 sentinel(sentinel const &) = default;
285 sentinel(sentinel &&) = default;
286 sentinel & operator=(sentinel const &) = default;
287 sentinel & operator=(sentinel &&) = default;
288 ~sentinel() = default;
289
294 explicit sentinel(score_matrix_sentinel_type score_matrix_sentinel) noexcept :
295 score_matrix_sentinel{std::move(score_matrix_sentinel)}
296 {}
298
303 friend bool operator==(iterator const & lhs, sentinel const & rhs) noexcept
304 {
305 return rhs.equal(lhs);
306 }
307
309 friend bool operator==(sentinel const & lhs, iterator const & rhs) noexcept
310 {
311 return rhs == lhs;
312 }
313
315 friend bool operator!=(iterator const & lhs, sentinel const & rhs) noexcept
316 {
317 return !(lhs == rhs);
318 }
319
321 friend bool operator!=(sentinel const & lhs, iterator const & rhs) noexcept
322 {
323 return !(lhs == rhs);
324 }
326
327private:
337 constexpr bool equal(iterator const & iter) const noexcept
338 {
339 return iter.score_matrix_it == score_matrix_sentinel;
340 }
341};
342
343} // namespace seqan3::detail
Provides seqan3::detail::affine_cell_proxy.
T begin(T... args)
Provides various transformation traits used by the range module.
T end(T... args)
T equal(T... args)
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
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
T operator!=(T... args)
Provides concepts that do not have equivalents in C++20.
Provides seqan3::views::zip.
Hide me