X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Feventbus.h;h=95fc068254ebd297dc2103a4e15a6eed08fea9ba;hb=c7174843c35e0f1f8f2d6e2d4cdbb386f2a82361;hp=7da047ed1851b76b8bd79b6d903aa8b20c64b47e;hpb=db01a6ed506ea2352b20f10b2694e249d2bba6c5;p=libs%2Fgame.git diff --git a/source/game/eventbus.h b/source/game/eventbus.h index 7da047e..95fc068 100644 --- a/source/game/eventbus.h +++ b/source/game/eventbus.h @@ -3,6 +3,8 @@ #include #include +#include +#include "mspgame_api.h" namespace Msp::Game { @@ -26,10 +28,11 @@ struct EventDispatcher { std::erase_if(handlers, [obs](auto &h){ return h.observer==obs; }); } void dispatch(const T &) const; + void dispatch_to(EventObserver &, const T &) const; }; -class EventBus +class MSPGAME_API EventBus: public NonCopyable { private: using DeleteFunc = void(void *); @@ -44,6 +47,10 @@ private: std::vector dispatchers; +public: + ~EventBus(); + +private: static unsigned get_next_id(); public: @@ -64,6 +71,9 @@ public: template void dispatch(const T &) const; + + template + void dispatch_to(EventObserver &, const T &) const; }; @@ -74,6 +84,14 @@ void EventDispatcher::dispatch(const T &event) const h.callback(event); } +template +void EventDispatcher::dispatch_to(EventObserver &obs, const T &event) const +{ + for(const Handler &h: handlers) + if(h.observer==&obs) + h.callback(event); +} + template inline unsigned EventBus::get_event_id() @@ -108,6 +126,14 @@ inline void EventBus::dispatch(const T &event) const static_cast *>(dispatchers[id].dispatcher)->dispatch(event); } +template +inline void EventBus::dispatch_to(EventObserver &obs, const T &event) const +{ + unsigned id = get_event_id(); + if(id *>(dispatchers[id].dispatcher)->dispatch_to(obs, event); +} + } // namespace Msp::Game #endif