43template <detail::config_element... configs_t>
47 template <detail::config_element... _configs_t>
71 template <
typename config_element_t>
72 requires (!std::same_as<std::remove_cvref_t<config_element_t>,
configuration>)
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>
153 template <
template <
typename...>
typename query_t>
156 return (
pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...> > -1);
179 template <
typename other_configuration_t>
180 requires (is_config_element_combineable_v<configs_t, std::remove_cvref_t<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>>)
187 std::tuple{std::forward<other_configuration_t>(other_config)})};
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<
211 return appended_configuration_t{
220 template <
typename query_t>
221 [[nodiscard]]
constexpr auto remove() const
222 requires (
exists<query_t>())
225 return remove_at<index>();
229 template <
template <
typename...>
typename query_t>
230 [[nodiscard]]
constexpr auto remove() const
231 requires (
exists<query_t>())
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);
340template <detail::config_element config_t>
363template <
typename lhs_config_t,
typename rhs_config_t>
365constexpr 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));
404template <
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);
414template <
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);
424template <
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));
434template <
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));
455template <seqan3::detail::config_element... configs_t>
456struct tuple_size<
seqan3::configuration<configs_t...>>
467template <
size_t pos, seqan3::detail::config_element... configs_t>
468struct tuple_element<pos,
seqan3::configuration<configs_t...>>
Collection of elements to configure an algorithm.
Definition configuration.hpp:45
constexpr decltype(auto) get_or(alternative_t &&alternative) const &&noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition configuration.hpp:141
constexpr size_t size() const noexcept
Returns the number of contained config elements.
Definition configuration.hpp:84
configuration(config_t) -> configuration< config_t >
Deduces the correct configuration element type from the passed seqan3::pipeable_config_element.
constexpr configuration(config_element_t &&config_element)
Constructs a configuration from a single configuration element.
Definition configuration.hpp:74
constexpr decltype(auto) get_or(alternative_t &&alternative) &&noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition configuration.hpp:134
constexpr configuration(configuration &&)=default
Defaulted.
constexpr auto remove() const
Remove a config element from the configuration.
Definition configuration.hpp:221
constexpr decltype(auto) get_or(alternative_t &&alternative) &noexcept
Returns the stored configuration element if present otherwise the given alternative.
Definition configuration.hpp:120
constexpr configuration & operator=(configuration const &)=default
Defaulted.
constexpr configuration & operator=(configuration &&)=default
Defaulted.
~configuration()=default
Defaulted.
constexpr auto append(other_configuration_t &&other_config) const
Returns a new configuration by appending the given configuration to the current one.
Definition configuration.hpp:181
constexpr decltype(auto) get_or(alternative_t &&alternative) const &noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition configuration.hpp:127
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:148
friend class configuration
Friend declaration for other instances of the configuration.
Definition configuration.hpp:48
Provides various auxiliary functions with which parts of the configurations can be checked.
Provides concepts for the configuration classes.
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
decltype(detail::concat(lists_t{}...)) concat
Join two seqan3::type_list s into one.
Definition type_list/traits.hpp:342
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.