Grindstone Game Engine
v0.2.0
An open source game engine and toolkit.
Toggle main menu visibility
Loading...
Searching...
No Matches
Observable.hpp
1
#include <mutex>
2
#include <functional>
3
#include <unordered_map>
4
5
namespace
Grindstone {
6
using
ObserverHandle = size_t;
7
8
template
<
typename
... Args>
9
class
SinglecastObservable
{
10
public
:
11
using
ObserverFunction = std::function<void(Args...)>;
12
13
void
Broadcast(Args... args) {
14
std::scoped_lock lck(mutex);
15
function(args...);
16
}
17
18
void
Subscribe(ObserverFunction func) {
19
std::scoped_lock lck(mutex);
20
function = func;
21
}
22
23
void
Unsubscribe() {
24
std::scoped_lock lck(mutex);
25
function =
nullptr
;
26
}
27
28
protected
:
29
30
std::mutex mutex;
31
ObserverFunction function;
32
33
};
34
35
template
<
typename
... Args>
36
class
MulticastObservable
{
37
public
:
38
using
ObserverFunction = std::function<void(Args...)>;
39
40
void
Broadcast(Args... args) {
41
std::scoped_lock lck(mutex);
42
for
(
auto
& [_, func] : observers) {
43
func(args...);
44
}
45
}
46
47
ObserverHandle Subscribe(ObserverFunction func) {
48
std::scoped_lock lck(mutex);
49
ObserverHandle handle = ++currentHandle;
50
observers.emplace(handle, func);
51
return
handle;
52
}
53
54
void
Unsubscribe(ObserverHandle handle) {
55
std::scoped_lock lck(mutex);
56
observers.erase(handle);
57
}
58
59
protected
:
60
61
std::mutex mutex;
62
ObserverHandle currentHandle = 0;
63
std::unordered_map<ObserverHandle, ObserverFunction> observers;
64
65
};
66
}
Grindstone::MulticastObservable
Definition
Observable.hpp:36
Grindstone::SinglecastObservable
Definition
Observable.hpp:9
sources
code
Common
Observable.hpp
Generated by
1.17.0