TheAtlasEngine
 
Loading...
Searching...
No Matches
event_bus.hpp
1#pragma once
2#include <core/event/event_listener.hpp>
3#include <type_traits>
4#include <any>
5#include <typeindex>
6
7namespace atlas::event {
8
13 class event_bus {
14 public:
15 event_bus() = default;
16
17 template<typename UEvent>
18 void create_listener() {
19 size_t id = type_id<UEvent>();
20 if (m_event_listeners.contains(id)) {
21 return;
22 }
23 m_event_listeners.emplace(id, listener<UEvent>());
24 }
25
26 template<typename UEvent, typename UObject, typename UCallback>
27 void subscribe(UObject* p_instance, const UCallback& p_callback) {
28 size_t id = type_id<UEvent>();
29
30 if (!m_event_listeners.contains(id)) {
31 create_listener<UEvent>();
32 return;
33 }
34
35 std::any_cast<atlas::event::listener<UEvent>&>(
36 m_event_listeners.at(id))
37 .subscribe(p_instance, p_callback);
38
39 // return listener<UEvent>().subscribe(p_instance, p_callback);
40 }
41
42 template<typename UEvent>
43 void publish(UEvent& p_event) {
44 size_t id = type_id<UEvent>();
45
46 if (!m_event_listeners.contains(id)) {
47 return;
48 }
49
50 std::any_cast<atlas::event::listener<UEvent>&>(
51 m_event_listeners.at(id))
52 .notify_all(p_event);
53 }
54
55 private:
56 template<typename UEvent>
57 size_t type_id() {
58 return typeid(UEvent).hash_code();
59 }
60
61 private:
62 std::unordered_map<size_t, std::any> m_event_listeners;
63 };
64};
Event bus that holds the responsibility to reroute events to the subscribers of those particular even...
Definition event_bus.hpp:13