diff options
Diffstat (limited to 'asl/functional.hpp')
-rw-r--r-- | asl/functional.hpp | 130 |
1 files changed, 65 insertions, 65 deletions
diff --git a/asl/functional.hpp b/asl/functional.hpp index 967a2a2..f5ff0d9 100644 --- a/asl/functional.hpp +++ b/asl/functional.hpp @@ -1,65 +1,65 @@ -#pragma once
-
-#include "asl/meta.hpp"
-#include "asl/utility.hpp"
-
-namespace asl {
-
-template<typename... Args, typename C>
-constexpr auto invoke(is_func auto C::* f, auto&& self, Args&&... args)
- requires requires {
- (self.*f)(ASL_FWD(args)...);
- }
-{
- return (ASL_FWD(self).*f)(ASL_FWD(args)...);
-}
-
-template<typename... Args, typename C>
-constexpr auto invoke(is_func auto C::* f, auto* self, Args&&... args)
- requires requires {
- (self->*f)(ASL_FWD(args)...);
- }
-{
- return (self->*f)(ASL_FWD(args)...);
-}
-
-template<typename... Args, typename C>
-constexpr auto invoke(is_object auto C::* m, auto&& self, Args&&...)
- requires (
- sizeof...(Args) == 0 &&
- requires { self.*m; }
- )
-{
- return ASL_FWD(self).*m;
-}
-
-template<typename... Args, typename C>
-constexpr auto invoke(is_object auto C::* m, auto* self, Args&&...)
- requires (
- sizeof...(Args) == 0 &&
- requires { self->*m; }
- )
-{
- return self->*m;
-}
-
-template<typename... Args>
-constexpr auto invoke(auto&& f, Args&&... args)
- requires requires {
- f(ASL_FWD(args)...);
- }
-{
- return ASL_FWD(f)(ASL_FWD(args)...);
-}
-
-template<typename F> struct _result_of_helper;
-
-template<typename R, typename... Args>
-struct _result_of_helper<R(Args...)>
-{
- using type = decltype(invoke(declval<R>(), declval<Args>()...));
-};
-
-template<typename F> using result_of_t = _result_of_helper<F>::type;
-
-} // namespace asl
+#pragma once + +#include "asl/meta.hpp" +#include "asl/utility.hpp" + +namespace asl { + +template<typename... Args, typename C> +constexpr auto invoke(is_func auto C::* f, auto&& self, Args&&... args) + requires requires { + (self.*f)(ASL_FWD(args)...); + } +{ + return (ASL_FWD(self).*f)(ASL_FWD(args)...); +} + +template<typename... Args, typename C> +constexpr auto invoke(is_func auto C::* f, auto* self, Args&&... args) + requires requires { + (self->*f)(ASL_FWD(args)...); + } +{ + return (self->*f)(ASL_FWD(args)...); +} + +template<typename... Args, typename C> +constexpr auto invoke(is_object auto C::* m, auto&& self, Args&&...) + requires ( + sizeof...(Args) == 0 && + requires { self.*m; } + ) +{ + return ASL_FWD(self).*m; +} + +template<typename... Args, typename C> +constexpr auto invoke(is_object auto C::* m, auto* self, Args&&...) + requires ( + sizeof...(Args) == 0 && + requires { self->*m; } + ) +{ + return self->*m; +} + +template<typename... Args> +constexpr auto invoke(auto&& f, Args&&... args) + requires requires { + f(ASL_FWD(args)...); + } +{ + return ASL_FWD(f)(ASL_FWD(args)...); +} + +template<typename F> struct _result_of_helper; + +template<typename R, typename... Args> +struct _result_of_helper<R(Args...)> +{ + using type = decltype(invoke(declval<R>(), declval<Args>()...)); +}; + +template<typename F> using result_of_t = _result_of_helper<F>::type; + +} // namespace asl |