@@ -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;
4341typedef std::shared_ptr<EventSignal> EventSignalPtr;
4442typedef 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
0 commit comments