diff options
Diffstat (limited to 'app/source/Cplt/Utils/Sigslot.hpp')
-rw-r--r-- | app/source/Cplt/Utils/Sigslot.hpp | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/app/source/Cplt/Utils/Sigslot.hpp b/app/source/Cplt/Utils/Sigslot.hpp index a4ab94e..92c8bcc 100644 --- a/app/source/Cplt/Utils/Sigslot.hpp +++ b/app/source/Cplt/Utils/Sigslot.hpp @@ -8,25 +8,21 @@ #include <utility> #include <vector> -class SignalStub -{ +class SignalStub { public: /// Non-template interface for Signal<T...> to implement (a barrier to stop template /// arguments propagation). - class IWrapper - { + class IWrapper { public: virtual ~IWrapper() = default; virtual void RemoveFunction(int id) = 0; }; - enum - { + enum { InvalidId = -1, }; - struct Connection - { + struct Connection { SlotGuard* guard; int slotId; int id = InvalidId; // If `InvalidId`, then this "spot" is unused @@ -59,8 +55,7 @@ private: }; template <class... TArgs> -class Signal : public SignalStub::IWrapper -{ +class Signal : public SignalStub::IWrapper { private: // Must be in this order so that mFunctions is still intact when mStub's destructor runs std::vector<std::function<void(TArgs...)>> mFunctions; @@ -68,8 +63,7 @@ private: public: Signal() - : mStub(*this) - { + : mStub(*this) { } virtual ~Signal() = default; @@ -79,8 +73,7 @@ public: Signal(Signal&&) = default; Signal& operator=(Signal&&) = default; - void operator()(TArgs... args) - { + void operator()(TArgs... args) { for (auto& conn : mStub.GetConnections()) { if (conn.IsOccupied()) { mFunctions[conn.id](std::forward<TArgs>(args)...); @@ -89,8 +82,7 @@ public: } template <class TFunction> - int Connect(TFunction slot) - { + int Connect(TFunction slot) { auto& conn = mStub.InsertConnection(); mFunctions.resize(std::max(mFunctions.size(), (size_t)conn.id + 1)); mFunctions[conn.id] = std::move(slot); @@ -98,31 +90,26 @@ public: } template <class TFunction> - int Connect(SlotGuard& guard, TFunction slot) - { + int Connect(SlotGuard& guard, TFunction slot) { auto& conn = mStub.InsertConnection(&guard); mFunctions.resize(std::max(mFunctions.size(), (size_t)conn.id + 1)); mFunctions[conn.id] = std::move(slot); return conn.id; } - void Disconnect(int id) - { + void Disconnect(int id) { mStub.RemoveConnection(id); } - void DisconnectFor(SlotGuard& guard) - { + void DisconnectFor(SlotGuard& guard) { mStub.RemoveConnectionFor(guard); } - void DisconnectAll() - { + void DisconnectAll() { mStub.RemoveAllConnections(); } - virtual void RemoveFunction(int id) - { + virtual void RemoveFunction(int id) { mFunctions[id] = {}; } }; @@ -130,11 +117,9 @@ public: /// Automatic disconnection mechanism for Signal<>. /// Bind connection to this guard by using the Connect(SlotGuard&, TFunction) overload. /// Either DisconnectAll() or the destructor disconnects all connections bound to this guard. -class SlotGuard -{ +class SlotGuard { private: - struct Connection - { + struct Connection { SignalStub* stub = nullptr; int stubId = SignalStub::InvalidId; }; |