File indexing completed on 2025-12-15 10:26:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef RANGES_V3_FUNCTIONAL_CONCEPTS_HPP
0015 #define RANGES_V3_FUNCTIONAL_CONCEPTS_HPP
0016
0017 #include <concepts/concepts.hpp>
0018
0019 #include <range/v3/functional/invoke.hpp>
0020
0021 #include <range/v3/detail/prologue.hpp>
0022
0023 namespace ranges
0024 {
0025
0026
0027
0028
0029
0030 #if defined(_MSC_VER) && !defined(__clang__)
0031
0032
0033 template<typename Fun, typename... Args>
0034 CPP_concept invocable =
0035 std::is_invocable_v<Fun, Args...>;
0036 #else
0037
0038
0039 template<typename Fun, typename... Args>
0040 CPP_requires(invocable_,
0041 requires(Fun && fn)
0042 (
0043 invoke((Fun &&) fn, std::declval<Args>()...)
0044 ));
0045
0046
0047 template<typename Fun, typename... Args>
0048 CPP_concept invocable =
0049 CPP_requires_ref(ranges::invocable_, Fun, Args...);
0050 #endif
0051
0052
0053
0054 template<typename Fun, typename... Args>
0055 CPP_concept regular_invocable =
0056 invocable<Fun, Args...>;
0057
0058
0059
0060
0061 template<typename Fun, typename... Args>
0062 CPP_requires(predicate_,
0063 requires(Fun && fn)
0064 (
0065 concepts::requires_<
0066 convertible_to<
0067 decltype(invoke((Fun &&) fn, std::declval<Args>()...)),
0068 bool>>
0069 ));
0070
0071
0072 template<typename Fun, typename... Args>
0073 CPP_concept predicate =
0074 regular_invocable<Fun, Args...> &&
0075 CPP_requires_ref(ranges::predicate_, Fun, Args...);
0076
0077
0078
0079 template<typename R, typename T, typename U>
0080 CPP_concept relation =
0081 predicate<R, T, T> &&
0082 predicate<R, U, U> &&
0083 predicate<R, T, U> &&
0084 predicate<R, U, T>;
0085
0086
0087
0088 template<typename R, typename T, typename U>
0089 CPP_concept strict_weak_order =
0090 relation<R, T, U>;
0091
0092
0093 namespace cpp20
0094 {
0095 using ranges::invocable;
0096 using ranges::predicate;
0097 using ranges::regular_invocable;
0098 using ranges::relation;
0099 using ranges::strict_weak_order;
0100 }
0101
0102 }
0103
0104 #include <range/v3/detail/epilogue.hpp>
0105
0106 #endif