17 #ifndef OPENKALMAN_COMPATIBILITY_VIEWS_RANGE_ADAPTOR_CLOSURE_HPP 18 #define OPENKALMAN_COMPATIBILITY_VIEWS_RANGE_ADAPTOR_CLOSURE_HPP 20 #include <type_traits> 26 #if __cpp_lib_ranges >= 202202L 27 using std::ranges::range_adaptor_closure;
30 template<
typename D> requires std::is_object_v<D> && std::same_as<D, std::remove_cv_t<D>>
42 template<
typename T,
typename U, std::enable_if_t<not std::is_same_v<T, range_adaptor_closure<U>>,
int> = 0>
47 #ifndef __cpp_concepts 48 template<
typename T,
typename =
void>
53 std::void_t<decltype(detail::range_adaptor_closure_fn(std::declval<T>(), std::declval<T>()))>> : std::true_type {};
59 concept is_range_adaptor_closure = requires (T t) { detail::range_adaptor_closure_fn(t, t); };
65 #ifndef __cpp_concepts 66 template<
typename Lhs,
typename Rhs,
typename R,
typename =
void>
69 template<
typename Lhs,
typename Rhs,
typename R>
70 struct is_pipe_invocable<Lhs, Rhs, R, std::void_t<decltype(std::declval<Rhs>()(std::declval<Lhs>()(std::declval<R>())))>> : std::true_type {};
74 template<
typename Lhs,
typename Rhs,
typename R>
76 concept __pipe_invocable = requires { std::declval<Rhs>()(std::declval<Lhs>()(std::declval<R>())); };
86 template<
typename Lhs,
typename Rhs>
89 template<
typename T,
typename U>
91 Pipe(T&& lhs, U&& rhs) : my_lhs(std::forward<T>(lhs)), my_rhs(std::forward<U>(rhs)) {}
94 #if __cpp_explicit_this_parameter 95 template<
typename Self,
typename R>
96 requires pipe_invocable<decltype(std::forward_like<Self>(std::declval<Lhs>())), decltype(std::forward_like<Self>(std::declval<Rhs>())), R>
98 operator()(
this Self&&
self, R&& r)
100 return (std::forward<Self>(
self).my_rhs(std::forward<Self>(
self).my_lhs(std::forward<R>(r))));
103 template<
typename R, std::enable_if_t<detail::pipe_invocable<const Lhs&, const Rhs&, R>,
int> = 0>
105 operator()(R&& r)
const & {
return my_rhs(my_lhs(std::forward<R>(r))); }
108 template<
typename R, std::enable_if_t<detail::pipe_invocable<Lhs, Rhs, R>,
int> = 0>
110 operator()(R&& r) && {
return std::move(my_rhs)(std::move(my_lhs)(std::forward<R>(r))); }
115 operator()(R&& r)
const && =
delete;
119 [[no_unique_address]] Lhs my_lhs;
120 [[no_unique_address]] Rhs my_rhs;
127 #ifdef __cpp_concepts 128 template<detail::is_range_adaptor_closure S,
typename R> requires requires { std::declval<S>()(declval<R>()); }
130 template<
typename S,
typename R, std::enable_if_t<detail::is_range_adaptor_closure<S> and not detail::is_range_adaptor_closure<R>,
int> = 0>
133 operator | (R&& r, S&& s)
135 return std::forward<S>(s)(std::forward<R>(r));
139 #ifdef __cpp_concepts 140 template<detail::is_range_adaptor_closure Lhs, detail::is_range_adaptor_closure Rhs>
142 template<
typename Lhs,
typename Rhs, std::enable_if_t<detail::is_range_adaptor_closure<Lhs> and detail::is_range_adaptor_closure<Rhs>,
int> = 0>
145 operator | (Lhs&& lhs, Rhs&& rhs)
Definition: range_adaptor_closure.hpp:87
Definitions relating to the availability of c++ language features.
Definition: common.hpp:200
Definition: range_adaptor_closure.hpp:34
Definition: range_adaptor_closure.hpp:49
Definition: range_adaptor_closure.hpp:67