From fd08833f3f08d03b8ea1dc10b8a3151aa932da85 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 21 Aug 2025 20:32:47 +0200 Subject: [PATCH] fix signals --- include/td/misc/Signal.h | 19 +++++++++++-------- include/td/misc/SlotGuard.h | 5 +++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/td/misc/Signal.h b/include/td/misc/Signal.h index 66afe35..9c3c491 100644 --- a/include/td/misc/Signal.h +++ b/include/td/misc/Signal.h @@ -15,7 +15,7 @@ template class SignalRaw : private NonCopyable { public: using FnType = void(Args...); - using CallBack = std::function; + using CallBack = std::shared_ptr>; private: std::vector m_Callbacks; @@ -26,14 +26,13 @@ class SignalRaw : private NonCopyable { } void Disconnect(const CallBack& a_Callback) { - auto it = std::find_if(m_Callbacks.begin(), m_Callbacks.end(), - [&a_Callback](CallBack& callback) { return a_Callback.template target() == callback.template target(); }); + auto it = std::find(m_Callbacks.begin(), m_Callbacks.end(), a_Callback); m_Callbacks.erase(it); } void operator()(Args... args) const { for (const CallBack& callback : m_Callbacks) { - callback(args...); + callback->operator()(args...); } } }; @@ -46,6 +45,7 @@ class Signal { public: using SignalBase = SignalRaw; using CallBack = typename SignalBase::CallBack; + using CallBackRaw = typename CallBack::element_type; using SignalPtr = std::shared_ptr; class ConnectionGuard; @@ -55,13 +55,16 @@ class Signal { public: Signal() : m_Signal(std::make_shared()) {} Signal(const Signal&) = default; - - void Connect(const CallBack& a_Callback) { - m_Signal->Connect(a_Callback); + + /** + * \warning The callback won't be disconnectable, use it wisely! + */ + void Connect(const CallBackRaw& a_Callback) { + m_Signal->Connect(std::make_shared(a_Callback)); } [[nodiscard]] std::unique_ptr ConnectSafe(const CallBack& a_Callback) { - Connect(a_Callback); + m_Signal->Connect(a_Callback); return std::make_unique(*this, a_Callback); } diff --git a/include/td/misc/SlotGuard.h b/include/td/misc/SlotGuard.h index 21e3eb8..e2b49f5 100644 --- a/include/td/misc/SlotGuard.h +++ b/include/td/misc/SlotGuard.h @@ -19,8 +19,9 @@ class SlotGuard { * \brief Connect a signal to a function (with the same signature) */ template - void Connect(Signal a_Signal, const typename Signal::CallBack& a_Callback) { - m_Connections.push_back(a_Signal.ConnectSafe(a_Callback)); + void Connect(Signal a_Signal, const typename Signal::CallBack::element_type& a_Callback) { + auto ptr = std::make_shared::CallBack::element_type>(a_Callback); + m_Connections.push_back(a_Signal.ConnectSafe(ptr)); } void Disconnect() {