Skip to content

Commit 675f7e7

Browse files
authored
Merge pull request #1942 from grumpycoders/eventbus-no-rtti
Alternative to rtti for the event bus.
2 parents 2af96b5 + 27e9e1c commit 675f7e7

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/support/eventbus.h

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3950
namespace PCSX {
4051

4152
namespace EventBus {
4253

54+
#if PCSX_RTTI
55+
typedef std::size_t HashType;
56+
#else
57+
typedef std::uint64_t HashType;
58+
#endif
59+
4360
struct ListenerElementBaseEventBusList {};
4461
struct ListenerElementBase;
4562
typedef PCSX::Intrusive::List<ListenerElementBase> ListenerBaseListType;
@@ -70,7 +87,7 @@ class Listener {
7087
};
7188

7289
struct ListenerElementsHashTableList;
73-
typedef PCSX::Intrusive::HashTable<std::size_t, ListenerElementsHashTableList> ListenersHashTable;
90+
typedef PCSX::Intrusive::HashTable<HashType, ListenerElementsHashTableList> ListenersHashTable;
7491
struct 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>
107124
void 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

Comments
 (0)