SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
configuration.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <tuple>
16 
17 #include <meta/meta.hpp>
18 
25 #include <seqan3/std/concepts>
26 
27 namespace seqan3
28 {
29 
31 // Forward declaration for friend declaration definitions below.
32 template <detail::config_element_specialisation ... configs_t>
33 class configuration;
34 
35 template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
36 constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
37  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
38 {
39  return configuration{static_cast<lhs_derived_t &&>(lhs)}.push_back(static_cast<rhs_derived_t &&>(rhs));
40 }
41 
42 template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
43 constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
44  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs)
45 {
46  return configuration{static_cast<lhs_derived_t &&>(lhs)}.push_back(static_cast<rhs_derived_t const &>(rhs));
47 }
48 
49 template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
50 constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
51  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
52 {
53  return configuration{static_cast<lhs_derived_t const &>(lhs)}.push_back(static_cast<rhs_derived_t &&>(rhs));
54 }
55 
56 template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
57 constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
58  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs)
59 {
60  return configuration{static_cast<lhs_derived_t const &>(lhs)}.push_back(static_cast<rhs_derived_t const &>(rhs));
61 }
63 
64 // ----------------------------------------------------------------------------
65 // configuration
66 // ----------------------------------------------------------------------------
67 
80 template <detail::config_element_specialisation ... configs_t>
81 class configuration : public std::tuple<configs_t...>
82 {
84  template <detail::config_element_specialisation ... _configs_t>
85  friend class configuration;
86 
87 public:
90  using base_type = std::tuple<configs_t...>;
91 
93 
96  constexpr configuration() = default;
97  constexpr configuration(configuration const &) = default;
98  constexpr configuration(configuration &&) = default;
99  constexpr configuration & operator=(configuration const &) = default;
100  constexpr configuration & operator=(configuration &&) = default;
101  ~configuration() = default;
102 
106  template <typename derived_t, typename value_t>
107  constexpr configuration(pipeable_config_element<derived_t, value_t> && elem) :
108  base_type{static_cast<derived_t &&>(std::move(elem))}
109  {}
110 
114  template <typename derived_t, typename value_t>
115  constexpr configuration(pipeable_config_element<derived_t, value_t> const & elem) :
116  base_type{static_cast<derived_t const &>(elem)}
117  {}
119 
124  constexpr size_t size() const noexcept
126  {
127  return std::tuple_size_v<base_type>;
128  }
129 
160  template <typename alternative_t>
161  constexpr decltype(auto) get_or(alternative_t && alternative) & noexcept
162  {
163  return get_or_impl(*this, alternative, std::forward<alternative_t>(alternative));
164  }
165 
167  template <typename alternative_t>
168  constexpr decltype(auto) get_or(alternative_t && alternative) const & noexcept
169  {
170  return get_or_impl(*this, alternative, std::forward<alternative_t>(alternative));
171  }
172 
174  template <typename alternative_t>
175  constexpr decltype(auto) get_or(alternative_t && alternative) && noexcept
176  {
177  return get_or_impl(std::move(*this), alternative, std::forward<alternative_t>(alternative));
178  }
179 
181  template <typename alternative_t>
182  constexpr decltype(auto) get_or(alternative_t && alternative) const && noexcept
183  {
184  return get_or_impl(std::move(*this), alternative, std::forward<alternative_t>(alternative));
185  }
186 
188  template <typename query_t>
189  static constexpr bool exists() noexcept
190  {
191  return pack_traits::contains<query_t, configs_t...>;
192  }
194  template <template <typename ...> typename query_t>
195  static constexpr bool exists() noexcept
196  {
197  return (pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...> > -1);
198  }
200 
208  template <typename query_t>
209  [[nodiscard]] constexpr auto remove() const
211 #if !SEQAN3_WORKAROUND_GCC_95371
212  requires (exists<query_t>())
213 #endif // !SEQAN3_WORKAROUND_GCC_95371
214  {
216  constexpr int index = pack_traits::find<query_t, configs_t...>;
217  return remove_at<index>();
218  }
219 
221  template <template <typename ...> typename query_t>
222  [[nodiscard]] constexpr auto remove() const
224 #if !SEQAN3_WORKAROUND_GCC_95371
225  requires (exists<query_t>())
226 #endif // !SEQAN3_WORKAROUND_GCC_95371
227  {
229  constexpr int index = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke,
230  configs_t...>;
231  return remove_at<index>();
232  }
234 
247  template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
248  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
249  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs);
250 
252  template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
253  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
254  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs);
255 
257  template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
258  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
259  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs);
260 
262  template <typename lhs_derived_t, typename lhs_value_t, typename rhs_derived_t, typename rhs_value_t>
263  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
264  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs);
265 
273  template <typename rhs_derived_t, typename rhs_value_t>
274  friend constexpr auto operator|(configuration && lhs,
275  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
276  {
277  return std::move(lhs).push_back(static_cast<rhs_derived_t &&>(rhs));
278  }
279 
281  template <typename rhs_derived_t, typename rhs_value_t>
282  friend constexpr auto operator|(configuration const & lhs,
283  pipeable_config_element<rhs_derived_t, rhs_value_t> && rhs)
284  {
285  return lhs.push_back(static_cast<rhs_derived_t &&>(rhs));
286  }
287 
289  template <typename rhs_derived_t, typename rhs_value_t>
290  friend constexpr auto operator|(configuration && lhs,
291  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs)
292  {
293  return std::move(lhs).push_back(static_cast<rhs_derived_t const &>(rhs));
294  }
295 
297  template <typename rhs_derived_t, typename rhs_value_t>
298  friend constexpr auto operator|(configuration const & lhs,
299  pipeable_config_element<rhs_derived_t, rhs_value_t> const & rhs)
300  {
301  return lhs.push_back(static_cast<rhs_derived_t const &>(rhs));
302  }
303 
311  template <typename lhs_derived_t, typename lhs_value_t>
312  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
313  configuration && rhs)
314  {
315  return std::move(rhs) | std::move(lhs);
316  }
317 
319  template <typename lhs_derived_t, typename lhs_value_t>
320  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> && lhs,
321  configuration const & rhs)
322  {
323  return rhs | std::move(lhs);
324  }
325 
327  template <typename lhs_derived_t, typename lhs_value_t>
328  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
329  configuration && rhs)
330  {
331  return std::move(rhs) | lhs;
332  }
333 
335  template <typename lhs_derived_t, typename lhs_value_t>
336  friend constexpr auto operator|(pipeable_config_element<lhs_derived_t, lhs_value_t> const & lhs,
337  configuration const & rhs)
338  {
339  return rhs | lhs;
340  }
341 
348  template <typename ...rhs_configs_t>
349  friend constexpr auto operator|(configuration && lhs,
351  {
352  using lhs_base_t = typename configuration::base_type;
353  using rhs_base_t = typename configuration<rhs_configs_t...>::base_type;
354 
355  return make_configuration(std::tuple_cat(static_cast<lhs_base_t>(std::move(lhs)),
356  static_cast<rhs_base_t>(std::move(rhs))));
357  }
358 
360  template <typename ...rhs_configs_t>
361  friend constexpr auto operator|(configuration const & lhs,
363  {
364  using lhs_base_t = typename configuration::base_type;
365  using rhs_base_t = typename configuration<rhs_configs_t...>::base_type;
366 
367  return make_configuration(std::tuple_cat(static_cast<lhs_base_t>(lhs),
368  static_cast<rhs_base_t>(std::move(rhs))));
369  }
370 
372  template <typename ...rhs_configs_t>
373  friend constexpr auto operator|(configuration && lhs,
375  {
376  using lhs_base_t = typename configuration::base_type;
377  using rhs_base_t = typename configuration<rhs_configs_t...>::base_type;
378 
379  return make_configuration(std::tuple_cat(static_cast<lhs_base_t>(std::move(lhs)),
380  static_cast<rhs_base_t>(rhs)));
381  }
382 
384  template <typename ...rhs_configs_t>
385  friend constexpr auto operator|(configuration const & lhs,
387  {
388  using lhs_base_t = typename configuration::base_type;
389  using rhs_base_t = typename configuration<rhs_configs_t...>::base_type;
390 
391  return make_configuration(std::tuple_cat(static_cast<lhs_base_t>(lhs),
392  static_cast<rhs_base_t>(rhs)));
393  }
395 
396 private:
397 
401  template <typename ..._configs_t>
403  explicit constexpr configuration(std::tuple<_configs_t...> const & cfg) : base_type{cfg}
404  {}
405 
407  template <typename ..._configs_t>
408  explicit constexpr configuration(std::tuple<_configs_t...> && cfg) : base_type{std::move(cfg)}
409  {}
411 
417  template <tuple_like tuple_t>
418  static constexpr auto make_configuration(tuple_t && tpl)
419  {
421  {
422  return configuration<>{};
423  }
424  else
425  {
426  auto impl = [](auto & impl_ref, auto && config, auto && head, auto && tail)
427  {
428  using cfg_t = decltype(config);
429  if constexpr (std::tuple_size_v<std::remove_cvref_t<decltype(tail)>> == 0)
430  {
431  return std::forward<cfg_t>(config).push_back(std::get<0>(std::forward<decltype(head)>(head)));
432  }
433  else
434  {
435  auto [_head, _tail] = tuple_split<1>(std::forward<decltype(tail)>(tail));
436  auto tmp = std::forward<cfg_t>(config).push_back(std::get<0>(std::forward<decltype(head)>(head)));
437  return impl_ref(impl_ref, std::move(tmp), std::move(_head), std::move(_tail));
438  }
439  };
440 
441  auto [head, tail] = tuple_split<1>(std::forward<decltype(tpl)>(tpl));
442  return impl(impl, configuration<>{}, std::move(head), std::move(tail));
443  }
444  }
445 
472  template <detail::config_element_specialisation config_element_t>
473  constexpr auto push_back(config_element_t elem) const &
474  {
475  static_assert(detail::is_configuration_valid_v<std::remove_cvref_t<config_element_t>,
476  configs_t...>,
477  "Configuration error: The passed element cannot be combined with one or more elements in the "
478  "current configuration.");
479 
481  std::tuple_cat(static_cast<base_type>(*this),
482  std::tuple{std::move(elem)})};
483  }
484 
486  template <detail::config_element_specialisation config_element_t>
487  constexpr auto push_back(config_element_t elem) &&
488  {
489  static_assert(detail::is_configuration_valid_v<std::remove_cvref_t<config_element_t>,
490  configs_t...>,
491  "Configuration error: The passed element cannot be combined with one or more elements in the "
492  "current configuration.");
493 
495  std::tuple_cat(std::move(static_cast<base_type>(*this)),
496  std::tuple{std::move(elem)})};
497  }
498 
503  template <int index>
504  [[nodiscard]] constexpr auto remove_at() const
505  {
506  static_assert((index >= 0) && (index < sizeof...(configs_t)), "Index to remove from config is out of bounds.");
507 
508  auto [head, middle] = tuple_split<index>(static_cast<base_type>(*this));
509  auto tail = tuple_pop_front(middle);
510 
511  return make_configuration(std::tuple_cat(head, tail));
512  }
514 
532  template <typename this_t, typename query_t, typename alternative_t>
533  static constexpr decltype(auto) get_or_impl(this_t && me,
534  query_t const & SEQAN3_DOXYGEN_ONLY(query),
535  alternative_t && alternative) noexcept
536  {
537  if constexpr (exists<query_t>())
538  {
539  return get<query_t>(std::forward<this_t>(me));
540  }
541  else
542  {
543  using ret_type = remove_rvalue_reference_t<decltype(alternative)>;
544  return static_cast<ret_type>(alternative);
545  }
546  }
547 
549  template <typename this_t,
550  template <typename ...> typename query_template_t, typename ...parameters_t,
551  typename alternative_t>
552  static constexpr decltype(auto) get_or_impl(this_t && me,
553  query_template_t<parameters_t...> const &,
554  alternative_t && alternative) noexcept
555  {
556  if constexpr (exists<query_template_t>())
557  {
558  return get<query_template_t>(std::forward<this_t>(me));
559  }
560  else
561  {
562  using ret_type = remove_rvalue_reference_t<decltype(alternative)>;
563  return static_cast<ret_type>(alternative);
564  }
565  }
566 };
567 
575 template <typename derived_t, typename value_t>
576 configuration(pipeable_config_element<derived_t, value_t> &&) -> configuration<std::remove_cvref_t<derived_t>>;
577 
581 template <typename derived_t, typename value_t>
582 configuration(pipeable_config_element<derived_t, value_t> const &) -> configuration<std::remove_cvref_t<derived_t>>;
584 
616 template <template <typename ...> class query_t, typename ...configs_t>
617 constexpr auto & get(configuration<configs_t...> & config) noexcept
618 {
619  constexpr auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
620  static_assert(pos > -1, "Access error: The requested type is not contained.");
621 
622  return get<pos>(config);
623 }
624 
626 template <template <typename ...> class query_t, typename ...configs_t>
627 constexpr auto const & get(configuration<configs_t...> const & config) noexcept
628 {
629  constexpr auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
630  static_assert(pos > -1, "Access error: The requested type is not contained.");
631 
632  return get<pos>(config);
633 }
634 
636 template <template <typename ...> class query_t, typename ...configs_t>
637 constexpr auto && get(configuration<configs_t...> && config) noexcept
638 {
639  constexpr auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
640  static_assert(pos > -1, "Access error: The requested type is not contained.");
641 
642  return get<pos>(std::move(config));
643 }
644 
646 template <template <typename ...> class query_t, typename ...configs_t>
647 constexpr auto const && get(configuration<configs_t...> const && config) noexcept
648 {
649  constexpr auto pos = pack_traits::find_if<detail::is_same_configuration_f<query_t>::template invoke, configs_t...>;
650  static_assert(pos > -1, "Access error: The requested type is not contained.");
651 
652  // TODO: change after GCC-7 bug with const && version of get in std::tuple is fixed.
653  // return get<pos>(std::move(config));
654  return std::move(get<pos>(config));
655 }
657 
658 } // namespace seqan3::detail
659 
660 namespace std
661 {
663 
669 template <seqan3::detail::config_element_specialisation ... configs_t>
670 struct tuple_size<seqan3::configuration<configs_t...>>
671 {
673  static constexpr size_t value = std::tuple_size_v<typename seqan3::configuration<configs_t...>::base_type>;
674 };
675 
681 template <size_t pos, seqan3::detail::config_element_specialisation ... configs_t>
682 struct tuple_element<pos, seqan3::configuration<configs_t...>>
683 {
685  using type = std::tuple_element_t<pos, typename seqan3::configuration<configs_t...>::base_type>;
686 };
688 } //namespace std
seqan3::configuration::configuration
constexpr configuration(pipeable_config_element< derived_t, value_t > const &elem)
Constructs a configuration from a single configuration element.
Definition: configuration.hpp:115
seqan3::configuration::operator|
constexpr friend auto operator|(configuration const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > &&rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:282
seqan3::pack_traits::find
constexpr ptrdiff_t find
Get the index of the first occurrence of a type in a pack.
Definition: traits.hpp:152
seqan3::get
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:627
seqan3::configuration::configuration
configuration(pipeable_config_element< derived_t, value_t > const &) -> configuration< std::remove_cvref_t< derived_t >>
Deduces the correct configuration element type from the passed seqan3::pipeable_config_element.
tuple
pipeable_config_element.hpp
Provides seqan3::pipeable_config_element.
seqan3::configuration::exists
static constexpr bool exists() noexcept
Checks if the given type exists in the tuple.
Definition: configuration.hpp:189
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > &&lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
seqan3::configuration::operator|
constexpr friend auto operator|(configuration &&lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:290
seqan3::configuration::get_or
constexpr decltype(auto) get_or(alternative_t &&alternative) &noexcept
Returns the stored configuration element if present otherwise the given alternative.
Definition: configuration.hpp:161
seqan3::pack_traits::contains
constexpr bool contains
Whether a type occurs in a pack or not.
Definition: traits.hpp:193
seqan3::operator|
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1037
concepts
The Concepts library.
concept.hpp
Provides concepts for the configuration classes.
seqan3::configuration
Collection of elements to configure an algorithm.
Definition: configuration.hpp:82
tuple_utility.hpp
Provides utility functions for tuple like interfaces.
seqan3::configuration::configuration
friend class configuration
Friend declaration for other instances of the configuration.
Definition: configuration.hpp:85
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
std::forward
T forward(T... args)
seqan3::configuration::configuration
constexpr configuration(configuration const &)=default
Defaulted.
seqan3::configuration::size
constexpr size_t size() const noexcept
Returns the number of contained config elements.
Definition: configuration.hpp:125
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
seqan3::configuration::operator|
constexpr friend 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:274
seqan3::remove_rvalue_reference_t
typename remove_rvalue_reference< t >::type remove_rvalue_reference_t
Return the input type with && removed, but lvalue references preserved (transformation_trait shortcut...
Definition: basic.hpp:69
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
seqan3::pack_traits::find_if
constexpr ptrdiff_t find_if
Get the index of the first type in a pack that satisfies the given predicate.
Definition: traits.hpp:175
seqan3::configuration::operator|
constexpr friend auto operator|(configuration &&lhs, configuration< rhs_configs_t... > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:373
seqan3::configuration::operator|
constexpr friend auto operator|(configuration &&lhs, configuration< rhs_configs_t... > &&rhs)
Combines two seqan3::configuration objects.
Definition: configuration.hpp:349
seqan3::configuration::~configuration
~configuration()=default
Defaulted.
seqan3::configuration::configuration
configuration(pipeable_config_element< derived_t, value_t > &&) -> configuration< std::remove_cvref_t< derived_t >>
Deduces the correct configuration element type from the passed seqan3::pipeable_config_element.
seqan3::configuration::configuration
constexpr configuration()=default
Defaulted.
seqan3::configuration::operator=
constexpr configuration & operator=(configuration const &)=default
Defaulted.
seqan3::configuration::operator|
constexpr friend auto operator|(configuration const &lhs, configuration< rhs_configs_t... > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:385
seqan3::configuration::configuration
constexpr configuration(configuration &&)=default
Defaulted.
std::remove_reference_t
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > &&lhs, configuration &&rhs)
Combines a seqan3::pipeable_config_element with a seqan3::configuration.
Definition: configuration.hpp:312
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > &&rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
seqan3::configuration::operator|
constexpr friend 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.
configuration_utility.hpp
Provides functionality to access get function by enum values.
std
SeqAn specific customisations in the standard namespace.
seqan3::configuration::get
constexpr auto & get(configuration< configs_t... > &config) noexcept
Returns the stored element.
Definition: configuration.hpp:617
std::remove_cvref_t
std::tuple_cat
T tuple_cat(T... args)
seqan3::configuration::remove
constexpr auto remove() const
Remove a config element from the configuration.
Definition: configuration.hpp:209
seqan3::configuration::operator=
constexpr configuration & operator=(configuration &&)=default
Defaulted.
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > &&lhs, configuration const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:320
traits.hpp
Provides traits for seqan3::type_list.
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > const &lhs, configuration const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:336
seqan3::configuration::operator|
constexpr friend auto operator|(configuration const &lhs, pipeable_config_element< rhs_derived_t, rhs_value_t > const &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:298
seqan3::tuple_pop_front
constexpr auto tuple_pop_front(tuple_t &&t)
Removes the first element of a tuple.
Definition: tuple_utility.hpp:179
seqan3::configuration::operator|
constexpr friend auto operator|(configuration const &lhs, configuration< rhs_configs_t... > &&rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:361
std::tuple_size_v
T tuple_size_v
seqan3::configuration::configuration
constexpr configuration(pipeable_config_element< derived_t, value_t > &&elem)
Constructs a configuration from a single configuration element.
Definition: configuration.hpp:107
seqan3::configuration::operator|
constexpr friend auto operator|(pipeable_config_element< lhs_derived_t, lhs_value_t > const &lhs, configuration &&rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:328
type_list.hpp
Provides seqan3::type_list.