42 #include <meta/meta.hpp> 68 enum struct id : uint8_t
116 template <search_cfg::
id e>
117 struct on_search_config
122 template <config_element_concept t>
123 using invoke = std::false_type;
135 template <config_element_concept config_element_t>
136 struct search_config_type_to_id
144 template <config_element_concept config_element_t>
145 inline constexpr
search_cfg::id search_config_type_to_id_v = search_config_type_to_id<config_element_t>::value;
161 inline constexpr std::array<std::array<bool, static_cast<uint8_t>(search_cfg::id::SIZE)>,
162 static_cast<uint8_t>(search_cfg::id::SIZE)> search_config_validation_matrix =
183 template <search_cfg::
id query,
typename configuration_t>
185 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
187 struct invalid_search_configuration
194 template <
typename target_t>
198 static constexpr uint8_t pos1 =
static_cast<uint8_t
>(query);
200 static constexpr uint8_t pos2 =
static_cast<uint8_t
>(search_config_type_to_id_v<remove_cvref_t<target_t>>);
202 static_assert(pos1 != static_cast<uint8_t>(search_cfg::id::SIZE),
203 "Unknown search_cfg::id! " 204 "Did you use an unknown config or did you forget to specialize search_config_type_to_id?");
205 static_assert(pos2 != static_cast<uint8_t>(search_cfg::id::SIZE),
206 "Unknown search_cfg::id! " 207 "Did you use an unknown config or did you forget to specialize search_config_type_to_id?");
210 using type = std::conditional_t<search_config_validation_matrix[pos1][pos2], std::false_type, std::true_type>;
214 using target_list_t = tuple_type_list_t<typename remove_cvref_t<configuration_t>::base_type>;
216 using tail_list_t = meta::find_if<meta::reverse<target_list_t>, meta::quote_trait<invoke>>;
218 using final_list_t = std::conditional_t<meta::empty<tail_list_t>::value,
type_list<void>, tail_list_t>;
223 using type = meta::front<final_list_t>;
228 template <search_cfg::
id query,
typename configuration_t>
230 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
232 using invalid_search_configuration_t =
typename invalid_search_configuration<query, configuration_t>::type;
243 template <search_cfg::
id query,
typename configuration_t>
245 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
247 struct is_valid_search_configuration :
248 public std::is_same<invalid_search_configuration_t<query, configuration_t>, void>
253 template <search_cfg::
id query,
typename configuration_t>
255 requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
257 inline constexpr
bool is_valid_search_configuration_v =
258 is_valid_search_configuration<query, configuration_t>::value;
269 constexpr
bool contains(detail::configuration<cfg_elements_t...> & cfg) noexcept
271 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
273 constexpr
size_t pos = meta::size<type_list_t>::value -
274 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
276 return pos < meta::size<type_list_t>::value;
280 constexpr
bool contains(detail::configuration<cfg_elements_t...>
const &) noexcept
282 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
284 constexpr
size_t pos = meta::size<type_list_t>::value -
285 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
287 return pos < meta::size<type_list_t>::value;
291 constexpr
bool contains(detail::configuration<cfg_elements_t...> && cfg) noexcept
293 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
295 constexpr
size_t pos = meta::size<type_list_t>::value -
296 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
298 return pos < meta::size<type_list_t>::value;
302 constexpr
bool contains(detail::configuration<cfg_elements_t...>
const && cfg) noexcept
304 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
306 constexpr
size_t pos = meta::size<type_list_t>::value -
307 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
309 return pos < meta::size<type_list_t>::value;
329 constexpr
auto &
get(detail::configuration<cfg_elements_t...> & cfg) noexcept
331 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
333 constexpr
size_t pos = meta::size<type_list_t>::value -
334 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
336 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(search_cfg::id::SIZE),
337 "Did you forget to update search_cfg::id::SIZE value?");
338 static_assert(pos < meta::size<type_list_t>::value,
339 "The specified config element is not contained in the configuration.");
341 return get<pos>(cfg).value;
354 constexpr
auto const &
get(detail::configuration<cfg_elements_t...>
const & cfg) noexcept
356 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
357 constexpr
size_t pos = meta::size<type_list_t>::value -
358 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
360 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(search_cfg::id::SIZE),
361 "Did you forget to update search_cfg::id::SIZE value?");
362 static_assert(pos < meta::size<type_list_t>::value,
363 "The specified config element is not contained in the configuration.");
365 return get<pos>(cfg).value;
378 constexpr
auto &&
get(detail::configuration<cfg_elements_t...> && cfg) noexcept
380 using type_list_t = detail::tuple_type_list_t<
typename detail::configuration<cfg_elements_t...>::base_type>;
381 constexpr
size_t pos = meta::size<type_list_t>::value -
382 meta::size<meta::find_if<type_list_t, detail::on_search_config<e>>>::value;
384 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(search_cfg::id::SIZE),
385 "Did you forget to update search_cfg::id::SIZE value?");
386 static_assert(pos < meta::size<type_list_t>::value,
387 "The specified config element is not contained in the configuration.");
389 return get<pos>(std::move(cfg)).value;
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_search_config<e>>>::value;
408 static_assert(static_cast<int8_t>(e) < static_cast<int8_t>(search_cfg::id::SIZE),
409 "Did you forget to update search_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.");
414 return std::move(get<pos>(std::move(cfg)).value);
constexpr detail::search_config_max_error_rate_adaptor max_error_rate
A configuration element for the maximum number of errors in percent of the query length across all er...
Definition: max_error_rate.hpp:176
A special sub namespace for the search configurations.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
Provides functionality to access get function by enum values.
id
Specifies an id for every configuration element.
Definition: utility.hpp:68
Definition: aligned_sequence_concept.hpp:288
detail::search_config_mode_adaptor< seqan3::detail::search_config_mode > constexpr mode
Configuration element to determine the search mode.
Definition: mode.hpp:150
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.
Identifier for max_errors configuration.