yaze 0.2.0
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
message.h
Go to the documentation of this file.
1#ifndef YAZE_APP_CORE_MESSAGE_H
2#define YAZE_APP_CORE_MESSAGE_H
3
4#include <any>
5#include <functional>
6#include <mutex>
7#include <queue>
8#include <string>
9#include <thread>
10#include <unordered_map>
11#include <vector>
12
13#include "absl/status/status.h"
14
15namespace yaze {
16namespace app {
17namespace core {
18
19struct Message {
20 std::string type;
21 void* sender;
22 std::any payload;
23
24 Message() = default;
25 Message(const std::string& type, void* sender, const std::any& payload)
27};
28
30 public:
31 virtual ~IMessageListener() = default;
32 virtual absl::Status OnMessageReceived(const Message& message) = 0;
33};
34
36 public:
37 virtual ~IMessageProtocol() = default;
38 virtual bool CanHandleMessage(const Message& message) const = 0;
39};
40
42 public:
43 virtual ~MessageFilter() = default;
44 virtual bool ShouldReceiveMessage(const Message& message) const = 0;
45};
46
47using MessageHandler = std::function<void(const Message&)>;
48
50 public:
51 void RegisterListener(const std::string& message_type,
52 IMessageListener* listener);
53 void UnregisterListener(const std::string& message_type,
54 IMessageListener* listener);
55 void RegisterProtocol(IMessageProtocol* protocol);
56 void RegisterFilteredListener(const std::string& message_type,
57 IMessageListener* listener,
58 std::unique_ptr<MessageFilter> filter);
59 void BindHandler(const std::string& message_type, MessageHandler handler);
60 void SendMessage(const Message& message);
61 void DispatchMessage(const Message& message);
62
63 private:
66 std::unique_ptr<MessageFilter> filter;
67 };
68 std::unordered_map<std::string, std::vector<IMessageListener*>> listeners_;
69 std::unordered_map<std::string, std::vector<ListenerWithFilter>>
71 std::unordered_map<std::string, std::vector<MessageHandler>> handlers_;
72 std::vector<IMessageProtocol*> protocols_;
73};
74
76 public:
77 void Start();
78 void Stop();
79 void EnqueueMessage(const Message& message);
80
81 private:
82 void DispatchLoop();
83 std::queue<Message> messageQueue_;
84 std::mutex queueMutex_;
85 std::thread dispatchThread_;
86 bool running_ = false;
87};
88
89class Swizzler {
90 public:
91 template <typename T>
92 void Swizzle(T* instance, void (T::*original_method)(),
93 std::function<void()> new_method);
94
95 template <typename T>
96 void CallOriginal(T* instance);
97
98 template <typename T>
99 void CallSwizzled(T* instance);
100
101 private:
102 std::unordered_map<void*, std::function<void()>> swizzled_methods_;
103 std::unordered_map<void*, void*> original_methods_;
104};
105
107 public:
108 virtual ~Reflectable() = default;
109 virtual std::string GetTypeName() const = 0;
110 virtual std::vector<std::string> GetPropertyNames() const = 0;
111 virtual std::any GetPropertyValue(const std::string& property_name) const = 0;
112 virtual void SetPropertyValue(const std::string& property_name,
113 const std::any& value) = 0;
114 virtual std::any InvokeMethod(const std::string& method_name,
115 const std::vector<std::any>& args) = 0;
116};
117
119 public:
120 template <typename T>
121 void RegisterType(const std::string& type_name);
122
123 std::unique_ptr<Reflectable> CreateObject(const std::string& type_name) const;
124
125 private:
126 std::unordered_map<std::string, std::function<std::unique_ptr<Reflectable>()>>
128};
129
130} // namespace core
131} // namespace app
132} // namespace yaze
133
134#endif // YAZE_APP_CORE_MESSAGE_H
void EnqueueMessage(const Message &message)
Definition message.cc:80
std::queue< Message > messageQueue_
Definition message.h:83
virtual absl::Status OnMessageReceived(const Message &message)=0
virtual ~IMessageListener()=default
virtual ~IMessageProtocol()=default
virtual bool CanHandleMessage(const Message &message) const =0
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
virtual bool ShouldReceiveMessage(const Message &message) const =0
virtual ~MessageFilter()=default
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
virtual std::any InvokeMethod(const std::string &method_name, const std::vector< std::any > &args)=0
virtual void SetPropertyValue(const std::string &property_name, const std::any &value)=0
virtual std::vector< std::string > GetPropertyNames() const =0
virtual std::string GetTypeName() const =0
virtual std::any GetPropertyValue(const std::string &property_name) const =0
virtual ~Reflectable()=default
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
std::unique_ptr< MessageFilter > filter
Definition message.h:66
Message(const std::string &type, void *sender, const std::any &payload)
Definition message.h:25