42 #include <meta/meta.hpp> 66 enum struct id : uint8_t
98 #define SEQAN3_INVALID_CONFIG(e) "Configuration error: The configuration <" #e "> is not combinable with " \ 99 "one of the previous config elements. Please see the documentation to get "\ 100 "more information about which configurations can be combined." 132 template <align_cfg::
id e>
133 struct on_align_config
138 template <config_element_concept t>
139 using invoke = std::false_type;
151 template <config_element_concept config_element_t>
152 struct align_config_type_to_id
160 template <config_element_concept config_element_t>
161 inline constexpr
align_cfg::id align_config_type_to_id_v = align_config_type_to_id<config_element_t>::value;
177 inline constexpr std::array<std::array<bool, static_cast<uint8_t>(align_cfg::id::SIZE)>,
178 static_cast<uint8_t>(align_cfg::id::SIZE)> align_config_validation_matrix =
181 { {
false,
true,
true,
true,
true,
true,
true },
182 {
true,
false,
true,
true,
true,
true,
true },
183 {
true,
true,
false,
true,
true,
true,
true },
184 {
true,
true,
true,
false,
true,
true,
true },
185 {
true,
true,
true,
true,
false,
true,
true },
186 {
true,
true,
true,
true,
true,
false,
true },
187 {
true,
true,
true,
true,
true,
true,
false } }
200 template <align_cfg::
id query,
typename configuration_t>
202 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
204 struct invalid_alignment_configuration
211 template <
typename target_t>
215 static constexpr uint8_t pos1 =
static_cast<uint8_t
>(query);
217 static constexpr uint8_t pos2 =
static_cast<uint8_t
>(align_config_type_to_id_v<remove_cvref_t<target_t>>);
219 static_assert(pos1 != static_cast<uint8_t>(align_cfg::id::SIZE),
220 "Unknown align_cfg::id! " 221 "Did you use an unknown config or did you forget to specialize align_config_type_to_id?");
222 static_assert(pos2 != static_cast<uint8_t>(align_cfg::id::SIZE),
223 "Unknown align_cfg::id! " 224 "Did you use an unknown config or did you forget to specialize align_config_type_to_id?");
227 using type = std::conditional_t<align_config_validation_matrix[pos1][pos2], std::false_type, std::true_type>;
231 using target_list_t = tuple_type_list_t<typename remove_cvref_t<configuration_t>::base_type>;
233 using tail_list_t = meta::find_if<meta::reverse<target_list_t>, meta::quote_trait<invoke>>;
235 using final_list_t = std::conditional_t<meta::empty<tail_list_t>::value,
type_list<void>, tail_list_t>;
240 using type = meta::front<final_list_t>;
245 template <align_cfg::
id query,
typename configuration_t>
247 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
249 using invalid_alignment_configuration_t =
typename invalid_alignment_configuration<query, configuration_t>::type;
260 template <align_cfg::
id query,
typename configuration_t>
262 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
264 struct is_valid_alignment_configuration :
265 public std::is_same<invalid_alignment_configuration_t<query, configuration_t>, void>
270 template <align_cfg::
id query,
typename configuration_t>
272 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
274 inline constexpr
bool is_valid_alignment_configuration_v =
275 is_valid_alignment_configuration<query, configuration_t>::value;
284 template <align_cfg::
id e,
typename configuration_t>
286 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
292 using target_list_t = tuple_type_list_t<typename remove_cvref_t<configuration_t>::base_type>;
294 using tail_list_t = meta::find_if<target_list_t, on_align_config<e>>;
301 using type = std::conditional_t<(meta::size<tail_list_t>::value > 0),
305 static constexpr
bool value = type::value;
314 template <align_cfg::
id e,
typename configuration_t>
316 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
318 inline constexpr
bool has_align_cfg_v = has_align_cfg<e, configuration_t>::value;
342 requires detail::has_align_cfg_v<e, detail::configuration<cfg_elements_t...>>
344 constexpr
auto &
get(detail::configuration<cfg_elements_t...> & cfg) noexcept
346 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
348 constexpr
size_t pos = meta::size<type_list_t>::value -
349 meta::size<meta::find_if<type_list_t, detail::on_align_config<e>>>::value;
351 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(align_cfg::id::SIZE),
352 "Did you forget to update align_cfg::id::SIZE value?");
353 static_assert(pos < meta::size<type_list_t>::value,
354 "The specified config element is not contained in the configuration.");
356 return get<pos>(cfg).value;
362 requires detail::has_align_cfg_v<e, detail::configuration<cfg_elements_t...>>
364 constexpr
auto const &
get(detail::configuration<cfg_elements_t...>
const & cfg) noexcept
366 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
367 constexpr
size_t pos = meta::size<type_list_t>::value -
368 meta::size<meta::find_if<type_list_t, detail::on_align_config<e>>>::value;
370 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(align_cfg::id::SIZE),
371 "Did you forget to update align_cfg::id::SIZE value?");
372 static_assert(pos < meta::size<type_list_t>::value,
373 "The specified config element is not contained in the configuration.");
375 return get<pos>(cfg).value;
381 requires detail::has_align_cfg_v<e, detail::configuration<cfg_elements_t...>>
383 constexpr
auto &&
get(detail::configuration<cfg_elements_t...> && cfg) noexcept
385 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
386 constexpr
size_t pos = meta::size<type_list_t>::value -
387 meta::size<meta::find_if<type_list_t, detail::on_align_config<e>>>::value;
389 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(align_cfg::id::SIZE),
390 "Did you forget to update align_cfg::id::SIZE value?");
391 static_assert(pos < meta::size<type_list_t>::value,
392 "The specified config element is not contained in the configuration.");
394 return get<pos>(std::move(cfg)).value;
400 requires detail::has_align_cfg_v<e, detail::configuration<cfg_elements_t...>>
402 constexpr
auto const &&
get(detail::configuration<cfg_elements_t...>
const && cfg) noexcept
404 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
405 constexpr
size_t pos = meta::size<type_list_t>::value -
406 meta::size<meta::find_if<type_list_t, detail::on_align_config<e>>>::value;
408 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(align_cfg::id::SIZE),
409 "Did you forget to update align_cfg::id::SIZE value?");
410 static_assert(pos < meta::size<type_list_t>::value,
411 "The specified config element is not contained in the configuration.");
413 return std::move(get<pos>(cfg).value);
Identifier for global alignment configuration.
Identifier for output configuration.
Identifier for free ends configuration.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
A special sub namespace for the alignment configurations.
Definition: align_config_band.hpp:151
Identifier for max_error configuration.
Identifier for score configuration.
Identifier for gap configuration.
Definition: aligned_sequence_concept.hpp:288
id
Specifies an id for every configuration element.
Definition: utility.hpp:66
meta::list< types... > type_list
Type that contains multiple types, an alias for meta::list.
Definition: type_list.hpp:54
Provides seqan3::detail::configuration and utility functions.
Static reflection for arbitrary types.