Skip to content

Commit 605cbbd

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

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

src/ESPressio_IObservable.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ namespace ESPressio {
1818
virtual void Unregister() = 0;
1919
/// Will return a `weak_ptr` to the `IObservable`
2020
virtual std::weak_ptr<IObservable> GetObservable() = 0;
21+
/// Will return a `weak_ptr` to the `IObserver`
22+
virtual std::weak_ptr<IObserver> GetObserver() = 0;
2123
};
2224

2325
class IObservable : public std::enable_shared_from_this<IObservable> {
2426
public:
2527
/// Will Register the`IObserver` with this `IObservable`
26-
virtual void RegisterObserver(IObserver* observer) = 0;
28+
virtual IObserverHandle* RegisterObserver(IObserver* observer) = 0;
2729
/// Will Unregister the `IObserver` from this `IObservable`
2830
virtual void UnregisterObserver(IObserver* observer) = 0;
2931
/// Will return `true` if the `IObserver` is registered with this `IObservable`

src/ESPressio_Observable.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "ESPressio_IObservable.hpp"
77
#include "ESPressio_IObserver.hpp"
8+
#include "ESPressio_Observer.hpp"
89

910
namespace ESPressio {
1011

@@ -31,9 +32,12 @@ namespace ESPressio {
3132
}
3233
}
3334
public:
34-
virtual void RegisterObserver(IObserver* observer) {
35-
if (IsObserverRegistered(observer)) { return; }
35+
virtual IObserverHandle* RegisterObserver(IObserver* observer) {
36+
for (auto thisObserver : _observers) {
37+
if (thisObserver == observer) { return new ObserverHandle(this, observer); }
38+
}
3639
_observers.push_back(observer);
40+
return new ObserverHandle(this, observer);
3741
}
3842

3943
virtual void UnregisterObserver(IObserver* observer) {

src/ESPressio_ObserverHandle.hpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <memory>
44
#include "ESPressio_IObservable.hpp"
5+
#include "ESPressio_IObserver.hpp"
56

67
namespace ESPressio {
78

@@ -10,19 +11,28 @@ namespace ESPressio {
1011
class ObserverHandle : public IObserverHandle {
1112
private:
1213
std::weak_ptr<IObservable> _observable;
14+
IObserver* _observer;
1315
public:
14-
ObserverHandle(std::weak_ptr<IObservable> observable) : _observable(observable) {}
15-
ObserverHandle(IObservable* observable) : _observable(observable->shared_from_this()) {}
16+
ObserverHandle(std::weak_ptr<IObservable> observable, IObserver* observer) : _observable(observable), _observer(observer) {}
17+
ObserverHandle(IObservable* observable, IObserver* observer) : _observable(observable->shared_from_this()), _observer(observer) {}
18+
19+
~ObserverHandle() {
20+
Unregister();
21+
}
1622

1723
virtual void Unregister() {
1824
std::shared_ptr<IObservable> observable = _observable.lock();
1925
if (!observable) { return; }
20-
observable->UnregisterObserver(this);
26+
observable->UnregisterObserver(_observer);
2127
}
2228

2329
virtual std::weak_ptr<IObservable> GetObservable() {
2430
return _observable;
2531
}
32+
33+
virtual IObserver* GetObserver() {
34+
return _observer;
35+
}
2636
};
2737

2838
}

0 commit comments

Comments
 (0)