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
6
namespace
Core {
7
8
template
<
class
DerivedType,
class
LockType>
9
class
Observer
{
10
public
:
11
using
SubjectType
=
::Core::Subject<DerivedType, LockType>
;
12
13
SubjectType
* mpSubject{};
14
15
public
:
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
34
template
<
class
ObserverType,
class
LockType>
35
Subject<ObserverType, LockType>::~Subject
() {
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
Core::Observer
Definition
Observer.h:9
Core::Subject
Definition
Subject.h:9
src
mc
deps
core
utility
Observer.h
Generated on Sat Apr 26 2025 05:55:26 for LeviLamina by
1.12.0