SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
alignment_score_matrix_one_column.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/iterator>
16#include <seqan3/std/ranges>
17#include <seqan3/std/span>
18
24
25namespace seqan3::detail
26{
27
41template <typename score_t>
42class alignment_score_matrix_one_column :
43 protected alignment_score_matrix_one_column_base<score_t>,
44 public alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>
45{
46private:
47 static_assert(arithmetic<score_t> || simd_concept<score_t>,
48 "The score type must be either an arithmetic type or a simd vector type.");
50 using matrix_base_t = alignment_score_matrix_one_column_base<score_t>;
52 using range_base_t = alignment_matrix_column_major_range_base<alignment_score_matrix_one_column<score_t>>;
53
55 friend range_base_t;
56
57protected:
58 using typename matrix_base_t::element_type;
59 using typename range_base_t::alignment_column_type;
61 using column_data_view_type = std::span<element_type>;
62
63 using matrix_base_t::num_cols;
64
65public:
70 using value_type = alignment_score_matrix_proxy<score_t>;
72 using reference = value_type;
74 using iterator = typename range_base_t::iterator;
76 using sentinel = typename range_base_t::sentinel;
77 using typename matrix_base_t::size_type;
78 using typename matrix_base_t::underlying_type;
80
85 constexpr alignment_score_matrix_one_column() = default;
87 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column const &) = default;
89 constexpr alignment_score_matrix_one_column(alignment_score_matrix_one_column &&) = default;
91 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column const &) = default;
93 constexpr alignment_score_matrix_one_column & operator=(alignment_score_matrix_one_column &&) = default;
95 ~alignment_score_matrix_one_column() = default;
96
110 template <std::ranges::forward_range first_sequence_t, std::ranges::forward_range second_sequence_t>
111 constexpr alignment_score_matrix_one_column(first_sequence_t && first,
112 second_sequence_t && second,
113 score_t const initial_value = score_t{})
114 {
115 matrix_base_t::num_cols = static_cast<size_type>(std::ranges::distance(first) + 1);
116 matrix_base_t::num_rows = static_cast<size_type>(std::ranges::distance(second) + 1);
117 matrix_base_t::pool.resize(matrix_base_t::num_rows + 1, element_type{initial_value, initial_value});
118 }
120
121private:
123 constexpr alignment_column_type initialise_column(size_type const SEQAN3_DOXYGEN_ONLY(column_index)) noexcept
124 {
125 return alignment_column_type{*this,
126 column_data_view_type{std::addressof(matrix_base_t::pool[0]),
127 matrix_base_t::num_rows}};
128 }
129
131 template <std::random_access_iterator iter_t>
132 constexpr value_type make_proxy(iter_t host_iter) noexcept
133 {
134 return {std::get<0>(*host_iter), // current
135 std::get<0>(matrix_base_t::cache), // last diagonal
136 std::get<1>(*host_iter), // last left (read)
137 std::get<1>(*host_iter), // next left (write)
138 std::get<2>(matrix_base_t::cache)}; // last up
139 }
140
142 template <std::random_access_iterator iter_t>
143 constexpr void on_column_iterator_creation(iter_t host_iter) noexcept
144 {
145 // Cache the next diagonal value.
146 std::get<1>(matrix_base_t::cache) = std::get<0>(*host_iter);
147 }
148
150 template <std::random_access_iterator iter_t>
151 constexpr void before_column_iterator_increment(iter_t SEQAN3_DOXYGEN_ONLY(host_iter)) noexcept
152 {
153 // Update the last diagonal value.
154 std::get<0>(matrix_base_t::cache) = std::move(std::get<1>(matrix_base_t::cache));
155 }
156
158 template <std::random_access_iterator iter_t>
159 constexpr void after_column_iterator_increment(iter_t host_iter) noexcept
160 {
161 // Cache the next diagonal value.
162 std::get<1>(matrix_base_t::cache) = std::move(std::get<0>(*host_iter));
163 }
164};
165
166} // 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.
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
A type that satisfies std::is_arithmetic_v<t>.
The <iterator> header from C++20's standard library.
The <ranges> header from C++20's standard library.
Provides std::span from the C++20 standard library.
Provides seqan3::simd::simd_concept.