SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
score_matrix_single_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/ranges>
16 #include <vector>
17 
25 
26 namespace seqan3::detail
27 {
28 
51 template <typename score_t>
53  requires (arithmetic<score_t> || simd_concept<score_t>)
55 class score_matrix_single_column
56 {
57 private:
59  using physical_column_t = std::vector<score_t, aligned_allocator<score_t, alignof(score_t)>>;
61  using virtual_column_t = decltype(views::repeat_n(score_t{}, 1));
62 
63  class matrix_iterator;
64 
66  physical_column_t optimal_column{};
68  physical_column_t horizontal_column{};
70  virtual_column_t vertical_column{};
72  size_t number_of_columns{};
73 
74 public:
78  score_matrix_single_column() = default;
79  score_matrix_single_column(score_matrix_single_column const &) = default;
80  score_matrix_single_column(score_matrix_single_column &&) = default;
81  score_matrix_single_column & operator=(score_matrix_single_column const &) = default;
82  score_matrix_single_column & operator=(score_matrix_single_column &&) = default;
83  ~score_matrix_single_column() = default;
84 
86 
113  template <std::integral column_index_t, std::integral row_index_t>
114  void resize(column_index_type<column_index_t> const number_of_columns,
115  row_index_type<row_index_t> const number_of_rows,
116  score_t const initial_value = score_t{})
117  {
118  this->number_of_columns = number_of_columns.get();
119  optimal_column.clear();
120  horizontal_column.clear();
121  optimal_column.resize(number_of_rows.get(), initial_value);
122  horizontal_column.resize(number_of_rows.get(), initial_value);
123  vertical_column = views::repeat_n(initial_value, number_of_rows.get());
124  }
125 
130  matrix_iterator begin()
131  {
132  return matrix_iterator{*this, 0u};
133  }
134 
136  matrix_iterator begin() const = delete;
137 
139  matrix_iterator end()
140  {
141  return matrix_iterator{*this, number_of_columns};
142  }
143 
145  matrix_iterator end() const = delete;
147 };
148 
160 template <typename score_t>
161 class score_matrix_single_column<score_t>::matrix_iterator
162 {
163 private:
164 
166  using matrix_column_t = decltype(views::zip(std::declval<physical_column_t &>(),
167  std::declval<physical_column_t &>(),
168  std::declval<virtual_column_t &>()));
169 
171  static constexpr auto transform_to_affine_cell = std::views::transform([] (auto && tpl)
172  -> affine_cell_proxy<std::remove_cvref_t<decltype(tpl)>>
173  {
174  using fwd_tuple_t = decltype(tpl);
175  return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
176  });
177 
179  score_matrix_single_column * host_ptr{nullptr};
181  size_t current_column_id{};
182 
183 public:
188  using value_type = decltype(std::declval<matrix_column_t>() | transform_to_affine_cell);
190  using reference = value_type;
192  using pointer = void;
194  using difference_type = std::ptrdiff_t;
196  using iterator_category = std::input_iterator_tag;
198 
202  matrix_iterator() noexcept = default;
203  matrix_iterator(matrix_iterator const &) noexcept = default;
204  matrix_iterator(matrix_iterator &&) noexcept = default;
205  matrix_iterator & operator=(matrix_iterator const &) noexcept = default;
206  matrix_iterator & operator=(matrix_iterator &&) noexcept = default;
207  ~matrix_iterator() = default;
208 
214  explicit matrix_iterator(score_matrix_single_column & host_matrix, size_t const initial_column_id) noexcept :
215  host_ptr{std::addressof(host_matrix)},
216  current_column_id{initial_column_id}
217  {}
219 
224  reference operator*() const
225  {
226  return views::zip(host_ptr->optimal_column, host_ptr->horizontal_column, host_ptr->vertical_column)
227  | transform_to_affine_cell;
228  }
230 
235  matrix_iterator & operator++()
236  {
237  ++current_column_id;
238  return *this;
239  }
240 
242  void operator++(int)
243  {
244  ++(*this);
245  }
247 
252  friend bool operator==(matrix_iterator const & lhs, matrix_iterator const & rhs) noexcept
253  {
254  return lhs.current_column_id == rhs.current_column_id;
255  }
256 
258  friend bool operator!=(matrix_iterator const & lhs, matrix_iterator const & rhs) noexcept
259  {
260  return !(lhs == rhs);
261  }
263 };
264 
265 } // namespace seqan3::detail
T addressof(T... args)
Provides seqan3::detail::affine_cell_proxy.
T begin(T... args)
T end(T... args)
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: traits.hpp:471
constexpr auto zip
A zip view.
Definition: zip.hpp:29
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:95
A type that satisfies std::is_arithmetic_v<t>.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
T operator!=(T... args)
Adaptations of concepts from the Ranges TS.
Provides seqan3::aligned_allocator.
Provides seqan3::simd::simd_concept.
Provides seqan3::views::repeat_n.
Provides seqan3::views::zip.