21 namespace seqan3::detail
28 template <
typename left_adaptor_t,
typename right_adaptor_t>
29 class combined_adaptor;
76 template <
typename derived_type,
typename ...stored_args_ts>
84 template <
typename urng_t,
size_t... Is>
89 return static_cast<derived_type
const &
>(*this).impl(
90 std::forward<urng_t>(urange),
95 template <
typename urng_t,
size_t... Is>
99 return static_cast<derived_type &&
>(*this).impl(
100 std::forward<urng_t>(urange),
113 constexpr adaptor_base(adaptor_base
const &) noexcept =
default;
114 constexpr adaptor_base(adaptor_base &&) noexcept = default;
115 constexpr adaptor_base & operator=(adaptor_base const &) noexcept = default;
116 constexpr adaptor_base & operator=(adaptor_base &&) noexcept = default;
117 ~adaptor_base() noexcept = default;
120 constexpr adaptor_base(stored_args_ts ... args)
121 noexcept(noexcept(
std::tuple<stored_args_ts...>{std::forward<stored_args_ts>(args)...})) :
122 arguments{
std::
forward<stored_args_ts>(args)...}
127 template <std::ranges::input_range urng_t>
128 constexpr
auto operator()(urng_t && urange)
const &
134 template <std::ranges::input_range urng_t>
135 constexpr
auto operator()(urng_t && urange) &&
137 return std::move(*this).pass_args_to_impl(std::forward<urng_t>(urange),
152 template <
typename arg_t>
153 constexpr
friend auto operator|(arg_t && arg, derived_type
const & me)
155 if constexpr (std::ranges::input_range<arg_t>)
156 return me(std::forward<arg_t>(arg));
158 return combined_adaptor{std::forward<arg_t>(arg), me};
162 template <
typename arg_t>
163 constexpr
friend auto operator|(arg_t && arg, derived_type && me)
165 if constexpr (std::ranges::input_range<arg_t>)
166 return std::move(me)(std::forward<arg_t>(arg));
168 return combined_adaptor{std::forward<arg_t>(arg),
std::move(me)};
187 template <
typename arg_t>
188 constexpr
friend auto operator|(adaptor_base
const & me, arg_t && arg)
190 return combined_adaptor{
static_cast<derived_type
const &
>(me), std::forward<arg_t>(arg)};
194 template <
typename arg_t>
195 constexpr
friend auto operator|(adaptor_base && me, arg_t && arg)
197 return combined_adaptor{
static_cast<derived_type &&
>(me), std::forward<arg_t>(arg)};
215 template <
typename left_adaptor_t,
typename right_adaptor_t>
216 class combined_adaptor :
217 public adaptor_base<combined_adaptor<left_adaptor_t, right_adaptor_t>,
223 using base_type = adaptor_base<combined_adaptor<left_adaptor_t, right_adaptor_t>,
231 template <std::ranges::input_range urng_t,
232 typename left_adaptor_t_,
233 typename right_adaptor_t_>
234 static auto impl(urng_t && urange, left_adaptor_t_ && left_adaptor, right_adaptor_t_ && right_adaptor)
236 return std::forward<urng_t>(urange)
237 | std::forward<left_adaptor_t_>(left_adaptor)
238 | std::forward<right_adaptor_t_>(right_adaptor);
245 constexpr combined_adaptor() =
default;
246 constexpr combined_adaptor(combined_adaptor
const &) noexcept =
default;
247 constexpr combined_adaptor(combined_adaptor &&) noexcept = default;
248 constexpr combined_adaptor & operator=(combined_adaptor const &) noexcept = default;
249 constexpr combined_adaptor & operator=(combined_adaptor &&) noexcept = default;
250 ~combined_adaptor() noexcept = default;
253 using base_type::base_type;
256 constexpr combined_adaptor(left_adaptor_t l, right_adaptor_t r) :
257 base_type{std::forward<left_adaptor_t>(l), std::forward<right_adaptor_t>(r)}
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1103
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.