Commit 26dc37bd authored by Max Kellermann's avatar Max Kellermann Committed by Max Kellermann

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

parent c693e4aa
...@@ -124,48 +124,39 @@ struct FunctionSignatureHelper<R (*)(Args...) noexcept(NoExcept)> { ...@@ -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 method>
typename MethodSignatureHelper<decltype(method)>::function_pointer
MakeBindMethodWrapper() noexcept
{
return BindMethodWrapperGenerator<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> template<auto function, bool NoExcept, typename R, typename... Args>
struct BindFunctionWrapperGenerator<R (*)(Args...) noexcept(NoExcept), function> { struct WrapperGenerator<R (*)(Args...) noexcept(NoExcept), function> {
static R Invoke(void *, Args... args) noexcept(NoExcept) { static R Invoke(void *, Args... args) noexcept(NoExcept) {
return function(std::forward<Args>(args)...); return function(std::forward<Args>(args)...);
} }
}; };
template<auto method>
typename MethodSignatureHelper<decltype(method)>::function_pointer
MakeBindMethodWrapper() noexcept
{
return WrapperGenerator<decltype(method), method>::Invoke;
}
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 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment