Files
libart-seafire-common/art/seafire/common/invoke.txx
The Artist 6893cd46d3
All checks were successful
on-push / build-and-test (push) Successful in 32s
Change 'invoke' return type
2026-01-09 08:47:40 +01:00

63 lines
1.9 KiB
C++

namespace art::seafire::common
{
template<typename Ret, typename T, typename... Direct, typename... Params>
decltype(auto)
do_invoke(T& target,
server::request_t& req,
Direct const&... direct,
Ret (T::*func)(Direct const&..., Params const&...))
{
return (target.*func)(direct..., std::decay_t<Params>::fetch(req)...);
}
template<typename Ret, typename T, typename... Params, typename... Direct>
decltype(auto)
invoke(T& target,
server::request_t& req,
Ret (T::*func)(Params const&...),
Direct const&... direct)
{
return do_invoke<Ret, T, Direct...>(target, req, direct..., func);
}
template<typename Ret, typename T, typename... Direct, typename... Params>
decltype(auto)
do_invoke(T const& target,
server::request_t& req,
Direct const&... direct,
Ret (T::*func)(Direct const&..., Params const&...) const)
{
return (target.*func)(direct..., std::decay_t<Params>::fetch(req)...);
}
template<typename Ret, typename T, typename... Params, typename... Direct>
decltype(auto)
invoke(T const& target,
server::request_t& req,
Ret (T::*func)(Params const&...) const,
Direct const&... direct)
{
return do_invoke<Ret, T, Direct...>(target, req, direct..., func);
}
template<typename Ret, typename... Direct, typename... Params>
decltype(auto)
do_invoke(server::request_t& req,
Direct&&... direct,
Ret (*func)(Direct..., Params...))
{
return (*func)(direct..., std::decay_t<Params>::fetch(req)...);
}
template<typename Ret, typename... Params, typename... Direct>
decltype(auto)
invoke(server::request_t& req,
Ret (*func)(Params...),
Direct&&... direct)
{
return do_invoke<Ret, Direct...>(req, direct..., func);
}
} // namespace art::seafire::common