From 079d653405d6201980ce546de6625c3db47f07c7 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 6 Aug 2025 14:07:23 +0200 Subject: [PATCH] add SlotGuard --- include/td/misc/Signal.h | 7 ++++--- include/td/misc/SlotGuard.h | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 include/td/misc/SlotGuard.h diff --git a/include/td/misc/Signal.h b/include/td/misc/Signal.h index 9091b43..126e675 100644 --- a/include/td/misc/Signal.h +++ b/include/td/misc/Signal.h @@ -10,15 +10,16 @@ namespace utils { template class Signal : private NonCopyable { - private: + public: using FnType = void(Args...); using CallBack = std::function; + private: std::vector m_Callbacks; public: - void Connect(CallBack&& a_Callback) { - m_Callbacks.push_back(std::move(a_Callback)); + void Connect(const CallBack& a_Callback) { + m_Callbacks.push_back(a_Callback); } void Disconnect(const CallBack& a_Callback) { diff --git a/include/td/misc/SlotGuard.h b/include/td/misc/SlotGuard.h new file mode 100644 index 0000000..3ade4ff --- /dev/null +++ b/include/td/misc/SlotGuard.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace td { +namespace utils { + +class SlotGuard { + private: + std::vector> m_Deleters; + + public: + template + void Connect(Signal& a_Signal, const typename Signal::CallBack& a_Callback) { + a_Signal.Connect(a_Callback); + m_Deleters.push_back([&a_Signal, &a_Callback]() { a_Signal.Disconnect(a_Callback); }); + } + + ~SlotGuard() { + for (auto& deleter : m_Deleters) { + deleter(); + } + } +}; + +} // namespace utils +} // namespace td