yaze 0.2.0
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
message.cc
Go to the documentation of this file.
1#include "message.h"
2
3namespace yaze {
4namespace app {
5namespace core {
6
7#pragma mark - MessageDispatcher
8
9void MessageDispatcher::RegisterListener(const std::string& message_type,
10 IMessageListener* listener) {
11 listeners_[message_type].push_back(listener);
12}
13
14void MessageDispatcher::UnregisterListener(const std::string& message_type,
15 IMessageListener* listener) {
16 auto& listener_list = listeners_[message_type];
17 listener_list.erase(
18 std::remove(listener_list.begin(), listener_list.end(), listener),
19 listener_list.end());
20}
21
23 protocols_.push_back(protocol);
24}
25
27 const std::string& message_type, IMessageListener* listener,
28 std::unique_ptr<MessageFilter> filter) {
29 filtered_listeners_[message_type].push_back({listener, std::move(filter)});
30}
31
32void MessageDispatcher::BindHandler(const std::string& message_type,
33 MessageHandler handler) {
34 handlers_[message_type].push_back(handler);
35}
36
38 const auto& listener_list = listeners_[message.type];
39 for (auto listener : listener_list) {
40 listener->OnMessageReceived(message);
41 }
42}
43
45 for (auto protocol : protocols_) {
46 if (protocol->CanHandleMessage(message)) {
47 return;
48 }
49 }
50
51 const auto& listener_list = listeners_[message.type];
52 for (auto listener : listener_list) {
53 listener->OnMessageReceived(message);
54 }
55
56 const auto& filtered_listener_list = filtered_listeners_[message.type];
57 for (auto& listener : filtered_listener_list) {
58 if (listener.filter->ShouldReceiveMessage(message)) {
59 listener.listener->OnMessageReceived(message);
60 }
61 }
62
63 const auto& handler_list = handlers_[message.type];
64 for (auto& handler : handler_list) {
65 handler(message);
66 }
67}
68
69#pragma mark - AsyncMessageDispatcher
70
72 // Start a new thread and run the message loop.
73
74}
75
77 // Stop the message loop and join the thread.
78}
79
81 // Enqueue a message to the message loop.
82}
83
85 // Dispatch messages in a loop.
86}
87
88#pragma mark - MessageFilter
89
90template <typename T>
91void Swizzler::Swizzle(T* instance, void (T::*original_method)(),
92 std::function<void()> new_method) {
93 original_methods_[instance] = original_method;
94 swizzled_methods_[instance] = new_method;
95}
96
97template <typename T>
98void Swizzler::CallOriginal(T* instance) {
99 auto it = original_methods_.find(instance);
100 if (it != original_methods_.end()) {
101 (instance->*(it->second))();
102 }
103}
104
105template <typename T>
106void Swizzler::CallSwizzled(T* instance) {
107 auto it = swizzled_methods_.find(instance);
108 if (it != swizzled_methods_.end()) {
109 it->second();
110 }
111}
112
113#pragma mark - ObjectFactory
114
115template <typename T>
116void ObjectFactory::RegisterType(const std::string& type_name) {
117 creators_[type_name] = []() { return std::make_unique<T>(); };
118}
119
120std::unique_ptr<Reflectable> ObjectFactory::CreateObject(
121 const std::string& object_name) const {
122 auto it = creators_.find(object_name);
123 if (it != creators_.end()) {
124 return it->second();
125 }
126 return nullptr;
127}
128
129} // namespace core
130} // namespace app
131} // namespace yaze
void EnqueueMessage(const Message &message)
Definition message.cc:80
std::vector< IMessageProtocol * > protocols_
Definition message.h:72
void UnregisterListener(const std::string &message_type, IMessageListener *listener)
Definition message.cc:14
void RegisterListener(const std::string &message_type, IMessageListener *listener)
Definition message.cc:9
void BindHandler(const std::string &message_type, MessageHandler handler)
Definition message.cc:32
std::unordered_map< std::string, std::vector< ListenerWithFilter > > filtered_listeners_
Definition message.h:70
std::unordered_map< std::string, std::vector< IMessageListener * > > listeners_
Definition message.h:68
void SendMessage(const Message &message)
Definition message.cc:37
void DispatchMessage(const Message &message)
Definition message.cc:44
std::unordered_map< std::string, std::vector< MessageHandler > > handlers_
Definition message.h:71
void RegisterProtocol(IMessageProtocol *protocol)
Definition message.cc:22
void RegisterFilteredListener(const std::string &message_type, IMessageListener *listener, std::unique_ptr< MessageFilter > filter)
Definition message.cc:26
std::unique_ptr< Reflectable > CreateObject(const std::string &type_name) const
Definition message.cc:120
std::unordered_map< std::string, std::function< std::unique_ptr< Reflectable >()> > creators_
Definition message.h:127
void RegisterType(const std::string &type_name)
Definition message.cc:116
void CallOriginal(T *instance)
Definition message.cc:98
std::unordered_map< void *, void * > original_methods_
Definition message.h:103
void Swizzle(T *instance, void(T::*original_method)(), std::function< void()> new_method)
Definition message.cc:91
void CallSwizzled(T *instance)
Definition message.cc:106
std::unordered_map< void *, std::function< void()> > swizzled_methods_
Definition message.h:102
std::function< void(const Message &)> MessageHandler
Definition message.h:47
Definition common.cc:21