17 #include <meta/meta.hpp> 33 template <detail::ConfigElement ... configs_t>
36 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
37 constexpr
auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
38 pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
40 return configuration{
static_cast<lhs_derived_t &&
>(lhs)}.push_back(static_cast<rhs_derived_t &&>(rhs));
43 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
44 constexpr
auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
45 pipeable_config_element<rhs_derived_t, rhs_value_t>
const & rhs)
47 return configuration{
static_cast<lhs_derived_t &&
>(lhs)}.push_back(static_cast<rhs_derived_t const &>(rhs));
50 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
51 constexpr
auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t>
const & lhs,
52 pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
54 return configuration{
static_cast<lhs_derived_t
const &
>(lhs)}.push_back(static_cast<rhs_derived_t &&>(rhs));
57 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
58 constexpr
auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t>
const & lhs,
59 pipeable_config_element<rhs_derived_t, rhs_value_t>
const & rhs)
61 return configuration{
static_cast<lhs_derived_t
const &
>(lhs)}.push_back(static_cast<rhs_derived_t const &>(rhs));
81 template <detail::ConfigElement ... configs_t>
85 template <detail::ConfigElement ... _configs_t>
106 template <
typename derived_t,
typename value_t>
108 base_type{
static_cast<derived_t &&
>(std::move(elem))}
114 template <
typename derived_t,
typename value_t>
116 base_type{
static_cast<derived_t
const &
>(elem)}
124 constexpr
size_t size() const noexcept
127 return std::tuple_size_v<base_type>;
156 template <
typename query_t,
typename default_t>
157 constexpr decltype(
auto)
value_or(default_t && default_value) & noexcept
159 if constexpr (exists<query_t>())
161 return get<query_t>(*this).value;
166 return static_cast<ret_type
>(default_value);
171 template <
typename query_t,
typename default_t>
172 constexpr decltype(
auto)
value_or(default_t && default_value) const & noexcept
174 if constexpr (exists<query_t>())
176 return get<query_t>(*this).value;
181 return static_cast<ret_type
>(default_value);
186 template <
typename query_t,
typename default_t>
187 constexpr decltype(
auto)
value_or(default_t && default_value) && noexcept
189 if constexpr (exists<query_t>())
191 return get<query_t>(std::move(*
this)).value;
196 return static_cast<ret_type
>(default_value);
201 template <
typename query_t,
typename default_t>
202 constexpr decltype(
auto)
value_or(default_t && default_value) const && noexcept
204 if constexpr (exists<query_t>())
206 return get<query_t>(std::move(*
this)).value;
211 return static_cast<ret_type
>(default_value);
216 template <
template <
typename...>
typename query_t,
typename default_t>
217 constexpr decltype(
auto)
value_or(default_t && default_value) & noexcept
219 if constexpr (exists<query_t>())
221 return get<query_t>(*this).value;
226 return static_cast<ret_type
>(default_value);
231 template <
template <
typename...>
typename query_t,
typename default_t>
232 constexpr decltype(
auto)
value_or(default_t && default_value) const & noexcept
234 if constexpr (exists<query_t>())
236 return get<query_t>(*this).value;
241 return static_cast<ret_type
>(default_value);
246 template <
template <
typename...>
typename query_t,
typename default_t>
247 constexpr decltype(
auto)
value_or(default_t && default_value) && noexcept
249 if constexpr (exists<query_t>())
251 return get<query_t>(std::move(*
this)).value;
256 return static_cast<ret_type
>(default_value);
261 template <
template <
typename...>
typename query_t,
typename default_t>
262 constexpr decltype(
auto)
value_or(default_t && default_value) const && noexcept
264 if constexpr (exists<query_t>())
266 return get<query_t>(std::move(*
this)).value;
271 return static_cast<ret_type
>(default_value);
276 template <
typename query_t>
282 template <
template <
typename...>
typename query_t>
285 return !
meta::empty<meta::find_if<
type_list<configs_t...>, detail::is_same_configuration_f<query_t>>>::value;
301 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
306 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
311 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
316 template <
typename lhs_derived_t,
typename lhs_value_t,
typename rhs_derived_t,
typename rhs_value_t>
327 template <
typename rhs_derived_t,
typename rhs_value_t>
331 return std::move(lhs).push_back(static_cast<rhs_derived_t &&>(rhs));
335 template <
typename rhs_derived_t,
typename rhs_value_t>
339 return lhs.push_back(static_cast<rhs_derived_t &&>(rhs));
343 template <
typename rhs_derived_t,
typename rhs_value_t>
347 return std::move(lhs).push_back(static_cast<rhs_derived_t const &>(rhs));
351 template <
typename rhs_derived_t,
typename rhs_value_t>
355 return lhs.push_back(static_cast<rhs_derived_t const &>(rhs));
364 template <
typename ...rhs_configs_t>
371 return make_configuration(
std::tuple_cat(static_cast<lhs_base_t>(std::move(lhs)),
372 static_cast<rhs_base_t>(std::move(rhs))));
376 template <
typename ...rhs_configs_t>
383 return make_configuration(
std::tuple_cat(static_cast<lhs_base_t>(lhs),
384 static_cast<rhs_base_t>(std::move(rhs))));
388 template <
typename ...rhs_configs_t>
395 return make_configuration(
std::tuple_cat(static_cast<lhs_base_t>(std::move(lhs)),
396 static_cast<rhs_base_t>(rhs)));
400 template <
typename ...rhs_configs_t>
407 return make_configuration(
std::tuple_cat(static_cast<lhs_base_t>(lhs),
408 static_cast<rhs_base_t>(rhs)));
417 template <
typename ... _configs_t>
423 template <
typename ... _configs_t>
434 template <
typename tuple_t>
436 requires detail::is_type_specialisation_of_v<tuple_t, std::tuple> &&
437 std::tuple_size_v<remove_cvref_t<tuple_t>> > 0
439 static constexpr
auto make_configuration(tuple_t && tpl)
441 auto make_config = [](
auto && tpl)
443 auto impl = [](
auto & impl_ref,
auto && config,
auto && head,
auto && tail)
447 return std::forward<decltype(config)>(config).push_back(std::get<0>(
std::forward<decltype(head)>(head)));
451 auto [_head, _tail] = tuple_split<1>(std::forward<decltype(tail)>(tail));
452 auto tmp = std::forward<decltype(config)>(config).push_back(
454 return impl_ref(impl_ref, std::move(tmp), std::move(_head), std::move(_tail));
457 auto [head, tail] = tuple_split<1>(std::forward<decltype(tpl)>(tpl));
458 return impl(impl, configuration<>{}, std::move(head), std::move(tail));
460 return make_config(std::forward<tuple_t>(tpl));
489 template <detail::ConfigElement config_element_t>
490 constexpr
auto push_back(config_element_t elem)
const &
492 static_assert(detail::is_configuration_valid_v<remove_cvref_t<config_element_t>,
494 "Configuration error: The passed element cannot be combined with one or more elements in the " 495 "current configuration.");
503 template <detail::ConfigElement config_element_t>
504 constexpr
auto push_back(config_element_t elem) &&
506 static_assert(detail::is_configuration_valid_v<remove_cvref_t<config_element_t>,
508 "Configuration error: The passed element cannot be combined with one or more elements in the " 509 "current configuration.");
525 template <
typename derived_t,
typename value_t>
526 configuration(pipeable_config_element<derived_t, value_t> &&) -> configuration<remove_cvref_t<derived_t>>;
531 template <
typename derived_t,
typename value_t>
532 configuration(pipeable_config_element<derived_t, value_t>
const &) -> configuration<remove_cvref_t<derived_t>>;
566 template <
template <
typename ...>
class query_t,
typename ...configs_t>
569 using _tail = meta::find_if<
type_list<configs_t...>, detail::is_same_configuration_f<query_t>>;
570 static_assert(!meta::empty<_tail>::value,
"Access error: The requested type is not contained.");
572 constexpr
size_t pos =
sizeof...(configs_t) - meta::size<_tail>::value;
573 return get<pos>(config);
577 template <
template <
typename ...>
class query_t,
typename ...configs_t>
578 constexpr
auto const &
get(
configuration<configs_t...>
const & config) noexcept
580 using _tail = meta::find_if<
type_list<configs_t...>, detail::is_same_configuration_f<query_t>>;
581 static_assert(!meta::empty<_tail>::value,
"Access error: The requested type is not contained.");
583 constexpr
size_t pos =
sizeof...(configs_t) - meta::size<_tail>::value;
584 return get<pos>(config);
588 template <
template <
typename ...>
class query_t,
typename ...configs_t>
591 using _tail = meta::find_if<
type_list<configs_t...>, detail::is_same_configuration_f<query_t>>;
592 static_assert(!meta::empty<_tail>::value,
"Access error: The requested type is not contained.");
594 constexpr
size_t pos =
sizeof...(configs_t) - meta::size<_tail>::value;
595 return get<pos>(std::move(config));
599 template <
template <
typename ...>
class query_t,
typename ...configs_t>
600 constexpr
auto const &&
get(
configuration<configs_t...>
const && config) noexcept
602 using _tail = meta::find_if<
type_list<configs_t...>, detail::is_same_configuration_f<query_t>>;
603 static_assert(!meta::empty<_tail>::value,
"Access error: The requested type is not contained.");
605 constexpr
size_t pos =
sizeof...(configs_t) - meta::size<_tail>::value;
608 return std::move(get<pos>(config));
623 template <seqan3::detail::ConfigElement ... configs_t>
624 struct tuple_size<
seqan3::configuration<configs_t...>>
635 template <
size_t pos, seqan3::detail::ConfigElement ... configs_t>
636 struct tuple_element<pos,
seqan3::configuration<configs_t...>>
Provides concepts for the configuration classes.
friend constexpr auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > &&lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > &&rhs)
Combines two seqan3::pipeable_config_element objects to a seqan3::configuration.
friend constexpr auto operator|(configuration &&lhs, configuration< rhs_configs_t... > &&rhs)
Combines two seqan3::configuration objects.
Definition: configuration.hpp:365
decltype(auto) constexpr value_or(default_t &&default_value) &noexcept
Returns the contained value if *this has a value, otherwise returns default_value.
Definition: configuration.hpp:157
Provides functionality to access get function by enum values.
typename remove_rvalue_reference< t >::type remove_rvalue_reference_t
Return the input type with && removed, but lvalue references preserved (TransformationTrait shortcut)...
Definition: basic.hpp:58
friend constexpr auto operator|(configuration const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > &&rhs)
Definition: configuration.hpp:336
friend constexpr auto operator|(configuration const &lhs, configuration< rhs_configs_t... > const &rhs)
Definition: configuration.hpp:401
Provides seqan3::type_list and auxiliary type traits.
Adds pipe interface to configuration elements.
Definition: pipeable_config_element.hpp:30
std::remove_cv_t< std::remove_reference_t< t > > remove_cvref_t
Return the input type with const, volatile and references removed (type trait).
Definition: basic.hpp:35
friend constexpr auto operator|(configuration &&lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
Definition: configuration.hpp:344
static constexpr bool exists() noexcept
Checks if the given type exists in the tuple.
Definition: configuration.hpp:277
SeqAn specific customisations in the standard namespace.
constexpr configuration(pipeable_config_element< derived_t, value_t > const &elem)
Constructs a configuration from a single configuration element.
Definition: configuration.hpp:115
The main SeqAn3 namespace.
constexpr size_t size() const noexcept
Returns the number of contained config elements.
Definition: configuration.hpp:125
friend constexpr auto operator|(configuration const &lhs, configuration< rhs_configs_t... > &&rhs)
Definition: configuration.hpp:377
Provides seqan3::type_list and auxiliary type traits.
constexpr configuration & operator=(configuration const &)=default
Defaulted.
Provides seqan3::pipeable_config_element.
friend constexpr auto operator|(configuration &&lhs, configuration< rhs_configs_t... > const &rhs)
Definition: configuration.hpp:389
Provides utility functions for tuple like interfaces.
friend constexpr auto operator|(configuration const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
Definition: configuration.hpp:352
~configuration()=default
Defaulted.
friend constexpr auto operator|(configuration &&lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > &&rhs)
Combines a seqan3::configuration with a seqan3::pipeable_config_element.
Definition: configuration.hpp:328
constexpr configuration()=default
Defaulted.
Provides various type traits on generic types.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:889
meta::list< types... > type_list
Type that contains multiple types, an alias for meta::list.
Definition: type_list.hpp:27
::ranges::empty empty
Alias for ranges::empty. Checks whether a range is empty.
Definition: ranges:194
Collection of elements to configure an algorithm.
Definition: configuration.hpp:82
constexpr configuration(pipeable_config_element< derived_t, value_t > &&elem)
Constructs a configuration from a single configuration element.
Definition: configuration.hpp:107