From 3656f692f31e0c5ba5f2209d8da0a13ef6811d43 Mon Sep 17 00:00:00 2001 From: DH Date: Wed, 27 Aug 2025 20:57:44 +0300 Subject: [PATCH] Avoid usage of std::move_only_function --- .../include/rpcsx/ui/Protocol.hpp | 8 +++--- .../include/rpcsx/ui/extension.hpp | 25 +++++++++++-------- extensions/cpp/rpcsx-ui-cpp/src/extension.cpp | 16 ++++++------ rpcsx-ui-kit/src/cpp-generators.ts | 4 +-- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/Protocol.hpp b/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/Protocol.hpp index a8f4974..41e0a6b 100644 --- a/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/Protocol.hpp +++ b/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/Protocol.hpp @@ -39,10 +39,10 @@ public: virtual ~Protocol() = default; virtual void call(std::string_view method, json params, - std::move_only_function responseHandler) = 0; + std::function responseHandler) = 0; virtual void notify(std::string_view method, json params) = 0; virtual void onEvent(std::string_view method, - std::move_only_function eventHandler) = 0; + std::function eventHandler) = 0; virtual int processMessages() = 0; virtual void sendLogMessage(LogLevel level, std::string_view message) = 0; @@ -52,11 +52,11 @@ public: virtual void addMethodHandler( std::string_view method, - std::move_only_function handler) = 0; + std::function handler) = 0; virtual void addNotificationHandler(std::string_view notification, - std::move_only_function handler) = 0; + std::function handler) = 0; virtual void addObject(std::string_view interfaceName, void (*builder)(InterfaceBuilder &builder), diff --git a/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/extension.hpp b/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/extension.hpp index 33922ae..eb69c7c 100644 --- a/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/extension.hpp +++ b/extensions/cpp/rpcsx-ui-cpp/include/rpcsx/ui/extension.hpp @@ -46,21 +46,24 @@ public: requires requires { ObjectType(std::forward(args)...); } { using InterfaceType = typename ObjectType::InterfaceType; - auto object = std::unique_ptr( - static_cast( - new ObjectType(std::forward(args)...)), - [](void *object) { - delete static_cast( - static_cast(object)); - }); - this->objectCreate( { .name = std::string(name), .interface = std::string(ObjectType::kInterfaceId), }, - [this, object = std::move(object)]( - const ObjectCreateResponse &response) mutable { + [this, args = std::forward_as_tuple(std::forward( + args)...)](const ObjectCreateResponse &response) { + auto object = std::unique_ptr( + static_cast(std::apply( + [](auto &&...args) { + return new ObjectType(std::forward(args)...); + }, + args)), + [](void *object) { + delete static_cast( + static_cast(object)); + }); + m_protocol->addObject( ObjectType::kInterfaceId, &ObjectType::Builder::template build, @@ -72,7 +75,7 @@ public: }; using ExtensionBuilder = - std::move_only_function(Protocol *)>; + std::function(Protocol *)>; template ExtensionBuilder createExtension() { auto builder = [](Protocol *protocol) { diff --git a/extensions/cpp/rpcsx-ui-cpp/src/extension.cpp b/extensions/cpp/rpcsx-ui-cpp/src/extension.cpp index 43b4b33..7026265 100644 --- a/extensions/cpp/rpcsx-ui-cpp/src/extension.cpp +++ b/extensions/cpp/rpcsx-ui-cpp/src/extension.cpp @@ -186,7 +186,7 @@ struct JsonRpcProtocol : Protocol { } void call(std::string_view method, json params, - std::move_only_function responseHandler) override { + std::function responseHandler) override { std::size_t id = mNextId++; send({ {"jsonrpc", "2.0"}, @@ -230,18 +230,18 @@ struct JsonRpcProtocol : Protocol { void addNotificationHandler(std::string_view notification, - std::move_only_function handler) override { + std::function handler) override { mNotifyHandlers[std::string(notification)] = std::move(handler); } void addMethodHandler( std::string_view method, - std::move_only_function handler) override { + std::function handler) override { mMethodHandlers[std::string(method)] = std::move(handler); } void onEvent(std::string_view method, - std::move_only_function eventHandler) override { + std::function eventHandler) override { mEventHandlers[std::string(method)].push_back(std::move(eventHandler)); } @@ -395,12 +395,12 @@ private: getTransport()->flush(); } - std::map> + std::map> mMethodHandlers; - std::map> mNotifyHandlers; - std::map>> + std::map> mNotifyHandlers; + std::map>> mEventHandlers; - std::map> mExpectedResponses; + std::map> mExpectedResponses; std::size_t mNextId = 1; }; diff --git a/rpcsx-ui-kit/src/cpp-generators.ts b/rpcsx-ui-kit/src/cpp-generators.ts index 6794043..59006e7 100644 --- a/rpcsx-ui-kit/src/cpp-generators.ts +++ b/rpcsx-ui-kit/src/cpp-generators.ts @@ -489,7 +489,7 @@ struct ${label} { const params = "params" in method ? `const ${uLabel}Request ¶ms, ` : ''; this.content += ` - auto ${label}(${params}std::move_only_function result) { + auto ${label}(${params}std::function result) { return protocol().call("${component}/${name}", ${params ? "params" : "{}"}, std::move(result)); }` } @@ -518,7 +518,7 @@ struct ${label} { } this.content += ` - auto on${uLabel}(std::move_only_function callback) { + auto on${uLabel}(std::function callback) { return protocol().onEvent("${component}/${name}", std::move(callback)); }` }