R-Type
R-Type project
Action.hpp
1 #pragma once
2 
3 #include <map>
4 #include <functional>
5 #include <utility>
6 #include <mutex>
7 
8 namespace KapMirror::Experimental {
9  template <class Signature>
10  struct Action {
11  private:
12  std::map<std::size_t, std::function<Signature>> handlers;
13  std::mutex handlersMutex;
14 
15  public:
20  template <class... Args>
21  void operator()(Args&&... args) {
22  std::lock_guard<std::mutex> lock(handlersMutex);
23  for (auto const& [hash, handler] : handlers) {
24  if (handler) {
25  handler(args...);
26  }
27  }
28  }
29 
34  template <typename Handler>
35  void operator+=(Handler&& hanlder) {
36  std::lock_guard<std::mutex> lock(handlersMutex);
37  std::size_t hash = getHash(hanlder);
38  handlers[hash] = std::forward<Handler>(hanlder);
39  }
40 
45  template <typename Handler>
46  void operator-=(Handler&& hanlder) {
47  std::lock_guard<std::mutex> lock(handlersMutex);
48  std::size_t hash = getHash(hanlder);
49  handlers.erase(hash);
50  }
51 
55  void clear() {
56  handlers.clear();
57  }
58 
59  private:
60  std::size_t getHash(const std::function<Signature>& func) { return (std::size_t)func.target_type().hash_code(); }
61  };
62 } // namespace KapMirror::Experimental
KapMirror::Experimental::Action::operator-=
void operator-=(Handler &&hanlder)
Remove a handler from the action.
Definition: Action.hpp:46
KapMirror::Experimental::Action::operator()
void operator()(Args &&... args)
Call all handlers.
Definition: Action.hpp:21
KapMirror::Experimental::Action::clear
void clear()
Clear all handlers.
Definition: Action.hpp:55
KapMirror::Experimental::Action
Definition: Action.hpp:10
KapMirror::Experimental::Action::operator+=
void operator+=(Handler &&hanlder)
Add a handler to the action.
Definition: Action.hpp:35