SeqAn3  3.0.3
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 
25 namespace seqan3::detail
26 {
27 
41 template <typename score_t>
42 class 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 {
46 private:
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 
57 protected:
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 
65 public:
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 
121 private:
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).
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
A type that satisfies std::is_arithmetic_v<t>.
Provides C++20 additions to the <iterator> header.
Adaptations of concepts from the Ranges TS.
Provides std::span from the C++20 standard library.
Provides seqan3::simd::simd_concept.