SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
combined_score_and_trace_matrix.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <seqan3/std/ranges>
16
22
23namespace seqan3::detail
24{
44template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
46 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>> &&
47 std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
49class combined_score_and_trace_matrix
50{
51private:
54
55 class iterator;
56 class sentinel;
57
59 score_matrix_t score_matrix{};
61 trace_matrix_t trace_matrix{};
62
63public:
67 combined_score_and_trace_matrix() = default;
68 combined_score_and_trace_matrix(combined_score_and_trace_matrix const &) = default;
69 combined_score_and_trace_matrix(combined_score_and_trace_matrix &&) = default;
70 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix const &) = default;
71 combined_score_and_trace_matrix & operator=(combined_score_and_trace_matrix &&) = default;
72 ~combined_score_and_trace_matrix() = default;
73
75
96 template <std::integral column_index_t, std::integral row_index_t>
97 void resize(column_index_type<column_index_t> const column_count,
98 row_index_type<row_index_t> const row_count,
99 score_type const initial_score = score_type{})
100 {
101 score_matrix_t tmp_score_matrix{};
102 tmp_score_matrix.resize(column_count, row_count, initial_score);
103
104 trace_matrix_t tmp_trace_matrix{};
105 tmp_trace_matrix.resize(column_count, row_count);
106
107 score_matrix = std::move(tmp_score_matrix);
108 trace_matrix = std::move(tmp_trace_matrix);
109 }
110
115 iterator begin()
116 {
117 return iterator{score_matrix.begin(), trace_matrix.begin()};
118 }
119
121 iterator begin() const = delete;
122
124 sentinel end()
125 {
126 return sentinel{score_matrix.end()};
127 }
128
130 sentinel end() const = delete;
132
141 auto trace_path(matrix_coordinate const & from_coordinate) const
142 {
143 return trace_matrix.trace_path(from_coordinate);
144 }
145};
146
158template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
160 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>> &&
161 std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
163class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::iterator
164{
165private:
167 using score_matrix_reference_type = std::ranges::range_reference_t<score_matrix_t>;
169 using trace_matrix_reference_type = std::ranges::range_reference_t<trace_matrix_t>;
170
171 static_assert(std::ranges::viewable_range<score_matrix_reference_type>);
172 static_assert(std::ranges::viewable_range<trace_matrix_reference_type>);
173
175 using combined_column_type = decltype(views::zip(std::declval<score_matrix_reference_type>(),
176 std::declval<trace_matrix_reference_type>()));
178 using score_matrix_iter_type = std::ranges::iterator_t<score_matrix_t>;
180 using trace_matrix_iter_type = std::ranges::iterator_t<trace_matrix_t>;
181
182 // Befriend the base class.
183 template <std::ranges::input_range other_score_matrix_t, std::ranges::input_range other_trace_matrix_t>
185 requires (std::ranges::input_range<std::ranges::range_reference_t<other_score_matrix_t>> &&
186 std::ranges::input_range<std::ranges::range_reference_t<other_trace_matrix_t>>)
188 friend class combined_score_and_trace_matrix;
189
191 static constexpr auto transform_to_combined_matrix_cell = std::views::transform([] (auto && tpl)
192 -> affine_cell_proxy<std::remove_cvref_t<decltype(tpl)>>
193 {
194 using fwd_tuple_t = decltype(tpl);
195 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
196 });
197
199 score_matrix_iter_type score_matrix_it;
201 trace_matrix_iter_type trace_matrix_it;
202
203public:
208 using value_type = decltype(std::declval<combined_column_type>() | transform_to_combined_matrix_cell);
210 using reference = value_type;
212 using pointer = void;
214 using difference_type = std::ptrdiff_t;
216 using iterator_concept = std::input_iterator_tag;
218
222 iterator() = default;
223 iterator(iterator const &) = default;
224 iterator(iterator &&) = default;
225 iterator & operator=(iterator const &) = default;
226 iterator & operator=(iterator &&) = default;
227 ~iterator() = default;
228
234 explicit iterator(score_matrix_iter_type score_matrix_it,
235 trace_matrix_iter_type trace_matrix_it) noexcept :
236 score_matrix_it{std::move(score_matrix_it)},
237 trace_matrix_it{std::move(trace_matrix_it)}
238 {}
240
245 reference operator*() const
246 {
247 return views::zip(*score_matrix_it, *trace_matrix_it) | transform_to_combined_matrix_cell;
248 }
250
255 iterator & operator++()
256 {
257 ++score_matrix_it;
258 ++trace_matrix_it;
259 return *this;
260 }
261
263 void operator++(int)
264 {
265 ++(*this);
266 }
268};
269
277template <std::ranges::input_range score_matrix_t, std::ranges::input_range trace_matrix_t>
279 requires (std::ranges::input_range<std::ranges::range_reference_t<score_matrix_t>> &&
280 std::ranges::input_range<std::ranges::range_reference_t<trace_matrix_t>>)
282class combined_score_and_trace_matrix<score_matrix_t, trace_matrix_t>::sentinel
283{
284private:
286 using score_matrix_sentinel_type = std::ranges::sentinel_t<score_matrix_t>;
287
289 score_matrix_sentinel_type score_matrix_sentinel{};
290
291public:
295 sentinel() = default;
296 sentinel(sentinel const &) = default;
297 sentinel(sentinel &&) = default;
298 sentinel & operator=(sentinel const &) = default;
299 sentinel & operator=(sentinel &&) = default;
300 ~sentinel() = default;
301
306 explicit sentinel(score_matrix_sentinel_type score_matrix_sentinel) noexcept :
307 score_matrix_sentinel{std::move(score_matrix_sentinel)}
308 {}
310
315 friend bool operator==(iterator const & lhs, sentinel const & rhs) noexcept
316 {
317 return rhs.equal(lhs);
318 }
319
321 friend bool operator==(sentinel const & lhs, iterator const & rhs) noexcept
322 {
323 return rhs == lhs;
324 }
325
327 friend bool operator!=(iterator const & lhs, sentinel const & rhs) noexcept
328 {
329 return !(lhs == rhs);
330 }
331
333 friend bool operator!=(sentinel const & lhs, iterator const & rhs) noexcept
334 {
335 return !(lhs == rhs);
336 }
338
339private:
349 constexpr bool equal(iterator const & iter) const noexcept
350 {
351 return iter.score_matrix_it == score_matrix_sentinel;
352 }
353};
354
355} // namespace seqan3::detail
Provides seqan3::detail::affine_cell_proxy.
T begin(T... args)
Provides various transformation traits used by the range module.
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
T end(T... args)
T equal(T... args)
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:471
constexpr auto zip
A zip view.
Definition: zip.hpp:29
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
T operator!=(T... args)
The <ranges> header from C++20's standard library.
Provides seqan3::views::zip.