Skip to content

Commit 312fe6d

Browse files
committed
Events no longer need to be inherited from Event, they can be any class.
See #85.
1 parent a99d4ca commit 312fe6d

3 files changed

Lines changed: 18 additions & 25 deletions

File tree

entityx/Event.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,4 @@ EventManager::EventManager() {
2323
EventManager::~EventManager() {
2424
}
2525

26-
void EventManager::emit(const BaseEvent &event) {
27-
auto sig = signal_for(event.my_family());
28-
sig->emit(&event);
29-
}
30-
3126
} // namespace entityx

entityx/Event.h

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@ class BaseEvent {
3232

3333
virtual ~BaseEvent();
3434

35-
virtual Family my_family() const = 0;
36-
3735
protected:
3836
static Family family_counter_;
3937
};
4038

4139

42-
typedef Simple::Signal<void (const BaseEvent*)> EventSignal;
40+
typedef Simple::Signal<void (const void*)> EventSignal;
4341
typedef std::shared_ptr<EventSignal> EventSignalPtr;
4442
typedef std::weak_ptr<EventSignal> EventSignalWeakPtr;
4543

@@ -60,8 +58,6 @@ class Event : public BaseEvent {
6058
static Family family = family_counter_++;
6159
return family;
6260
}
63-
64-
virtual Family my_family() const override { return Derived::family(); }
6561
};
6662

6763

@@ -128,13 +124,13 @@ class EventManager : entityx::help::NonCopyable {
128124
template <typename E, typename Receiver>
129125
void subscribe(Receiver &receiver) {
130126
void (Receiver::*receive)(const E &) = &Receiver::receive;
131-
auto sig = signal_for(E::family());
127+
auto sig = signal_for(Event<E>::family());
132128
auto wrapper = EventCallbackWrapper<E>(std::bind(receive, &receiver, std::placeholders::_1));
133129
auto connection = sig->connect(wrapper);
134130
BaseReceiver &base = receiver;
135-
base.connections_.insert(std::make_pair(E::family(), std::make_pair(EventSignalWeakPtr(sig), connection)));
131+
base.connections_.insert(std::make_pair(Event<E>::family(), std::make_pair(EventSignalWeakPtr(sig), connection)));
136132
}
137-
133+
138134
/**
139135
* Unsubscribe an object in order to not receive events of type E anymore.
140136
*
@@ -145,26 +141,29 @@ class EventManager : entityx::help::NonCopyable {
145141
void unsubscribe(Receiver &receiver) {
146142
BaseReceiver &base = receiver;
147143
//Assert that it has been subscribed before
148-
assert(base.connections_.find(E::family()) != base.connections_.end());
149-
auto pair = base.connections_[E::family()];
144+
assert(base.connections_.find(Event<E>::family()) != base.connections_.end());
145+
auto pair = base.connections_[Event<E>::family()];
150146
auto connection = pair.second;
151147
auto &ptr = pair.first;
152148
if (!ptr.expired()) {
153149
ptr.lock()->disconnect(connection);
154150
}
155-
base.connections_.erase(E::family());
151+
base.connections_.erase(Event<E>::family());
156152
}
157153

158-
void emit(const BaseEvent &event);
154+
template <typename E>
155+
void emit(const E &event) {
156+
auto sig = signal_for(Event<E>::family());
157+
sig->emit(&event);
158+
}
159159

160160
/**
161161
* Emit an already constructed event.
162162
*/
163163
template <typename E>
164164
void emit(std::unique_ptr<E> event) {
165-
auto sig = signal_for(E::family());
166-
BaseEvent *base = event.get();
167-
sig->emit(base);
165+
auto sig = signal_for(Event<E>::family());
166+
sig->emit(event.get());
168167
}
169168

170169
/**
@@ -182,9 +181,8 @@ class EventManager : entityx::help::NonCopyable {
182181
void emit(Args && ... args) {
183182
// Using 'E event(std::forward...)' causes VS to fail with an internal error. Hack around it.
184183
E event = E(std::forward<Args>(args) ...);
185-
auto sig = signal_for(std::size_t(E::family()));
186-
BaseEvent *base = &event;
187-
sig->emit(base);
184+
auto sig = signal_for(std::size_t(Event<E>::family()));
185+
sig->emit(&event);
188186
}
189187

190188
std::size_t connected_receivers() const {
@@ -208,7 +206,7 @@ class EventManager : entityx::help::NonCopyable {
208206
template <typename E>
209207
struct EventCallbackWrapper {
210208
EventCallbackWrapper(std::function<void(const E &)> callback) : callback(callback) {}
211-
void operator()(const BaseEvent* event) { callback(*(static_cast<const E*>(event))); }
209+
void operator()(const void *event) { callback(*(static_cast<const E*>(event))); }
212210
std::function<void(const E &)> callback;
213211
};
214212

entityx/Event_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ using entityx::Event;
2121
using entityx::Receiver;
2222

2323

24-
struct Explosion : public Event<Explosion> {
24+
struct Explosion {
2525
explicit Explosion(int damage) : damage(damage) {}
2626
int damage;
2727
};

0 commit comments

Comments
 (0)