]> git.tdb.fi Git - libs/game.git/blob - source/game/eventobserver.h
31735a696aeda3697977512fbb3e1b4729c944f0
[libs/game.git] / source / game / eventobserver.h
1 #ifndef MSP_GAME_EVENTOBSERVER_H_
2 #define MSP_GAME_EVENTOBSERVER_H_
3
4 #include <msp/core/algorithm.h>
5 #include <msp/core/noncopyable.h>
6 #include "eventbus.h"
7
8 namespace Msp::Game {
9
10 class EventSourceBase;
11
12 class EventObserver: public NonCopyable
13 {
14 private:
15         EventBus &bus;
16         std::vector<EventSourceBase *> observed_sources;
17
18 public:
19         EventObserver(EventBus &);
20         ~EventObserver();
21
22         template<typename T>
23         void observe(std::function<void(const T &)> cb)
24         { bus.add_observer<T>(*this, std::move(cb)); }
25
26         template<typename T, typename S>
27         void observe(S &, std::function<void(const T &)> );
28
29         void remove_source(EventSourceBase &);
30 };
31
32 template<typename T, typename S>
33 void EventObserver::observe(S &src, std::function<void(const T &)> cb)
34 {
35         src.add_observer(*this, std::move(cb));
36         auto i = lower_bound(observed_sources, &src);
37         if(i==observed_sources.end() || *i!=&src)
38                 observed_sources.insert(i, &src);
39 }
40
41 } // namespace Msp::Game
42
43 #endif