Skip to content

Commit b666d86

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

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed

src/ESPressio_IObservable.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include <functional>
4+
#include <memory>
5+
6+
namespace ESPressio {
7+
8+
namespace Observable {
9+
class IObservable;
10+
11+
/// An `IObserverHandle` is returned when registering your Observer with an `IObservable`
12+
/// It is used to not only check if the `IObservable` still exists, but also to unregister the Observer when desired!
13+
class IObserverHandle {
14+
public:
15+
/// Will Unregister this Observer from the `IObservable` if it still exists
16+
virtual void Unregister() = 0;
17+
/// Will return a `weak_ptr` to the `IObservable`
18+
virtual std::weak_ptr<IObservable> GetObservable() = 0;
19+
};
20+
21+
class IObservable : public std::enable_shared_from_this<IObservable> {
22+
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;
29+
};
30+
31+
}
32+
33+
}

src/ESPressio_Observable.hpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,57 @@
11
#pragma once
22

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

src/ESPressio_ObserverHandle.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
#include <memory>
4+
#include "ESPressio_IObservable.hpp"
5+
6+
namespace ESPressio {
7+
8+
namespace Observable {
9+
10+
class ObserverHandle : public IObserverHandle {
11+
private:
12+
std::weak_ptr<IObservable> _observable;
13+
public:
14+
ObserverHandle(std::weak_ptr<IObservable> observable) : _observable(observable) {}
15+
ObserverHandle(IObservable* observable) : _observable(observable->shared_from_this()) {}
16+
17+
virtual void Unregister() {
18+
std::shared_ptr<IObservable> observable = _observable.lock();
19+
if (!observable) { return; }
20+
observable->UnregisterObserver(this);
21+
}
22+
23+
virtual std::weak_ptr<IObservable> GetObservable() {
24+
return _observable;
25+
}
26+
};
27+
28+
}
29+
30+
}

0 commit comments

Comments
 (0)