SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
alignment_score_matrix_one_column.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 <iterator>
13#include <ranges>
14#include <span>
15
20#include <seqan3/utility/simd/concept.hpp>
21
22namespace seqan3::detail
23{
24
38template <typename score_t>
39class alignment_score_matrix_one_column :
40 protected alignment_score_matrix_one_column_base<score_t>,
41 public alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>
42{
43private:
44 static_assert(arithmetic<score_t> || simd_concept<score_t>,
45 "The score type must be either an arithmetic type or a simd vector type.");
47 using matrix_base_t = alignment_score_matrix_one_column_base<score_t>;
49 using range_base_t = alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>;
50
52 friend range_base_t;
53
54protected:
55 using typename matrix_base_t::element_type;
56 using typename range_base_t::alignment_column_type;
58 using column_data_view_type = std::span<element_type>;
59
60 using matrix_base_t::num_cols;
61
62public:
67 using value_type = alignment_score_matrix_proxy<score_t>;
69 using reference = value_type;
71 using iterator = typename range_base_t::iterator;
73 using sentinel = typename range_base_t::sentinel;
74 using typename matrix_base_t::size_type;
75 using typename matrix_base_t::underlying_type;
77
82 constexpr alignment_score_matrix_one_column() = default;
84 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column const &) = default;
86 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column &&) = default;
88 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column const &) = default;
90 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column &&) = default;
92 ~alignment_score_matrix_one_column() = default;
93
107 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
108 constexpr alignment_score_matrix_one_column(first_sequence_t && first,
109 second_sequence_t && second,
110 score_t const initial_value = score_t{})
111 {
112 matrix_base_t::num_cols = static_cast<size_type>(std::ranges::distance(first) + 1);
113 matrix_base_t::num_rows = static_cast<size_type>(std::ranges::distance(second) + 1);
114 matrix_base_t::pool.resize(matrix_base_t::num_rows + 1, element_type{initial_value, initial_value});
115 }
117
118private:
120 constexpr alignment_column_type initialise_column(size_type const SEQAN3_DOXYGEN_ONLY(column_index)) noexcept
121 {
122 return alignment_column_type{
123 *this,
124 column_data_view_type{std::addressof(matrix_base_t::pool[0]), matrix_base_t::num_rows}};
125 }
126
128 template <std::random_access_iterator iter_t>
129 constexpr value_type make_proxy(iter_t host_iter) noexcept
130 {
131 return {std::get<0>(*host_iter), // current
132 std::get<0>(matrix_base_t::cache), // last diagonal
133 std::get<1>(*host_iter), // last left (read)
134 std::get<1>(*host_iter), // next left (write)
135 std::get<2>(matrix_base_t::cache)}; // last up
136 }
137
139 template <std::random_access_iterator iter_t>
140 constexpr void on_column_iterator_creation(iter_t host_iter) noexcept
141 {
142 // Cache the next diagonal value.
143 std::get<1>(matrix_base_t::cache) = std::get<0>(*host_iter);
144 }
145
147 template <std::random_access_iterator iter_t>
148 constexpr void before_column_iterator_increment(iter_t SEQAN3_DOXYGEN_ONLY(host_iter)) noexcept
149 {
150 // Update the last diagonal value.
151 std::get<0>(matrix_base_t::cache) = std::move(std::get<1>(matrix_base_t::cache));
152 }
153
155 template <std::random_access_iterator iter_t>
156 constexpr void after_column_iterator_increment(iter_t host_iter) noexcept
157 {
158 // Cache the next diagonal value.
159 std::get<1>(matrix_base_t::cache) = std::move(std::get<0>(*host_iter));
160 }
161};
162
163} // namespace seqan3::detail
T addressof(T... args)
Provides seqan3::detail::alignment_matrix_column_major_range_base.
Provides seqan3::detail::alignment_score_matrix_one_column_base.
Provides seqan3::detail::alignment_score_matrix_proxy.
A type that satisfies std::is_arithmetic_v<t>.
Provides concepts that do not have equivalents in C++20.
Hide me