@@ -29,17 +29,34 @@ SOFTWARE.
29
29
#include < any>
30
30
#include < functional>
31
31
#include < memory>
32
- #include < typeindex>
33
- #include < typeinfo>
34
32
#include < utility>
35
33
36
34
#include " support/hashtable.h"
37
35
#include " support/list.h"
38
36
37
+ #if defined(_CPPRTTI) || defined(__GXX_RTTI) || defined(__cpp_rtti)
38
+ #define PCSX_RTTI 1
39
+ #include < typeindex>
40
+ #include < typeinfo>
41
+ #define PCSX_HASH_TYPE (type ) typeid (type).hash_code()
42
+ #else
43
+ #define PCSX_RTTI 0
44
+ #define CTTI_HAS_ENUM_AWARE_PRETTY_FUNCTION 1
45
+ #define CTTI_HAS_VARIABLE_TEMPLATES 1
46
+ #include " ctti/type_id.hpp"
47
+ #define PCSX_HASH_TYPE (type ) ctti::unnamed_type_id<type>().hash()
48
+ #endif
49
+
39
50
namespace PCSX {
40
51
41
52
namespace EventBus {
42
53
54
+ #if PCSX_RTTI
55
+ typedef std::size_t HashType;
56
+ #else
57
+ typedef std::uint64_t HashType;
58
+ #endif
59
+
43
60
struct ListenerElementBaseEventBusList {};
44
61
struct ListenerElementBase ;
45
62
typedef PCSX::Intrusive::List<ListenerElementBase> ListenerBaseListType;
@@ -70,7 +87,7 @@ class Listener {
70
87
};
71
88
72
89
struct ListenerElementsHashTableList ;
73
- typedef PCSX::Intrusive::HashTable<std:: size_t , ListenerElementsHashTableList> ListenersHashTable;
90
+ typedef PCSX::Intrusive::HashTable<HashType , ListenerElementsHashTableList> ListenersHashTable;
74
91
struct ListenerElementsHashTableList : public ListenersHashTable ::Node {
75
92
~ListenerElementsHashTableList () { list.destroyAll (); }
76
93
ListenerBaseEventBusList list;
@@ -82,7 +99,7 @@ class EventBus {
82
99
template <typename Event>
83
100
void signal (const Event& event) {
84
101
using Functor = typename ListenerElement<Event>::Functor;
85
- auto list = m_table.find (typeid (Event). hash_code ( ));
102
+ auto list = m_table.find (PCSX_HASH_TYPE (Event));
86
103
if (list == m_table.end ()) return ;
87
104
for (auto & listener : list->list ) {
88
105
std::any cb = listener.getCB ();
@@ -92,7 +109,7 @@ class EventBus {
92
109
}
93
110
94
111
private:
95
- void listen (std:: size_t id, ListenerElementBase* listenerElement) {
112
+ void listen (HashType id, ListenerElementBase* listenerElement) {
96
113
auto list = m_table.find (id);
97
114
if (list == m_table.end ()) {
98
115
list = m_table.insert (id, new ListenerElementsHashTableList ());
@@ -107,7 +124,7 @@ template <typename Event>
107
124
void Listener::listen (typename ListenerElement<Event>::Functor&& cb) {
108
125
ListenerElement<Event>* element = new ListenerElement (std::move (cb));
109
126
m_listeners.push_back (element);
110
- m_bus->listen (typeid (Event). hash_code ( ), element);
127
+ m_bus->listen (PCSX_HASH_TYPE (Event), element);
111
128
}
112
129
113
130
} // namespace EventBus
0 commit comments