@@ -29,17 +29,34 @@ SOFTWARE.
2929#include < any>
3030#include < functional>
3131#include < memory>
32- #include < typeindex>
33- #include < typeinfo>
3432#include < utility>
3533
3634#include " support/hashtable.h"
3735#include " support/list.h"
3836
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+
3950namespace PCSX {
4051
4152namespace EventBus {
4253
54+ #if PCSX_RTTI
55+ typedef std::size_t HashType;
56+ #else
57+ typedef std::uint64_t HashType;
58+ #endif
59+
4360struct ListenerElementBaseEventBusList {};
4461struct ListenerElementBase ;
4562typedef PCSX::Intrusive::List<ListenerElementBase> ListenerBaseListType;
@@ -70,7 +87,7 @@ class Listener {
7087};
7188
7289struct ListenerElementsHashTableList ;
73- typedef PCSX::Intrusive::HashTable<std:: size_t , ListenerElementsHashTableList> ListenersHashTable;
90+ typedef PCSX::Intrusive::HashTable<HashType , ListenerElementsHashTableList> ListenersHashTable;
7491struct ListenerElementsHashTableList : public ListenersHashTable ::Node {
7592 ~ListenerElementsHashTableList () { list.destroyAll (); }
7693 ListenerBaseEventBusList list;
@@ -82,7 +99,7 @@ class EventBus {
8299 template <typename Event>
83100 void signal (const Event& event) {
84101 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));
86103 if (list == m_table.end ()) return ;
87104 for (auto & listener : list->list ) {
88105 std::any cb = listener.getCB ();
@@ -92,7 +109,7 @@ class EventBus {
92109 }
93110
94111 private:
95- void listen (std:: size_t id, ListenerElementBase* listenerElement) {
112+ void listen (HashType id, ListenerElementBase* listenerElement) {
96113 auto list = m_table.find (id);
97114 if (list == m_table.end ()) {
98115 list = m_table.insert (id, new ListenerElementsHashTableList ());
@@ -107,7 +124,7 @@ template <typename Event>
107124void Listener::listen (typename ListenerElement<Event>::Functor&& cb) {
108125 ListenerElement<Event>* element = new ListenerElement (std::move (cb));
109126 m_listeners.push_back (element);
110- m_bus->listen (typeid (Event). hash_code ( ), element);
127+ m_bus->listen (PCSX_HASH_TYPE (Event), element);
111128}
112129
113130} // namespace EventBus
0 commit comments