22#include "util/Mutex.hpp"
24#include <boost/signals2.hpp>
25#include <boost/signals2/connection.hpp>
26#include <boost/signals2/variadic_signal.hpp>
32#include <unordered_map>
43template <
typename Session,
typename... Args>
45 using ConnectionPtr = Session*;
46 using ConnectionSharedPtr = std::shared_ptr<Session>;
50 using ConnectionsMap = std::unordered_map<ConnectionPtr, boost::signals2::connection>;
53 using SignalType = boost::signals2::signal<void(Args...)>;
69 auto connections = connections_.template lock<std::scoped_lock>();
70 if (connections->contains(trackable.get())) {
79 trackable.get(), signal_.connect(
typename SignalType::slot_type(slot).track_foreign(trackable))
94 if (
auto connections = connections_.template lock<std::scoped_lock>(); connections->contains(trackablePtr)) {
95 connections->operator[](trackablePtr).
disconnect();
96 connections->erase(trackablePtr);
108 emit(Args
const&... args)
const
119 return connections_.template lock<std::scoped_lock>()->size();
A thread-safe class to manage a signal and its tracking connections.
Definition TrackableSignal.hpp:44
bool disconnect(ConnectionPtr trackablePtr)
Disconnect a slot to the signal.
Definition TrackableSignal.hpp:92
std::size_t count() const
Get the number of connections.
Definition TrackableSignal.hpp:117
void emit(Args const &... args) const
Calling all slots.
Definition TrackableSignal.hpp:108
bool connectTrackableSlot(ConnectionSharedPtr const &trackable, std::function< void(Args...)> slot)
Connect a slot to the signal, the slot will be called when the signal is emitted and trackable is sti...
Definition TrackableSignal.hpp:67
A container for data that is protected by a mutex. Inspired by Mutex in Rust.
Definition Mutex.hpp:96