24 namespace seqan3::detail
40 template <
typename score_t>
41 class alignment_score_matrix_one_column :
42 protected alignment_score_matrix_one_column_base<score_t>,
43 public alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>
47 "The score type must be either an arithmetic type or a simd vector type.");
49 using matrix_base_t = alignment_score_matrix_one_column_base<score_t>;
51 using range_base_t = alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>;
57 using typename matrix_base_t::element_type;
58 using typename range_base_t::alignment_column_type;
62 using matrix_base_t::num_cols;
68 using value_type = alignment_score_matrix_proxy<score_t>;
71 using reference = value_type;
73 using iterator =
typename range_base_t::iterator;
75 using sentinel =
typename range_base_t::sentinel;
76 using typename matrix_base_t::size_type;
77 using typename matrix_base_t::underlying_type;
83 constexpr alignment_score_matrix_one_column() =
default;
86 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column
const &) =
default;
88 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column &&) =
default;
90 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column
const &) =
default;
92 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column &&) =
default;
94 ~alignment_score_matrix_one_column() =
default;
109 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
110 constexpr alignment_score_matrix_one_column(first_sequence_t && first,
111 second_sequence_t && second,
112 score_t
const initial_value = score_t{})
114 matrix_base_t::num_cols =
static_cast<size_type
>(std::ranges::distance(first) + 1);
115 matrix_base_t::num_rows =
static_cast<size_type
>(std::ranges::distance(second) + 1);
116 matrix_base_t::pool.resize(matrix_base_t::num_rows + 1, element_type{initial_value, initial_value});
122 constexpr alignment_column_type initialise_column(size_type
const SEQAN3_DOXYGEN_ONLY(column_index)) noexcept
124 return alignment_column_type{*
this,
126 matrix_base_t::num_rows}};
130 template <std::random_access_iterator iter_t>
131 constexpr value_type make_proxy(iter_t host_iter) noexcept
133 return {std::get<0>(*host_iter),
134 std::get<0>(matrix_base_t::cache),
135 std::get<1>(*host_iter),
136 std::get<1>(*host_iter),
137 std::get<2>(matrix_base_t::cache)};
141 template <std::random_access_iterator iter_t>
142 constexpr
void on_column_iterator_creation(iter_t host_iter) noexcept
145 std::get<1>(matrix_base_t::cache) = std::get<0>(*host_iter);
149 template <std::random_access_iterator iter_t>
150 constexpr
void before_column_iterator_increment(iter_t SEQAN3_DOXYGEN_ONLY(host_iter)) noexcept
153 std::get<0>(matrix_base_t::cache) =
std::move(std::get<1>(matrix_base_t::cache));
157 template <std::random_access_iterator iter_t>
158 constexpr
void after_column_iterator_increment(iter_t host_iter) noexcept
161 std::get<1>(matrix_base_t::cache) =
std::move(std::get<0>(*host_iter));