43 template <detail::config_element... configs_t>
47 template <detail::config_element... _configs_t>
71 template <
typename config_element_t>
73 && detail::config_element<std::remove_cvref_t<config_element_t>>
75 base_type{
std::forward<config_element_t>(config_element)}
84 constexpr
size_t size() const noexcept
86 return std::tuple_size_v<base_type>;
119 template <
typename alternative_t>
120 constexpr decltype(
auto)
get_or(alternative_t && alternative) & noexcept
122 return get_or_impl(*
this, alternative, std::forward<alternative_t>(alternative));
126 template <
typename alternative_t>
127 constexpr decltype(
auto)
get_or(alternative_t && alternative) const & noexcept
129 return get_or_impl(*
this, alternative, std::forward<alternative_t>(alternative));
133 template <
typename alternative_t>
134 constexpr decltype(
auto)
get_or(alternative_t && alternative) && noexcept
136 return get_or_impl(std::move(*
this), alternative, std::forward<alternative_t>(alternative));
140 template <
typename alternative_t>
141 constexpr decltype(
auto)
get_or(alternative_t && alternative) const && noexcept
143 return get_or_impl(std::move(*
this), alternative, std::forward<alternative_t>(alternative));
147 template <
typename query_t>
148 static constexpr
bool exists() noexcept
153 template <
template <
typename...>
typename query_t>
154 static constexpr
bool exists() noexcept
156 return (
pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...> > -1);
179 template <
typename other_configuration_t>
181 constexpr auto append(other_configuration_t && other_config)
const
183 if constexpr (detail::config_element<std::remove_cvref_t<other_configuration_t>>)
185 return configuration<configs_t..., std::remove_cvref_t<other_configuration_t>>{
187 std::tuple{std::forward<other_configuration_t>(other_config)})};
197 using other_base_t =
typename std::remove_cvref_t<other_configuration_t>::base_type;
200 using other_base_same_modifier_t =
201 detail::transfer_type_modifier_onto_t<other_configuration_t, other_base_t>;
205 using other_configs_list_t = detail::transfer_template_args_onto_t<other_base_t, type_list>;
206 using appended_configuration_t = detail::transfer_template_args_onto_t<
207 list_traits::concat<
type_list<configs_t...>, other_configs_list_t>,
211 return appended_configuration_t{
220 template <
typename query_t>
221 [[nodiscard]] constexpr
auto remove() const
225 return remove_at<index>();
229 template <
template <
typename...>
typename query_t>
230 [[nodiscard]] constexpr
auto remove() const
233 constexpr
int index =
234 pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
235 return remove_at<index>();
244 template <
typename... _configs_t>
249 template <
typename... _configs_t>
264 [[nodiscard]] constexpr
auto remove_at()
const
266 static_assert((index >= 0) && (index <
sizeof...(configs_t)),
"Index to remove from config is out of bounds.");
268 auto [head, middle] = tuple_split<index>(
static_cast<base_type
>(*
this));
271 using head_list_t = detail::transfer_template_args_onto_t<decltype(head), type_list>;
272 using tail_list_t = detail::transfer_template_args_onto_t<decltype(tail), type_list>;
273 using concat_list_t = list_traits::concat<head_list_t, tail_list_t>;
274 using new_configuration_t = detail::transfer_template_args_onto_t<concat_list_t, configuration>;
276 return new_configuration_t{
std::tuple_cat(std::move(head), std::move(tail))};
297 template <
typename this_t,
typename query_t,
typename alternative_t>
298 static constexpr decltype(
auto)
299 get_or_impl(this_t && me, query_t const & SEQAN3_DOXYGEN_ONLY(query), alternative_t && alternative) noexcept
301 if constexpr (exists<query_t>())
303 return get<query_t>(std::forward<this_t>(me));
307 using ret_type = remove_rvalue_reference_t<decltype(alternative)>;
308 return static_cast<ret_type
>(alternative);
313 template <
typename this_t,
314 template <
typename...>
315 typename query_template_t,
316 typename... parameters_t,
317 typename alternative_t>
318 static constexpr decltype(
auto)
319 get_or_impl(this_t && me, query_template_t<parameters_t...> const &, alternative_t && alternative) noexcept
321 if constexpr (exists<query_template_t>())
323 return get<query_template_t>(std::forward<this_t>(me));
327 using ret_type = remove_rvalue_reference_t<decltype(alternative)>;
328 return static_cast<ret_type
>(alternative);
340 template <detail::config_element config_t>
363 template <
typename lhs_config_t,
typename rhs_config_t>
365 constexpr auto operator|(lhs_config_t && lhs, rhs_config_t && rhs)
367 if constexpr (detail::config_element<std::remove_cvref_t<lhs_config_t>>)
368 return configuration{std::forward<lhs_config_t>(lhs)}.append(std::forward<rhs_config_t>(rhs));
370 return std::forward<lhs_config_t>(lhs).append(std::forward<rhs_config_t>(rhs));
404 template <
template <
typename...>
class query_t,
typename... configs_t>
407 constexpr
auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
408 static_assert(pos > -1,
"Access error: The requested type is not contained.");
410 return get<pos>(config);
414 template <
template <
typename...>
class query_t,
typename... configs_t>
417 constexpr
auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
418 static_assert(pos > -1,
"Access error: The requested type is not contained.");
420 return get<pos>(config);
424 template <
template <
typename...>
class query_t,
typename... configs_t>
427 constexpr
auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
428 static_assert(pos > -1,
"Access error: The requested type is not contained.");
430 return get<pos>(std::move(config));
434 template <
template <
typename...>
class query_t,
typename... configs_t>
437 constexpr
auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
438 static_assert(pos > -1,
"Access error: The requested type is not contained.");
440 return get<pos>(std::move(config));
455 template <seqan3::detail::config_element... configs_t>
456 struct tuple_size<
seqan3::configuration<configs_t...>>
467 template <
size_t pos, seqan3::detail::config_element... configs_t>
468 struct tuple_element<pos,
seqan3::configuration<configs_t...>>
Collection of elements to configure an algorithm.
Definition: configuration.hpp:45
requires(!std::same_as< std::remove_cvref_t< config_element_t >, configuration >) &&detail
Constructs a configuration from a single configuration element.
Definition: configuration.hpp:72
constexpr size_t size() const noexcept
Returns the number of contained config elements.
Definition: configuration.hpp:83
requires(is_config_element_combineable_v< std::remove_cvref_t< lhs_config_t >, std::remove_cvref_t< rhs_config_t >>) const expr auto operator|(lhs_config_t &&lhs
Combines two configurations and/or configuration elements forming a new seqan3::configuration.
configuration(config_t) -> configuration< config_t >
Deduces the correct configuration element type from the passed seqan3::pipeable_config_element.
constexpr configuration(configuration &&)=default
Defaulted.
constexpr configuration & operator=(configuration const &)=default
Defaulted.
constexpr decltype(auto) get_or(alternative_t &&alternative) &noexcept
Returns the stored configuration element if present otherwise the given alternative.
Definition: configuration.hpp:119
~configuration()=default
Defaulted.
constexpr auto remove() const requires(exists< query_t >())
Remove a config element from the configuration.
Definition: configuration.hpp:220
constexpr configuration & operator=(configuration &&)=default
Defaulted.
constexpr configuration(configuration const &)=default
Defaulted.
constexpr configuration()=default
Defaulted.
static constexpr bool exists() noexcept
Checks if the given type exists in the tuple.
Definition: configuration.hpp:147
friend class configuration
Friend declaration for other instances of the configuration.
Definition: configuration.hpp:48
The <concepts> header from C++20's standard library.
Provides various auxiliary functions with which parts of the configurations can be checked.
Provides concepts for the configuration classes.
constexpr bool is_config_element_combineable_v
Helper variable template to test if a configuration element is combineable with another configuration...
Definition: core/configuration/detail/concept.hpp:212
constexpr auto & get(configuration< configs_t... > &config) noexcept
Returns the stored element.
Definition: configuration.hpp:405
constexpr auto tuple_pop_front(tuple_t &&t)
Removes the first element of a tuple.
Definition: pop_front.hpp:42
constexpr ptrdiff_t find
Get the index of the first occurrence of a type in a pack.
Definition: type_pack/traits.hpp:182
constexpr ptrdiff_t find_if
Get the index of the first type in a pack that satisfies the given predicate.
Definition: type_pack/traits.hpp:205
constexpr bool contains
Whether a type occurs in a pack or not.
Definition: type_pack/traits.hpp:223
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
constexpr auto const & get(configuration< configs_t... > const &config) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:415
SeqAn specific customisations in the standard namespace.
Provides seqan3::tuple_pop_front.
Type that contains multiple types.
Definition: type_list.hpp:29
Provides type traits for working with templates.
Provides type traits seqan3::detail::transfer_type_modifier_onto.
Provides seqan3::type_list.