17 #ifndef OPENKALMAN_COMPATIBILITY_VIEWS_RANGE_ADAPTOR_CLOSURE_HPP 18 #define OPENKALMAN_COMPATIBILITY_VIEWS_RANGE_ADAPTOR_CLOSURE_HPP 20 #if __cpp_lib_ranges < 202202L 22 #include <type_traits> 31 template<
typename D> requires std::is_object_v<D> && std::same_as<D, std::remove_cv_t<D>>
43 template<
typename T,
typename U, std::enable_if_t<not std::is_same_v<T, range_adaptor_closure<U>>,
int> = 0>
48 #ifndef __cpp_concepts 49 template<
typename T,
typename =
void>
54 std::void_t<decltype(detail::range_adaptor_closure_fn(std::declval<T>(), std::declval<T>()))>> : std::true_type {};
60 concept is_range_adaptor_closure = requires (T t) { detail::range_adaptor_closure_fn(t, t); };
66 #ifndef __cpp_concepts 67 template<
typename Lhs,
typename Rhs,
typename R,
typename =
void>
70 template<
typename Lhs,
typename Rhs,
typename R>
71 struct is_pipe_invocable<Lhs, Rhs, R, std::void_t<decltype(std::declval<Rhs>()(std::declval<Lhs>()(std::declval<R>())))>> : std::true_type {};
75 template<
typename Lhs,
typename Rhs,
typename R>
77 concept __pipe_invocable = requires { std::declval<Rhs>()(std::declval<Lhs>()(std::declval<R>())); };
87 template<
typename Lhs,
typename Rhs>
90 template<
typename T,
typename U>
92 Pipe(T&& lhs, U&& rhs) : my_lhs(std::forward<T>(lhs)), my_rhs(std::forward<U>(rhs)) {}
95 #if __cpp_explicit_this_parameter 96 template<
typename Self,
typename R>
97 requires pipe_invocable<decltype(std::forward_like<Self>(std::declval<Lhs>())), decltype(std::forward_like<Self>(std::declval<Rhs>())), R>
99 operator()(
this Self&&
self, R&& r)
101 return (std::forward<Self>(
self).my_rhs(std::forward<Self>(
self).my_lhs(std::forward<R>(r))));
104 template<
typename R, std::enable_if_t<detail::pipe_invocable<const Lhs&, const Rhs&, R>,
int> = 0>
106 operator()(R&& r)
const & {
return my_rhs(my_lhs(std::forward<R>(r))); }
109 template<
typename R, std::enable_if_t<detail::pipe_invocable<Lhs, Rhs, R>,
int> = 0>
111 operator()(R&& r) && {
return std::move(my_rhs)(std::move(my_lhs)(std::forward<R>(r))); }
116 operator()(R&& r)
const && =
delete;
120 [[no_unique_address]] Lhs my_lhs;
121 [[no_unique_address]] Rhs my_rhs;
128 #ifdef __cpp_concepts 129 template<detail::is_range_adaptor_closure S,
typename R> requires requires { std::declval<S>()(declval<R>()); }
131 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>
134 operator | (R&& r, S&& s)
136 return std::forward<S>(s)(std::forward<R>(r));
140 #ifdef __cpp_concepts 141 template<detail::is_range_adaptor_closure Lhs, detail::is_range_adaptor_closure Rhs>
143 template<
typename Lhs,
typename Rhs, std::enable_if_t<detail::is_range_adaptor_closure<Lhs> and detail::is_range_adaptor_closure<Rhs>,
int> = 0>
146 operator | (Lhs&& lhs, Rhs&& rhs)
156 #endif //OPENKALMAN_COMPATIBILITY_VIEWS_RANGE_ADAPTOR_CLOSURE_HPP
Definition: tuple_reverse.hpp:103
Definition: range-access.hpp:25
Definitions relating to the availability of c++ language features.
Definition: range_adaptor_closure.hpp:88
Definition: range_adaptor_closure.hpp:35
Definition: range_adaptor_closure.hpp:68
Definition: range_adaptor_closure.hpp:50