SeqAn3 3.1.0
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
26namespace seqan3::detail
27{
28
51template <typename score_t>
53 requires (arithmetic<score_t> || simd_concept<score_t>)
55class score_matrix_single_column
56{
57private:
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
74public:
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
160template <typename score_t>
161class score_matrix_single_column<score_t>::matrix_iterator
162{
163private:
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
183public:
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.
Provides seqan3::aligned_allocator.
T begin(T... args)
T clear(T... args)
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
T end(T... args)
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:91
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)
The <ranges> header from C++20's standard library.
Provides seqan3::views::repeat_n.
Provides seqan3::simd::simd_concept.
Provides seqan3::views::zip.