17namespace seqan3::detail
24template <
typename left_adaptor_t,
typename right_adaptor_t>
25class combined_adaptor;
72template <
typename derived_type,
typename... stored_args_ts>
77 std::tuple<stored_args_ts...> arguments;
80 template <
typename urng_t,
size_t... Is>
81 constexpr auto pass_args_to_impl(urng_t && urange, std::index_sequence<Is...>
const &)
const &
85 return static_cast<derived_type
const &
>(*this).impl(
87 std::tuple_element_t<Is, std::tuple<stored_args_ts...>>(std::get<Is>(arguments))...);
91 template <
typename urng_t,
size_t... Is>
92 constexpr auto pass_args_to_impl(urng_t && urange, std::index_sequence<Is...>
const &) &&
95 return static_cast<derived_type &&
>(*this).impl(
97 std::tuple_element_t<Is, std::tuple<stored_args_ts...>>(std::get<Is>(std::move(arguments)))...);
108 constexpr adaptor_base(adaptor_base
const &)
noexcept =
default;
109 constexpr adaptor_base(adaptor_base &&) noexcept = default;
110 constexpr adaptor_base & operator=(adaptor_base const &) noexcept = default;
111 constexpr adaptor_base & operator=(adaptor_base &&) noexcept = default;
112 ~adaptor_base() noexcept = default;
115 constexpr adaptor_base(stored_args_ts... args)
122 template <std::ranges::input_range urng_t>
123 constexpr auto operator()(urng_t && urange)
const &
125 return pass_args_to_impl(
std::forward<urng_t>(urange), std::make_index_sequence<
sizeof...(stored_args_ts)>{});
129 template <std::ranges::input_range urng_t>
130 constexpr auto operator()(urng_t && urange) &&
133 std::make_index_sequence<
sizeof...(stored_args_ts)>{});
147 template <
typename arg_t>
148 constexpr friend auto operator|(arg_t && arg, derived_type
const & me)
150 if constexpr (std::ranges::input_range<arg_t>)
157 template <
typename arg_t>
158 constexpr friend auto operator|(arg_t && arg, derived_type && me)
160 if constexpr (std::ranges::input_range<arg_t>)
182 template <
typename arg_t>
183 constexpr friend auto operator|(adaptor_base
const & me, arg_t && arg)
189 template <
typename arg_t>
190 constexpr friend auto operator|(adaptor_base && me, arg_t && arg)
210template <
typename left_adaptor_t,
typename right_adaptor_t>
211class combined_adaptor :
212 public adaptor_base<combined_adaptor<left_adaptor_t, right_adaptor_t>, left_adaptor_t, right_adaptor_t>
216 using base_type = adaptor_base<combined_adaptor<left_adaptor_t, right_adaptor_t>, left_adaptor_t, right_adaptor_t>;
222 template <std::ranges::input_range urng_t,
typename left_adaptor_t_,
typename right_adaptor_t_>
223 static auto impl(urng_t && urange, left_adaptor_t_ && left_adaptor, right_adaptor_t_ && right_adaptor)
233 constexpr combined_adaptor() =
default;
234 constexpr combined_adaptor(combined_adaptor
const &)
noexcept =
default;
235 constexpr combined_adaptor(combined_adaptor &&) noexcept = default;
236 constexpr combined_adaptor & operator=(combined_adaptor const &) noexcept = default;
237 constexpr combined_adaptor & operator=(combined_adaptor &&) noexcept = default;
238 ~combined_adaptor() noexcept = default;
241 using base_type::base_type;
244 constexpr combined_adaptor(left_adaptor_t l, right_adaptor_t r) :