add SlotGuard

This commit is contained in:
2025-08-06 14:07:23 +02:00
parent 990c6f078d
commit 079d653405
2 changed files with 31 additions and 3 deletions

View File

@@ -10,15 +10,16 @@ namespace utils {
template <typename... Args> template <typename... Args>
class Signal : private NonCopyable { class Signal : private NonCopyable {
private: public:
using FnType = void(Args...); using FnType = void(Args...);
using CallBack = std::function<FnType>; using CallBack = std::function<FnType>;
private:
std::vector<CallBack> m_Callbacks; std::vector<CallBack> m_Callbacks;
public: public:
void Connect(CallBack&& a_Callback) { void Connect(const CallBack& a_Callback) {
m_Callbacks.push_back(std::move(a_Callback)); m_Callbacks.push_back(a_Callback);
} }
void Disconnect(const CallBack& a_Callback) { void Disconnect(const CallBack& a_Callback) {

View File

@@ -0,0 +1,27 @@
#pragma once
#include <td/misc/SlotGuard.h>
namespace td {
namespace utils {
class SlotGuard {
private:
std::vector<std::function<void()>> m_Deleters;
public:
template <typename... Args>
void Connect(Signal<Args...>& a_Signal, const typename Signal<Args...>::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