[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: