From c09323804c6c6d42c052b1c60061134261e515fc Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 2 Nov 2024 19:54:50 +0100 Subject: Add function with invoke and result_of_t --- asl/functional.hpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 asl/functional.hpp (limited to 'asl/functional.hpp') diff --git a/asl/functional.hpp b/asl/functional.hpp new file mode 100644 index 0000000..967a2a2 --- /dev/null +++ b/asl/functional.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "asl/meta.hpp" +#include "asl/utility.hpp" + +namespace asl { + +template +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 +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 +constexpr auto invoke(is_object auto C::* m, auto&& self, Args&&...) + requires ( + sizeof...(Args) == 0 && + requires { self.*m; } + ) +{ + return ASL_FWD(self).*m; +} + +template +constexpr auto invoke(is_object auto C::* m, auto* self, Args&&...) + requires ( + sizeof...(Args) == 0 && + requires { self->*m; } + ) +{ + return self->*m; +} + +template +constexpr auto invoke(auto&& f, Args&&... args) + requires requires { + f(ASL_FWD(args)...); + } +{ + return ASL_FWD(f)(ASL_FWD(args)...); +} + +template struct _result_of_helper; + +template +struct _result_of_helper +{ + using type = decltype(invoke(declval(), declval()...)); +}; + +template using result_of_t = _result_of_helper::type; + +} // namespace asl -- cgit