Skip to content

Commit 8f39abb

Browse files
committed
- Initial implementation of the basic Observer System
1 parent b666d86 commit 8f39abb

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

src/ESPressio_IObservable.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <functional>
44
#include <memory>
55

6+
#include "ESPressio_IObserver.hpp"
7+
68
namespace ESPressio {
79

810
namespace Observable {
@@ -20,12 +22,12 @@ namespace ESPressio {
2022

2123
class IObservable : public std::enable_shared_from_this<IObservable> {
2224
public:
23-
/// Will Register the `void*` (Pointer to an Observer Object) with this `IObservable`
24-
virtual void RegisterObserver(void* observer) = 0;
25-
/// Will Unregister the `void*` (Pointer to an Observer Object) from this `IObservable`
26-
virtual void UnregisterObserver(void* observer) = 0;
27-
/// Will return `true` if the `void*` (Pointer to an Observer Object) is registered with this `IObservable`
28-
virtual bool IsObserverRegistered(void* observer) = 0;
25+
/// Will Register the`IObserver` with this `IObservable`
26+
virtual void RegisterObserver(IObserver* observer) = 0;
27+
/// Will Unregister the `IObserver` from this `IObservable`
28+
virtual void UnregisterObserver(IObserver* observer) = 0;
29+
/// Will return `true` if the `IObserver` is registered with this `IObservable`
30+
virtual bool IsObserverRegistered(IObserver* observer) = 0;
2931
};
3032

3133
}

src/ESPressio_IObserver.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
namespace ESPressio {
4+
5+
namespace Observable {
6+
7+
class IObserver {
8+
public:
9+
virtual ~IObserver() = default;
10+
};
11+
12+
}
13+
14+
}

src/ESPressio_Observable.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,49 @@
44
#include <vector>
55

66
#include "ESPressio_IObservable.hpp"
7+
#include "ESPressio_IObserver.hpp"
78

89
namespace ESPressio {
910

1011
namespace Observable {
1112

1213
class Observable : public IObservable {
1314
private:
14-
std::vector<void*> observers;
15+
std::vector<IObserver*> _observers;
1516
protected:
1617
/// 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) {
1920
callback(observer);
2021
}
2122
}
2223

2324
/// Will call the `callback` for each Observer that is of type `ObserverType`
2425
template <class ObserverType>
2526
void WithObservers(std::function<void(ObserverType*)> callback) {
26-
for (auto observer : observers) {
27+
for (auto observer : _observers) {
2728
ObserverType* observerAsT = dynamic_cast<ObserverType*>(observer);
2829
if (!observerAsT) { continue; }
2930
callback(observerAsT);
3031
}
3132
}
3233
public:
33-
virtual void RegisterObserver(void* observer) {
34+
virtual void RegisterObserver(IObserver* observer) {
3435
if (IsObserverRegistered(observer)) { return; }
35-
observers.push_back(observer);
36+
_observers.push_back(observer);
3637
}
3738

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++) {
4041
if (*thisObserver == observer) {
41-
observers.erase(thisObserver);
42+
_observers.erase(thisObserver);
4243
return;
4344
}
4445
}
4546
}
4647

47-
virtual bool IsObserverRegistered(void* observer) {
48-
for (auto thisObserver : observers) {
48+
virtual bool IsObserverRegistered(IObserver* observer) {
49+
for (auto thisObserver : _observers) {
4950
if (thisObserver == observer) { return true; }
5051
}
5152
return false;

0 commit comments

Comments
 (0)