Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
Observable.hpp
1#include <mutex>
2#include <functional>
3#include <unordered_map>
4
5namespace Grindstone {
6 using ObserverHandle = size_t;
7
8 template<typename... Args>
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>
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}
Definition Observable.hpp:36
Definition Observable.hpp:9