From 463890cfcbe4d8a3839d016db9f7444a36f095c1 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Sun, 12 Nov 2023 19:59:18 +0100 Subject: [PATCH] Added Signal::connect() function that takes an object + function pointer. --- source/mijin/async/signal.hpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source/mijin/async/signal.hpp b/source/mijin/async/signal.hpp index d5750c0..5be5196 100644 --- a/source/mijin/async/signal.hpp +++ b/source/mijin/async/signal.hpp @@ -57,6 +57,8 @@ public: public: template inline token_t connect(THandler handler, Oneshot oneshot = Oneshot::NO, std::weak_ptr referenced = std::weak_ptr()) noexcept; + template + inline token_t connect(TObject& object, void (TObject::* handler)(TArgs...), Oneshot oneshot = Oneshot::NO, std::weak_ptr referenced = std::weak_ptr()) noexcept; inline void disconnect(token_t token) noexcept; inline void emit(TArgs&&... args) noexcept; }; @@ -82,6 +84,26 @@ inline auto Signal::connect(THandler handler, Oneshot oneshot, std::we return nextToken++; } +template +template +inline auto Signal::connect(TObject& object, void (TObject::* handler)(TArgs...), Oneshot oneshot, std::weak_ptr referenced) noexcept -> token_t +{ + std::lock_guard lock(handlersMutex_); + + auto callable = [object = &object, handler](TArgs... args) + { + std::invoke(handler, object, std::forward(args)...); + }; + handlers_.push_back({ + .callable = std::move(callable), + .referenced = std::move(referenced), + .token = nextToken, + .oneshot = oneshot + }); + + return nextToken++; +} + template inline void Signal::disconnect(token_t token) noexcept {