|
4 | 4 | #include <vector> |
5 | 5 |
|
6 | 6 | #include "ESPressio_IObservable.hpp" |
| 7 | +#include "ESPressio_IObserver.hpp" |
7 | 8 |
|
8 | 9 | namespace ESPressio { |
9 | 10 |
|
10 | 11 | namespace Observable { |
11 | 12 |
|
12 | 13 | class Observable : public IObservable { |
13 | 14 | private: |
14 | | - std::vector<void*> observers; |
| 15 | + std::vector<IObserver*> _observers; |
15 | 16 | protected: |
16 | 17 | /// Will call the `callback` for each Observer |
17 | | - virtual void WithObservers(std::function<void(void*)> callback) { |
18 | | - for (auto observer : observers) { |
| 18 | + virtual void WithObservers(std::function<void(IObserver*)> callback) { |
| 19 | + for (auto observer : _observers) { |
19 | 20 | callback(observer); |
20 | 21 | } |
21 | 22 | } |
22 | 23 |
|
23 | 24 | /// Will call the `callback` for each Observer that is of type `ObserverType` |
24 | 25 | template <class ObserverType> |
25 | 26 | void WithObservers(std::function<void(ObserverType*)> callback) { |
26 | | - for (auto observer : observers) { |
| 27 | + for (auto observer : _observers) { |
27 | 28 | ObserverType* observerAsT = dynamic_cast<ObserverType*>(observer); |
28 | 29 | if (!observerAsT) { continue; } |
29 | 30 | callback(observerAsT); |
30 | 31 | } |
31 | 32 | } |
32 | 33 | public: |
33 | | - virtual void RegisterObserver(void* observer) { |
| 34 | + virtual void RegisterObserver(IObserver* observer) { |
34 | 35 | if (IsObserverRegistered(observer)) { return; } |
35 | | - observers.push_back(observer); |
| 36 | + _observers.push_back(observer); |
36 | 37 | } |
37 | 38 |
|
38 | | - virtual void UnregisterObserver(void* observer) { |
39 | | - for (auto thisObserver = observers.begin(); thisObserver != observers.end(); thisObserver++) { |
| 39 | + virtual void UnregisterObserver(IObserver* observer) { |
| 40 | + for (auto thisObserver = _observers.begin(); thisObserver != _observers.end(); thisObserver++) { |
40 | 41 | if (*thisObserver == observer) { |
41 | | - observers.erase(thisObserver); |
| 42 | + _observers.erase(thisObserver); |
42 | 43 | return; |
43 | 44 | } |
44 | 45 | } |
45 | 46 | } |
46 | 47 |
|
47 | | - virtual bool IsObserverRegistered(void* observer) { |
48 | | - for (auto thisObserver : observers) { |
| 48 | + virtual bool IsObserverRegistered(IObserver* observer) { |
| 49 | + for (auto thisObserver : _observers) { |
49 | 50 | if (thisObserver == observer) { return true; } |
50 | 51 | } |
51 | 52 | return false; |
|
0 commit comments