100class deep :
public detail::adaptor_base<deep<underlying_adaptor_t>, underlying_adaptor_t>
104 using base_type = detail::adaptor_base<deep<underlying_adaptor_t>, underlying_adaptor_t>;
113 constexpr deep() noexcept = default;
116 constexpr
deep & operator=(
deep const &) noexcept = default;
117 constexpr
deep & operator=(
deep &&) noexcept = default;
120 using base_type::base_type;
126 using base_type::operator();
135 template <
std::ranges::input_range urng_t, typename underlying_adaptor_t_>
136 static constexpr auto impl(urng_t && urange, underlying_adaptor_t_ && deep_adaptor)
138 static_assert(std::same_as<underlying_adaptor_t_, underlying_adaptor_t>,
139 "Internally stored deep-adaptor does not match!");
141 constexpr size_t range_dimension = range_dimension_v<urng_t>;
146 return recursive_adaptor<range_dimension>(std::forward<underlying_adaptor_t_>(deep_adaptor))(urange);
170 template <std::
size_t range_dimension>
171 static constexpr decltype(
auto) recursive_adaptor(underlying_adaptor_t deep_adaptor)
173 if constexpr (range_dimension > 1u)
175 auto transform = [adaptor = recursive_adaptor<range_dimension - 1u>(
176 std::forward<underlying_adaptor_t>(deep_adaptor))](
auto && inner_range)
180 return adaptor(
std::forward<
decltype(inner_range)>(inner_range));
182 return std::views::transform(std::move(transform));
205 template <
typename first_arg_t,
typename... stored_arg_types>
206 requires (!std::ranges::input_range<first_arg_t>)
207 constexpr auto operator()(first_arg_t && first, stored_arg_types &&... args)
const
212 auto adaptor_closure =
213 std::get<0>(this->arguments)(std::forward<first_arg_t>(first), std::forward<stored_arg_types>(args)...);
215 return deep<
decltype(adaptor_closure)>{std::move(adaptor_closure)};
219 constexpr auto operator()()
const
224 auto adaptor_closure = std::get<0>(this->arguments)();
226 return deep<
decltype(adaptor_closure)>{std::move(adaptor_closure)};
241 template <std::ranges::input_range urng_t,
typename... stored_arg_types>
242 requires (
sizeof...(stored_arg_types) > 0)
243 constexpr auto operator()(urng_t && urange, stored_arg_types &&... args)
const
245 auto adaptor_closure = std::get<0>(this->arguments)(std::forward<stored_arg_types>(args)...);
246 deep<
decltype(adaptor_closure)> deep_adaptor{std::move(adaptor_closure)};
247 return deep_adaptor(std::forward<urng_t>(urange));