SeqAn3  3.0.2
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-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
20 #include <seqan3/std/iterator>
21 #include <seqan3/std/ranges>
22 #include <seqan3/std/span>
23 
24 namespace seqan3::detail
25 {
26 
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>>
44 {
45 private:
46  static_assert(arithmetic<score_t> || simd_concept<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>>;
52 
54  friend range_base_t;
55 
56 protected:
57  using typename matrix_base_t::element_type;
58  using typename range_base_t::alignment_column_type;
60  using column_data_view_type = std::span<element_type>;
61 
62  using matrix_base_t::num_cols;
63 
64 public:
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;
79 
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;
95 
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{})
113  {
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});
117  }
119 
120 private:
122  constexpr alignment_column_type initialise_column(size_type const SEQAN3_DOXYGEN_ONLY(column_index)) noexcept
123  {
124  return alignment_column_type{*this,
125  column_data_view_type{std::addressof(matrix_base_t::pool[0]),
126  matrix_base_t::num_rows}};
127  }
128 
130  template <std::random_access_iterator iter_t>
131  constexpr value_type make_proxy(iter_t host_iter) noexcept
132  {
133  return {std::get<0>(*host_iter), // current
134  std::get<0>(matrix_base_t::cache), // last diagonal
135  std::get<1>(*host_iter), // last left (read)
136  std::get<1>(*host_iter), // next left (write)
137  std::get<2>(matrix_base_t::cache)}; // last up
138  }
139 
141  template <std::random_access_iterator iter_t>
142  constexpr void on_column_iterator_creation(iter_t host_iter) noexcept
143  {
144  // Cache the next diagonal value.
145  std::get<1>(matrix_base_t::cache) = std::get<0>(*host_iter);
146  }
147 
149  template <std::random_access_iterator iter_t>
150  constexpr void before_column_iterator_increment(iter_t SEQAN3_DOXYGEN_ONLY(host_iter)) noexcept
151  {
152  // Update the last diagonal value.
153  std::get<0>(matrix_base_t::cache) = std::move(std::get<1>(matrix_base_t::cache));
154  }
155 
157  template <std::random_access_iterator iter_t>
158  constexpr void after_column_iterator_increment(iter_t host_iter) noexcept
159  {
160  // Cache the next diagonal value.
161  std::get<1>(matrix_base_t::cache) = std::move(std::get<0>(*host_iter));
162  }
163 };
164 
165 } // namespace seqan3::detail
span
Provides std::span from the C++20 standard library.
iterator
Provides C++20 additions to the <iterator> header.
alignment_score_matrix_proxy.hpp
Provides seqan3::detail::alignment_score_matrix_proxy.
concept.hpp
Provides seqan3::simd::simd_concept.
std::addressof
T addressof(T... args)
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
core_language.hpp
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
ranges
Adaptations of concepts from the Ranges TS.
arithmetic
A type that satisfies std::is_arithmetic_v<t>.
alignment_score_matrix_one_column_base.hpp
Provides seqan3::detail::alignment_score_matrix_one_column_base.
alignment_matrix_column_major_range_base.hpp
Provides seqan3::detail::alignment_matrix_column_major_range_base.