102template <
typename underlying_adaptor_t>
116 constexpr deep() noexcept = default;
119 constexpr
deep & operator=(
deep const &) noexcept = default;
120 constexpr
deep & operator=(
deep &&) noexcept = default;
138 template <
std::ranges::input_range urng_t, typename underlying_adaptor_t_>
139 static constexpr auto
impl(urng_t && urange, underlying_adaptor_t_ && deep_adaptor)
141 static_assert(std::same_as<underlying_adaptor_t_, underlying_adaptor_t>,
142 "Internally stored deep-adaptor does not match!");
144 constexpr size_t range_dimension = range_dimension_v<urng_t>;
149 return recursive_adaptor<range_dimension>(std::forward<underlying_adaptor_t_>(deep_adaptor))(urange);
173 template <std::
size_t range_dimension>
176 if constexpr (range_dimension > 1u)
179 = [adaptor =
recursive_adaptor<range_dimension - 1u>(std::forward<underlying_adaptor_t>(deep_adaptor))]
180 (
auto && inner_range)
184 return adaptor(
std::forward<
decltype(inner_range)>(inner_range));
209 template <
typename first_arg_t,
typename ...stored_arg_types>
211 requires (!std::ranges::input_range<first_arg_t>)
213 constexpr auto operator()(first_arg_t && first, stored_arg_types && ...args)
const
218 auto adaptor_closure = std::get<0>(this->
arguments)(std::forward<first_arg_t>(first),
219 std::forward<stored_arg_types>(args)...);
221 return deep<
decltype(adaptor_closure)>{std::move(adaptor_closure)};
230 auto adaptor_closure = std::get<0>(this->
arguments)();
232 return deep<
decltype(adaptor_closure)>{std::move(adaptor_closure)};
247 template <std::ranges::input_range urng_t,
typename ...stored_arg_types>
249 requires (
sizeof...(stored_arg_types) > 0)
251 constexpr auto operator()(urng_t && urange, stored_arg_types && ...args)
const
253 auto adaptor_closure = std::get<0>(this->
arguments)(std::forward<stored_arg_types>(args)...);
254 deep<
decltype(adaptor_closure)> deep_adaptor{std::move(adaptor_closure)};
255 return deep_adaptor(std::forward<urng_t>(urange));
264template <
typename underlying_adaptor_t>
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
CRTP-base to simplify the definition of range adaptor closure objects and similar types.
Definition: adaptor_base.hpp:77
std::tuple< stored_args_ts... > arguments
Stores the arguments.
Definition: adaptor_base.hpp:80
A wrapper type around an existing view adaptor that enables "deep view" behaviour for that view.
Definition: deep.hpp:104
deep(underlying_adaptor_t &&inner) -> deep< underlying_adaptor_t >
Template argument deduction helper that preserves lvalue references and turns rvalue references into ...
static constexpr auto impl(urng_t &&urange, underlying_adaptor_t_ &&deep_adaptor)
Unwrap the internal adaptor closure object and pipe the range into it.
Definition: deep.hpp:139
constexpr auto operator()(urng_t &&urange, stored_arg_types &&...args) const
Called to produce a range if the wrapped functor was not a range adaptor closure object before but ne...
Definition: deep.hpp:251
constexpr auto operator()() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: deep.hpp:225
friend base_type
Befriend the base class so it can call impl().
Definition: deep.hpp:110
static constexpr decltype(auto) recursive_adaptor(underlying_adaptor_t deep_adaptor)
recursively construct the deep adaptor
Definition: deep.hpp:174
constexpr deep() noexcept=default
Defaulted.
Provides various transformation traits used by the range module.
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: traits.hpp:471
The SeqAn namespace for views.
Definition: char_to.hpp:22
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.