based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

procedure.hpp (1353B)


0 #pragma once
2 #include "based/concepts/is/convertable.hpp"
3 #include "based/concepts/is/invocable.hpp"
4 #include "based/concepts/is/regular.hpp"
5 #include "based/concepts/procedure/domain.hpp"
6 #include "based/trait/integral_constant.hpp"
7 #include "based/trait/invoke_result.hpp"
9 namespace based
10 {
12 namespace detail
13 {
15 // clang-format off
17 template<typename P, typename Sig> struct procedure : public false_type {};
19 template<typename P, typename Ret, typename... Args>
20 requires (Invocable<P, Args...> && ConvertibleTo<invoke_result_t<P, Args...>, Ret>)
21 struct procedure<P, Ret(Args...)> : public true_type {};
23 template<typename P, typename... Args>
24 requires (Invocable<P, Args...>)
25 struct procedure<P, void(Args...)> : public true_type {};
27 template<typename P, typename Ret, typename... Args>
28 static constexpr bool procedure_v = procedure<P, Ret(Args...)>::value;
30 // clang-format on
32 } // namespace detail
34 template<typename P, typename Ret, typename... Args>
35 concept Procedure = detail::procedure_v<P, Ret, Args...>;
37 template<typename P, typename Ret, typename Arg>
38 concept UnaryProcedure = Procedure<P, Ret, Arg>;
40 template<typename P, typename Ret, typename... Args>
41 concept RegularProcedure = requires {
42 requires(Procedure<P, Ret, Args...>);
43 requires(RegularDomain<Args...>);
44 requires(Regular<ret_t<P, Args...>>);
45 };
47 } // namespace based