File tree Expand file tree Collapse file tree 3 files changed +118
-0
lines changed
Expand file tree Collapse file tree 3 files changed +118
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments