TARAXA
Loading...
Searching...
No Matches
event.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <map>
5#include <mutex>
6#include <shared_mutex>
7
9
11
12template <typename Payload>
13struct EventEmitter;
14
15template <typename Payload>
17 using Handler = std::function<void(Payload const &)>;
18
19 protected:
20 class State {
21 friend struct EventSubscriber;
22 friend struct EventEmitter<Payload>;
23
25 std::map<uint64_t, Handler> subs_;
26 std::shared_mutex mu_;
27 } mutable state_;
28
29 EventSubscriber() = default;
30
31 public:
32 auto subscribe(Handler &&handler, std::shared_ptr<util::ThreadPool> execution_context) const {
33 std::unique_lock l(state_.mu_);
34 auto subscription_id = ++state_.next_subscription_id_;
35 state_.subs_[subscription_id] = [exec = std::move(execution_context), h = std::move(handler)](auto const &payload) {
36 exec->post([&h, payload] { h(payload); });
37 };
38 return subscription_id;
39 }
40
41 auto unsubscribe(uint64_t subscription_id) const {
42 std::unique_lock l(state_.mu_);
43 return state_.subs_.erase(subscription_id);
44 }
45};
46
47template <typename Payload>
48struct EventEmitter : virtual EventSubscriber<Payload> {
50
51 void emit(Payload const &payload) const {
52 std::shared_lock l(Subscriber::state_.mu_);
53 for (auto const &[_, subscription] : Subscriber::state_.subs_) {
54 subscription(payload);
55 }
56 }
57};
58
59template <class Owner, typename Payload>
60class Event : virtual EventEmitter<Payload>, public virtual EventSubscriber<Payload> {
61 friend Owner;
62};
63
64} // namespace taraxa::util::event
65
66namespace taraxa::util {
67using event::Event;
70} // namespace taraxa::util
Definition event.hpp:60
friend Owner
Definition event.hpp:61
std::map< uint64_t, Handler > subs_
Definition event.hpp:25
std::shared_mutex mu_
Definition event.hpp:26
uint64_t next_subscription_id_
Definition event.hpp:24
Definition event.hpp:10
Definition default_construct_copyable_movable.hpp:10
Definition event.hpp:48
void emit(Payload const &payload) const
Definition event.hpp:51
class taraxa::util::event::EventSubscriber::State state_
auto unsubscribe(uint64_t subscription_id) const
Definition event.hpp:41
auto subscribe(Handler &&handler, std::shared_ptr< util::ThreadPool > execution_context) const
Definition event.hpp:32
std::function< void(Payload const &)> Handler
Definition event.hpp:17