SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
type_traits.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 <type_traits>
17
41
42namespace seqan3::detail
43{
44
45//------------------------------------------------------------------------------
46// chunked_indexed_sequence_pairs
47//------------------------------------------------------------------------------
48
61template <typename sequence_pairs_t>
63 requires sequence_pair_range<std::remove_reference_t<sequence_pairs_t>>
65struct chunked_indexed_sequence_pairs
66{
68 using type = decltype(views::zip(std::declval<sequence_pairs_t>(), std::views::iota(0)) | views::chunk(1));
69};
70
71//------------------------------------------------------------------------------
72// alignment_configuration_traits
73//------------------------------------------------------------------------------
74
82template <typename configuration_t>
84 requires is_type_specialisation_of_v<std::remove_cv_t<configuration_t>, configuration>
86struct alignment_configuration_traits
87{
88private:
99 template <arithmetic score_t>
100 using select_scalar_index_t = min_viable_uint_t<1ull << (bits_of<score_t> - 1)>;
101
103 static constexpr auto determine_alignment_result_type() noexcept
104 {
105 if constexpr (configuration_t::template exists<align_cfg::detail::result_type>())
106 {
107 using result_type_cfg_t =
109 decltype(seqan3::get<align_cfg::detail::result_type>(std::declval<configuration_t>()))
110 >;
111 return typename result_type_cfg_t::type{}; // Access the stored result_type.
112 }
113 else
114 {
115 return empty_type{};
116 }
117 }
118
119public:
121 static constexpr bool is_vectorised = configuration_t::template exists<align_cfg::vectorised>();
123 static constexpr bool is_parallel = configuration_t::template exists<align_cfg::parallel>();
125 static constexpr bool is_global =
126 configuration_t::template exists<seqan3::align_cfg::method_global>();
128 static constexpr bool is_local = configuration_t::template exists<seqan3::align_cfg::method_local>();
130 static constexpr bool is_banded = configuration_t::template exists<align_cfg::band_fixed_size>();
132 static constexpr bool is_debug = configuration_t::template exists<detail::debug_mode>();
134 static constexpr bool is_one_way_execution = configuration_t::template exists<align_cfg::on_result>();
136 using scoring_scheme_type = decltype(get<align_cfg::scoring_scheme>(std::declval<configuration_t>()).scheme);
138 using scoring_scheme_alphabet_type = typename scoring_scheme_type::alphabet_type;
140 using original_score_type = typename std::remove_reference_t<decltype(
141 std::declval<configuration_t>().get_or(align_cfg::score_type<int32_t>{}))>::type;
143 using score_type = std::conditional_t<is_vectorised, simd_type_t<original_score_type>, original_score_type>;
145 using trace_type = std::conditional_t<is_vectorised, simd_type_t<original_score_type>, trace_directions>;
147 using alignment_result_type = decltype(determine_alignment_result_type());
149 using matrix_index_type = std::conditional_t<is_vectorised,
150 simd_type_t<select_scalar_index_t<original_score_type>>,
151 size_t>;
153 using matrix_coordinate_type = lazy_conditional_t<is_vectorised,
154 lazy<simd_matrix_coordinate, matrix_index_type>,
155 matrix_coordinate>;
156
158 static constexpr size_t alignments_per_vector = [] () constexpr
159 {
160 if constexpr (is_vectorised)
161 return simd_traits<score_type>::length;
162 else
163 return 1;
164 }();
166 static constexpr bool compute_score = configuration_t::template exists<align_cfg::output_score>();
168 static constexpr bool compute_end_positions =
169 configuration_t::template exists<align_cfg::output_end_position>();
171 static constexpr bool compute_begin_positions =
172 configuration_t::template exists<align_cfg::output_begin_position>();
174 static constexpr bool compute_sequence_alignment =
175 configuration_t::template exists<align_cfg::output_alignment>();
177 static constexpr bool output_sequence1_id =
178 configuration_t::template exists<align_cfg::output_sequence1_id>();
180 static constexpr bool output_sequence2_id =
181 configuration_t::template exists<align_cfg::output_sequence2_id>();
183 static constexpr bool has_output_configuration = compute_score ||
184 compute_end_positions ||
185 compute_begin_positions ||
186 compute_sequence_alignment ||
187 output_sequence1_id ||
188 output_sequence2_id;
190 static constexpr bool requires_trace_information = compute_begin_positions || compute_sequence_alignment;
191};
192
193//------------------------------------------------------------------------------
194// alignment_function_traits
195//------------------------------------------------------------------------------
196
202template <typename function_t>
203struct alignment_function_traits
204{
206 using sequence_input_type = typename function_traits<function_t>::template argument_type_at<0>;
208 using callback_type = typename function_traits<function_t>::template argument_type_at<1>;
210 using alignment_result_type = typename function_traits<callback_type>::template argument_type_at<0>;
211};
212
213} // namespace seqan3::detail
Provides seqan3::detail::align_config_band.
Provides seqan3::align_cfg::detail::debug.
Provides global and local alignment configurations.
Provides seqan3::align_cfg::on_result.
Provides configuration for alignment output.
Provides seqan3::align_cfg::parallel configuration.
Provides seqan3::align_cfg::detail::result_type.
Provides alignment configuration seqan3::align_cfg::score_type.
Provides seqan3::align_cfg::scoring_scheme.
Provides seqan3::align_cfg::vectorised configuration.
Provides concepts needed internally for the alignment algorithms.
Provides utility functions for bit twiddling.
Provides seqan3::views::chunk.
Provides seqan3::configuration and utility functions.
Provides seqan3::detail::empty_type.
Provides various type traits for use on functions.
constexpr auto chunk
A chunk view.
Definition: chunk.hpp:29
constexpr auto zip
A zip view.
Definition: zip.hpp:29
Provides lazy template instantiation traits.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
The <ranges> header from C++20's standard library.
Provides seqan3::simd::simd_type.
Provides seqan3::simd::simd_traits.
Provides type traits for working with templates.
Provides the declaration of seqan3::detail::trace_directions.
Provides seqan3::views::zip.