LeviLamina
Loading...
Searching...
No Matches
Observer.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4#include "mc/deps/core/utility/Subject.h"
5
6namespace Core {
7
8template <class DerivedType, class LockType>
9class Observer {
10public:
12
13 SubjectType* mpSubject{};
14
15public:
16 Observer(Observer const&) = delete;
17 Observer& operator=(Observer const&) = delete;
18 SubjectType* getSubject() { return mpSubject; }
19
20 Observer() = default;
21 Observer(SubjectType& subject) : mpSubject(std::addressof(subject)) {}
22
23 void removeFromSubject() {
24 if (mpSubject) {
25 mpSubject->removeObserver(*static_cast<DerivedType*>(this));
26 }
27 }
28
29 virtual ~Observer() { removeFromSubject(); }
30
31 virtual void _onSubjectDestroyed() {}
32};
33
34template <class ObserverType, class LockType>
36 std::lock_guard<LockType> l{getLock()};
37 for (auto& observer : mObservers) {
38 observer->mpSubject = nullptr;
39 observer->_onSubjectDestroyed();
40 }
41}
42
43} // namespace Core
Definition Observer.h:9
Definition Subject.h:9