SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
type_traits.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 
15 #include <type_traits>
16 
40 #include <seqan3/std/ranges>
41 
42 namespace seqan3::detail
43 {
44 
45 //------------------------------------------------------------------------------
46 // chunked_indexed_sequence_pairs
47 //------------------------------------------------------------------------------
48 
61 template <typename sequence_pairs_t>
63  requires sequence_pair_range<std::remove_reference_t<sequence_pairs_t>>
65 struct 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 
82 template <typename configuration_t>
84  requires is_type_specialisation_of_v<std::remove_cv_t<configuration_t>, configuration>
86 struct alignment_configuration_traits
87 {
88 private:
99  template <arithmetic score_t>
100  using select_scalar_index_t = min_viable_uint_t<1ull << (sizeof_bits<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 
119 public:
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 original_score_type padding_symbol =
191  static_cast<original_score_type>(1u << (sizeof_bits<original_score_type> - 1));
192 };
193 
194 //------------------------------------------------------------------------------
195 // alignment_function_traits
196 //------------------------------------------------------------------------------
197 
203 template <typename function_t>
204 struct alignment_function_traits
205 {
207  using sequence_input_type = typename function_traits<function_t>::template argument_type_at<0>;
209  using callback_type = typename function_traits<function_t>::template argument_type_at<1>;
211  using alignment_result_type = typename function_traits<callback_type>::template argument_type_at<0>;
212 };
213 
214 } // namespace seqan3::detail
matrix_coordinate.hpp
Provides seqan3::detail::alignment_coordinate and associated strong types.
function.hpp
Provides various type traits for use on functions.
zip.hpp
Provides seqan3::views::zip.
bit_manipulation.hpp
Provides utility functions for bit twiddling.
align_config_vectorised.hpp
Provides seqan3::align_cfg::vectorised configuration.
align_config_method.hpp
Provides global and local alignment configurations.
align_config_result_type.hpp
Provides seqan3::align_cfg::detail::result_type.
align_config_scoring_scheme.hpp
Provides seqan3::align_cfg::scoring_scheme.
configuration.hpp
Provides seqan3::detail::configuration and utility functions.
align_config_on_result.hpp
Provides seqan3::align_cfg::on_result.
template_inspection.hpp
Provides seqan3::type_list and auxiliary type traits.
chunk.hpp
Provides seqan3::views::chunk.
trace_directions.hpp
Provides the declaration of seqan3::detail::trace_directions.
simd.hpp
Provides seqan3::simd::simd_type.
align_config_band.hpp
Provides seqan3::detail::align_config_band.
simd_traits.hpp
Provides seqan3::simd::simd_traits.
align_config_output.hpp
Provides configuration for alignment output.
concept.hpp
Provides concepts needed internally for the alignment algorithms.
ranges
Adaptations of concepts from the Ranges TS.
std::remove_reference_t
empty_type.hpp
Provides seqan3::detail::empty_type.
align_config_parallel.hpp
Provides seqan3::align_cfg::parallel configuration.
align_config_score_type.hpp
Provides alignment configuration seqan3::align_cfg::score_type.
std::remove_cvref_t
std::conditional_t
lazy.hpp
Provides lazy template instantiation traits.
align_config_debug.hpp
Provides seqan3::align_cfg::detail::debug.