util/BindMethod: merge structs {Method,Function}WrapperGenerator into one

This commit is contained in:
Max Kellermann
2021-12-03 08:06:57 +01:00
committed by Max Kellermann
parent c693e4aa64
commit 26dc37bd76

View File

@@ -124,48 +124,39 @@ struct FunctionSignatureHelper<R (*)(Args...) noexcept(NoExcept)> {
/** /**
* Generate a wrapper function. * Generate a wrapper function.
* *
* @param method the method pointer * @param method the method/function pointer
*/ */
template<typename M, auto method> template<typename M, auto method>
struct BindMethodWrapperGenerator; struct WrapperGenerator;
template<typename T, bool NoExcept, template<typename T, bool NoExcept,
auto method, typename R, typename... Args> auto method, typename R, typename... Args>
struct BindMethodWrapperGenerator<R (T::*)(Args...) noexcept(NoExcept), method> { struct WrapperGenerator<R (T::*)(Args...) noexcept(NoExcept), method> {
static R Invoke(void *_instance, Args... args) noexcept(NoExcept) { static R Invoke(void *_instance, Args... args) noexcept(NoExcept) {
auto &t = *(T *)_instance; auto &t = *(T *)_instance;
return (t.*method)(std::forward<Args>(args)...); return (t.*method)(std::forward<Args>(args)...);
} }
}; };
template<auto function, bool NoExcept, typename R, typename... Args>
struct WrapperGenerator<R (*)(Args...) noexcept(NoExcept), function> {
static R Invoke(void *, Args... args) noexcept(NoExcept) {
return function(std::forward<Args>(args)...);
}
};
template<auto method> template<auto method>
typename MethodSignatureHelper<decltype(method)>::function_pointer typename MethodSignatureHelper<decltype(method)>::function_pointer
MakeBindMethodWrapper() noexcept MakeBindMethodWrapper() noexcept
{ {
return BindMethodWrapperGenerator<decltype(method), method>::Invoke; return WrapperGenerator<decltype(method), method>::Invoke;
} }
/**
* Generate a wrapper function.
*
* @param F the function pointer type
* @param function the function pointer
*/
template<typename F, auto function>
struct BindFunctionWrapperGenerator;
template<auto function, bool NoExcept, typename R, typename... Args>
struct BindFunctionWrapperGenerator<R (*)(Args...) noexcept(NoExcept), function> {
static R Invoke(void *, Args... args) noexcept(NoExcept) {
return function(std::forward<Args>(args)...);
}
};
template<auto function> template<auto function>
typename FunctionSignatureHelper<decltype(function)>::function_pointer typename FunctionSignatureHelper<decltype(function)>::function_pointer
MakeBindFunctionWrapper() noexcept MakeBindFunctionWrapper() noexcept
{ {
return BindFunctionWrapperGenerator<decltype(function), function>::Invoke; return WrapperGenerator<decltype(function), function>::Invoke;
} }
} /* namespace BindMethodDetail */ } /* namespace BindMethodDetail */