28 namespace seqan3::detail
49 template <
typename trace_t>
51 requires std::same_as<trace_t, trace_directions>
53 class trace_matrix_full
57 using matrix_t = two_dimensional_matrix<trace_t,
58 aligned_allocator<trace_t,
sizeof(trace_t)>,
59 matrix_major_order::column>;
68 matrix_t complete_matrix{};
70 physical_column_t horizontal_column{};
72 virtual_column_t vertical_column{};
74 size_t column_count{};
82 trace_matrix_full() =
default;
83 trace_matrix_full(trace_matrix_full
const &) =
default;
84 trace_matrix_full(trace_matrix_full &&) =
default;
85 trace_matrix_full & operator=(trace_matrix_full
const &) =
default;
86 trace_matrix_full & operator=(trace_matrix_full &&) =
default;
87 ~trace_matrix_full() =
default;
112 template <std::
integral column_index_t, std::
integral row_index_t>
113 void resize(column_index_type<column_index_t>
const column_count,
114 row_index_type<row_index_t>
const row_count)
116 this->column_count = column_count.get();
117 this->row_count = row_count.get();
118 complete_matrix.resize(number_rows{this->row_count}, number_cols{this->column_count});
119 horizontal_column.resize(this->row_count);
129 return iterator{*
this, 0u};
133 iterator
begin()
const =
delete;
138 return iterator{*
this, column_count};
142 iterator
end()
const =
delete;
155 template <
typename trace_t>
157 requires std::same_as<trace_t, trace_directions>
159 class trace_matrix_full<trace_t>::iterator
165 using matrix_column_type = decltype(views::zip(std::declval<single_trace_column_type>(),
166 std::declval<physical_column_t &>(),
167 std::declval<virtual_column_t &>()));
175 trace_matrix_full * host_ptr{
nullptr};
177 size_t current_column_id{};
183 using value_type = matrix_column_value_t;
186 using reference = column_proxy;
188 using pointer = void;
198 iterator() noexcept = default;
199 iterator(iterator const &) noexcept = default;
200 iterator(iterator &&) noexcept = default;
201 iterator & operator=(iterator const &) noexcept = default;
202 iterator & operator=(iterator &&) noexcept = default;
203 ~iterator() = default;
210 explicit iterator(trace_matrix_full & host_matrix,
size_t const initial_column_id) noexcept :
212 current_column_id{initial_column_id}
219 reference operator*()
const
222 auto column_begin = host_ptr->complete_matrix.data() + current_column_id * host_ptr->row_count;
223 single_trace_column_type single_trace_column{column_begin, column_begin + host_ptr->row_count};
225 return column_proxy{views::zip(
std::move(single_trace_column),
226 host_ptr->horizontal_column,
227 host_ptr->vertical_column)};
234 iterator & operator++()
251 friend bool operator==(iterator
const & lhs, iterator
const & rhs) noexcept
254 return lhs.current_column_id == rhs.current_column_id;
258 friend bool operator!=(iterator
const & lhs, iterator
const & rhs) noexcept
260 return !(lhs == rhs);
273 template <
typename trace_t>
275 requires std::same_as<trace_t, trace_directions>
277 class trace_matrix_full<trace_t>::iterator::column_proxy :
public std::ranges::view_interface<column_proxy>
281 matrix_column_type column;
287 column_proxy() noexcept = default;
288 column_proxy(column_proxy const &) noexcept = default;
289 column_proxy(column_proxy &&) noexcept = default;
290 column_proxy & operator=(column_proxy const &) noexcept = default;
291 column_proxy & operator=(column_proxy &&) noexcept = default;
292 ~column_proxy() = default;
298 explicit column_proxy(matrix_column_type && column) noexcept : column{
std::move(column)}
305 std::ranges::iterator_t<matrix_column_type>
begin()
308 return column.begin();
311 std::ranges::iterator_t<matrix_column_type>
begin()
const =
delete;
314 std::ranges::sentinel_t<matrix_column_type>
end()
320 std::ranges::sentinel_t<matrix_column_type>
end()
const =
delete;
324 constexpr
operator matrix_column_value_t()
const
326 matrix_column_value_t target{};
327 std::ranges::copy(column, std::cpp20::back_inserter(target));