Skip to content

Commit bef288d

Browse files
committed
- Initial implementation of the basic Observer System
1 parent e33a7c7 commit bef288d

File tree

3 files changed

+28
-17
lines changed

3 files changed

+28
-17
lines changed

src/ESPressio_IObservable.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ namespace ESPressio {
1414
/// It is used to not only check if the `IObservable` still exists, but also to unregister the Observer when desired!
1515
class IObserverHandle {
1616
public:
17+
/// Will null the `IObservable` reference to inform that the Observable is no longer valid
18+
/// Do not call this method directly, it is called by the `IObservable` when it is destroyed
19+
virtual void __invalidate() = 0;
1720
/// Will Unregister this Observer from the `IObservable` if it still exists
1821
virtual void Unregister() = 0;
1922
/// Will return a `weak_ptr` to the `IObservable`
20-
virtual std::weak_ptr<IObservable> GetObservable() = 0;
23+
virtual IObservable* GetObservable() = 0;
2124
/// Will return a pointer to the `IObserver`
2225
virtual IObserver* GetObserver() = 0;
2326
};

src/ESPressio_Observable.hpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,43 @@ namespace ESPressio {
1313

1414
class Observable : public IObservable {
1515
private:
16-
std::vector<IObserver*> _observers;
16+
std::vector<IObserverHandle*> _observers;
1717
protected:
1818
/// Will call the `callback` for each Observer
1919
virtual void WithObservers(std::function<void(IObserver*)> callback) {
2020
for (auto observer : _observers) {
21-
callback(observer);
21+
callback(observer->GetObserver());
2222
}
2323
}
2424

2525
/// Will call the `callback` for each Observer that is of type `ObserverType`
2626
template <class ObserverType>
2727
void WithObservers(std::function<void(ObserverType*)> callback) {
2828
for (auto observer : _observers) {
29-
ObserverType* observerAsT = dynamic_cast<ObserverType*>(observer);
29+
ObserverType* observerAsT = dynamic_cast<ObserverType*>(observer->GetObserver());
3030
if (!observerAsT) { continue; }
3131
callback(observerAsT);
3232
}
3333
}
3434
public:
35+
~Observable() {
36+
for (auto observer : _observers) {
37+
observer->__invalidate();
38+
}
39+
}
40+
3541
virtual IObserverHandle* RegisterObserver(IObserver* observer) {
3642
for (auto thisObserver : _observers) {
37-
if (thisObserver == observer) { return new ObserverHandle(this, observer); }
43+
if (thisObserver->GetObserver() == observer) { return thisObserver; }
3844
}
39-
_observers.push_back(observer);
40-
return new ObserverHandle(this, observer);
45+
IObserverHandle* handle = new ObserverHandle(this, observer);
46+
_observers.push_back(handle);
4147
}
4248

4349
virtual void UnregisterObserver(IObserver* observer) {
4450
for (auto thisObserver = _observers.begin(); thisObserver != _observers.end(); thisObserver++) {
45-
if (*thisObserver == observer) {
51+
if ((*thisObserver)->GetObserver() == observer) {
52+
(*thisObserver)->Unregister();
4653
_observers.erase(thisObserver);
4754
return;
4855
}
@@ -51,7 +58,7 @@ namespace ESPressio {
5158

5259
virtual bool IsObserverRegistered(IObserver* observer) {
5360
for (auto thisObserver : _observers) {
54-
if (thisObserver == observer) { return true; }
61+
if ((*thisObserver).GetObserver() == observer) { return true; }
5562
}
5663
return false;
5764
}

src/ESPressio_ObserverHandle.hpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#pragma once
22

3-
#include <memory>
43
#include "ESPressio_IObservable.hpp"
54
#include "ESPressio_IObserver.hpp"
65

@@ -10,23 +9,25 @@ namespace ESPressio {
109

1110
class ObserverHandle : public IObserverHandle {
1211
private:
13-
std::weak_ptr<IObservable> _observable;
12+
IObservable* _observable;
1413
IObserver* _observer;
1514
public:
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) {}
15+
ObserverHandle(IObservable* observable, IObserver* observer) : _observable(observable), _observer(observer) {}
1816

1917
~ObserverHandle() {
2018
Unregister();
2119
}
2220

21+
virtual void __invalidate() {
22+
_observable = nullptr;
23+
}
24+
2325
virtual void Unregister() {
24-
std::shared_ptr<IObservable> observable = _observable.lock();
25-
if (!observable) { return; }
26-
observable->UnregisterObserver(_observer);
26+
if (_observable == nullptr) { return; }
27+
_observable->UnregisterObserver(_observer);
2728
}
2829

29-
virtual std::weak_ptr<IObservable> GetObservable() {
30+
virtual IObservable* GetObservable() {
3031
return _observable;
3132
}
3233

0 commit comments

Comments
 (0)