]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/eventbus.h
Prefix C++ types with namespaces in the setup generator
[libs/game.git] / source / game / eventbus.h
index 7da047ed1851b76b8bd79b6d903aa8b20c64b47e..95fc068254ebd297dc2103a4e15a6eed08fea9ba 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <functional>
 #include <vector>
+#include <msp/core/noncopyable.h>
+#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<Dispatcher> dispatchers;
 
+public:
+       ~EventBus();
+
+private:
        static unsigned get_next_id();
 
 public:
@@ -64,6 +71,9 @@ public:
 
        template<typename T>
        void dispatch(const T &) const;
+
+       template<typename T>
+       void dispatch_to(EventObserver &, const T &) const;
 };
 
 
@@ -74,6 +84,14 @@ void EventDispatcher<T>::dispatch(const T &event) const
                h.callback(event);
 }
 
+template<typename T>
+void EventDispatcher<T>::dispatch_to(EventObserver &obs, const T &event) const
+{
+       for(const Handler &h: handlers)
+               if(h.observer==&obs)
+                       h.callback(event);
+}
+
 
 template<typename T>
 inline unsigned EventBus::get_event_id()
@@ -108,6 +126,14 @@ inline void EventBus::dispatch(const T &event) const
                static_cast<EventDispatcher<T> *>(dispatchers[id].dispatcher)->dispatch(event);
 }
 
+template<typename T>
+inline void EventBus::dispatch_to(EventObserver &obs, const T &event) const
+{
+       unsigned id = get_event_id<T>();
+       if(id<dispatchers.size() && dispatchers[id].dispatcher)
+               static_cast<EventDispatcher<T> *>(dispatchers[id].dispatcher)->dispatch_to(obs, event);
+}
+
 } // namespace Msp::Game
 
 #endif