Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
TrackableSignalMap.hpp
1#pragma once
2
3#include "feed/impl/TrackableSignal.hpp"
4#include "util/Mutex.hpp"
5
6#include <boost/signals2.hpp>
7
8#include <concepts>
9#include <cstddef>
10#include <functional>
11#include <memory>
12#include <mutex>
13#include <unordered_map>
14
15namespace feed::impl {
16
17template <typename T>
18concept Hashable = requires(T a) {
19 { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
20};
21
29template <Hashable Key, typename Session, typename... Args>
31 using ConnectionPtr = Session*;
32 using ConnectionSharedPtr = std::shared_ptr<Session>;
33
34 using SignalsMap = std::unordered_map<Key, TrackableSignal<Session, Args...>>;
35 util::Mutex<SignalsMap> signalsMap_;
36
37public:
50 bool
52 ConnectionSharedPtr const& trackable,
53 Key const& key,
54 std::function<void(Args...)> slot
55 )
56 {
57 auto map = signalsMap_.template lock<std::scoped_lock>();
58 return map->operator[](key).connectTrackableSlot(trackable, slot);
59 }
60
69 bool
70 disconnect(ConnectionPtr trackablePtr, Key const& key)
71 {
72 auto map = signalsMap_.template lock<std::scoped_lock>();
73 if (!map->contains(key))
74 return false;
75
76 auto const disconnected = map->operator[](key).disconnect(trackablePtr);
77 // clean the map if there is no connection left.
78 if (disconnected && map->operator[](key).count() == 0)
79 map->erase(key);
80
81 return disconnected;
82 }
83
90 void
91 emit(Key const& key, Args const&... args)
92 {
93 auto map = signalsMap_.template lock<std::scoped_lock>();
94 if (map->contains(key))
95 map->operator[](key).emit(args...);
96 }
97};
98} // namespace feed::impl
Class to manage a map of key and its associative signal.
Definition TrackableSignalMap.hpp:30
void emit(Key const &key, Args const &... args)
Emit the signal with the given key and arguments.
Definition TrackableSignalMap.hpp:91
bool disconnect(ConnectionPtr trackablePtr, Key const &key)
Disconnect a slot from the key's associative signal.
Definition TrackableSignalMap.hpp:70
bool connectTrackableSlot(ConnectionSharedPtr const &trackable, Key const &key, 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 TrackableSignalMap.hpp:51
A thread-safe class to manage a signal and its tracking connections.
Definition TrackableSignal.hpp:26
A container for data that is protected by a mutex. Inspired by Mutex in Rust.
Definition Mutex.hpp:82
Definition TrackableSignalMap.hpp:18