TARAXA
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 
8 #include "common/functional.hpp"
9 
11 
12 template <typename Payload>
13 struct EventEmitter;
14 
15 template <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 
24  uint64_t next_subscription_id_ = 0;
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, task_executor_t &&execution_context = current_thread_executor()) 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([&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 
47 template <typename Payload>
48 struct 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 
59 template <class Owner, typename Payload>
60 class Event : virtual EventEmitter<Payload>, public virtual EventSubscriber<Payload> {
61  friend Owner;
62 };
63 
64 } // namespace taraxa::util::event
65 
66 namespace taraxa::util {
67 using 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
task_executor_t current_thread_executor()
Definition: functional.hpp:9
std::function< void(task_t &&)> task_executor_t
Definition: functional.hpp:7
Definition: event.hpp:48
void emit(Payload const &payload) const
Definition: event.hpp:51
Definition: event.hpp:16
class taraxa::util::event::EventSubscriber::State state_
auto unsubscribe(uint64_t subscription_id) const
Definition: event.hpp:41
auto subscribe(Handler &&handler, task_executor_t &&execution_context=current_thread_executor()) const
Definition: event.hpp:32
std::function< void(Payload const &)> Handler
Definition: event.hpp:17