pianod2
multisource multiuser scriptable networked music player
callbackimpl.h
Go to the documentation of this file.
1 
16 #pragma once
17 
18 #include <functional>
19 #include <utility>
20 
24 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
25 template <typename TMemberFunction, typename... Arguments>
26 void CallbackManager<TOwner, TCallbacks, TCallbackClientId>::notify (TMemberFunction function, const Arguments &... arguments) {
27  for (const auto &handler : registered_handlers) {
28  if (handler.second.*function) {
29  (handler.second.*function) (arguments...);
30  }
31  }
32 };
33 
34 
38 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
39 template <typename TMemberFunction, typename... Arguments>
40 void CallbackManager<TOwner, TCallbacks, TCallbackClientId>::callback (TMemberFunction function, Arguments &&... arguments) {
41  for (const auto &handler : registered_handlers) {
42  if (handler.second.*function) {
43  (handler.second.*function) (std::forward<Arguments> (arguments)...);
44  }
45  }
46 };
47 
54 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
55 template <typename TReturnType, typename TMemberFunction, typename... Arguments>
57  const std::function<TReturnType (TReturnType, TReturnType)> &combine,
58  TMemberFunction function, const Arguments &... arguments) {
59  for (auto handler = registered_handlers.begin(); handler != registered_handlers.end(); handler++) {
60  if (handler->second.*function) {
61  TReturnType computed_result = (handler->second.*function) (arguments...);
62  while (++handler != registered_handlers.end()) {
63  if (handler->second.*function) {
64  computed_result = combine ((handler->second.*function) (arguments...), computed_result);
65  }
66  }
67  return computed_result;
68  }
69  }
70  return default_result;
71 };
72 
78 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
79 template <typename TMemberFunction, typename... Arguments>
80 inline bool CallbackManager<TOwner, TCallbacks, TCallbackClientId>::queryUnanimousApproval (bool default_result, TMemberFunction function, const Arguments &... arguments) {
81  return aggregate (default_result, std::function<bool (bool, bool)> (std::logical_and <bool>()),
82  function, arguments...);
83 };
84 
90 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
91 template <typename TMemberFunction, typename... Arguments>
92 inline bool CallbackManager<TOwner, TCallbacks, TCallbackClientId>::queryAnyApproval (bool default_result, TMemberFunction function, const Arguments &... arguments) {
93  return aggregate (default_result, std::function<bool (bool, bool)> (std::logical_or <bool>()),
94  function, arguments...);
95 };
96 
100 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
101 void CallbackManager<TOwner, TCallbacks, TCallbackClientId>::subscribe (const TCallbackClientId client_id, const TCallbacks &handlers) {
102  registered_handlers [client_id] = handlers;
103 }
104 
107 template <typename TOwner, typename TCallbacks, typename TCallbackClientId>
109  registered_handlers.erase (client_id);
110 }
111 
112 
TReturnType aggregate(TReturnType result, const std::function< TReturnType(TReturnType, TReturnType)> &combine, TMemberFunction function, const Arguments &... arguments)
Invoke a delegate function and aggregate the results.
Definition: callbackimpl.h:56
void callback(TMemberFunction function, Arguments &&... arguments)
Invoke a callback function.
Definition: callbackimpl.h:40
void notify(TMemberFunction function, const Arguments &... arguments)
Invoke a notification function.
Definition: callbackimpl.h:26
void unsubscribe(const TCallbackClientId client_id)
Remove registered callbacks, delegates, or notifications.
Definition: callbackimpl.h:108
bool queryAnyApproval(bool default_result, TMemberFunction function, const Arguments &... arguments)
Check for approval by any delegate.
Definition: callbackimpl.h:92
void subscribe(const TCallbackClientId client_id, const TCallbacks &handlers)
Register callback, delegate, or notification functions.
Definition: callbackimpl.h:101
bool queryUnanimousApproval(bool default_result, TMemberFunction function, const Arguments &... arguments)
Check for approval from all delegates.
Definition: callbackimpl.h:80