1 #ifndef MSP_GAME_EVENTOBSERVER_H_
2 #define MSP_GAME_EVENTOBSERVER_H_
4 #include <msp/core/algorithm.h>
5 #include <msp/core/noncopyable.h>
7 #include "mspgame_api.h"
11 class EventSourceBase;
13 class MSPGAME_API EventObserver: public NonCopyable
17 std::vector<EventSourceBase *> observed_sources;
20 EventObserver(EventBus &);
24 void observe(std::function<void(const T &)> cb)
25 { bus.add_observer<T>(*this, std::move(cb)); }
27 template<typename T, typename S>
28 void observe(S &, std::function<void(const T &)> );
30 void remove_source(EventSourceBase &);
33 template<typename T, typename S>
34 void EventObserver::observe(S &src, std::function<void(const T &)> cb)
36 src.add_observer(*this, std::move(cb));
37 auto i = lower_bound(observed_sources, &src);
38 if(i==observed_sources.end() || *i!=&src)
39 observed_sources.insert(i, &src);
42 } // namespace Msp::Game