[dawn][wire] Simplifies the templating logic for server callbacks. - Removes the unnecessary inner template struct and unnecessary abstractions such as return type. Bug: 412761856 Change-Id: I6a584ae27a147a6156b6f399293b13f7a96376e1 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/264260 Auto-Submit: Loko Kung <lokokung@google.com> Reviewed-by: Kai Ninomiya <kainino@chromium.org> Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/wire/server/Server.h b/src/dawn/wire/server/Server.h index aeb67a8..cfab106 100644 --- a/src/dawn/wire/server/Server.h +++ b/src/dawn/wire/server/Server.h
@@ -61,7 +61,7 @@ // userdata->foo = 2; // // callMyCallbackHandler( -// ForwardToServer<&Server::MyCallbackHandler>, +// ForwardToServer<&Server::MyCallbackHandler>::Callback, // userdata.release()); // // void Server::MyCallbackHandler(MyUserdata* userdata, Other args) { } @@ -72,36 +72,25 @@ explicit CallbackUserdata(const std::weak_ptr<Server>& server); }; -template <auto F> -struct ForwardToServerHelper { - template <typename _> - struct ExtractedTypes; +template <auto F, typename _ = decltype(F)> +struct ForwardToServerHelper; - // An internal structure used to unpack the various types that compose the type of F - template <typename Return, typename Class, typename UserdataT, typename... Args> - struct ExtractedTypes<Return (Class::*)(UserdataT*, Args...)> { - using Userdata = UserdataT; - using UntypedCallback = Return (*)(Args..., void*, void*); +template <auto F, typename UserdataT, typename... Args> +struct ForwardToServerHelper<F, void (Server::*)(UserdataT*, Args...)> { + using Userdata = UserdataT; - static Return Callback(Args... args, void* userdata, void*) { - // Acquire the userdata, and cast it to UserdataT. - std::unique_ptr<Userdata> data(static_cast<Userdata*>(userdata)); - auto server = data->server.lock(); - if (!server) { - // Do nothing if the server has already been destroyed. - return; - } - // Forward the arguments and the typed userdata to the Server:: member function. - (server.get()->*F)(data.get(), std::forward<decltype(args)>(args)...); - server.get()->Flush(); + static void Callback(Args... args, void* userdata, void*) { + // Acquire the userdata, and cast it to UserdataT. + std::unique_ptr<Userdata> data(static_cast<Userdata*>(userdata)); + auto server = data->server.lock(); + if (!server) { + // Do nothing if the server has already been destroyed. + return; } - }; - - static constexpr typename ExtractedTypes<decltype(F)>::UntypedCallback Create() { - return ExtractedTypes<decltype(F)>::Callback; + // Forward the arguments and the typed userdata to the Server:: member function. + (server.get()->*F)(data.get(), std::forward<decltype(args)>(args)...); + server.get()->Flush(); } - - using Userdata = typename ExtractedTypes<decltype(F)>::Userdata; }; struct MapUserdata : CallbackUserdata { @@ -207,7 +196,7 @@ WGPUCallbackMode DefaultMode = WGPUCallbackMode_AllowProcessEvents> CallbackInfo MakeCallbackInfo(ForwardToServerHelper<F>::Userdata* userdata) { return {nullptr, mUseSpontaneousCallbacks ? WGPUCallbackMode_AllowSpontaneous : DefaultMode, - ForwardToServerHelper<F>::Create(), userdata, nullptr}; + &ForwardToServerHelper<F>::Callback, userdata, nullptr}; } private: