17 #ifndef EMP_SIGNAL_CONTROL 18 #define EMP_SIGNAL_CONTROL 21 #include <unordered_map> 33 std::unordered_map<uint32_t, SignalBase *> id_to_signal;
48 template <
typename... Ts>
49 auto &
AddAction(Ts &&... act) {
return action_m.
Add( std::forward<Ts>(act)... ); }
51 template <
typename... ARGS>
53 return signal_m.
Add<ARGS...>(name);
56 template <
typename... ARGS>
58 return signal_m.
Add<ARGS...>(signal);
62 template <
typename... ARGS>
68 auto Link(
const std::string & s, A && a) {
return Link(signal_m[s], std::forward<A>(a)); }
78 template <
typename... ARGS>
79 void Trigger(
const std::string & name, ARGS &&... args) {
80 auto & base_signal = signal_m[name];
81 auto * signal =
dynamic_cast< Signal<
void(ARGS...)
>* >(&base_signal);
82 emp_assert( signal !=
nullptr &&
"invalid signal conversion!" );
83 signal->Trigger(std::forward<ARGS>(args)...);
SignalManager & GetSignalManager() override
Definition: SignalControl.h:46
Base class for all signals.
Definition: Signal.h:97
void NotifyConstruct(SignalBase *sig_ptr) override
Definition: SignalControl.h:87
auto & AddSignal(Signal< void(ARGS...)> &signal)
Definition: SignalControl.h:57
auto & AddSignal(const std::string &name="")
Definition: SignalControl.h:52
size_t GetNumActions() const
Definition: SignalControl.h:39
SignalControl()
Definition: SignalControl.h:36
size_t GetSize() const
Definition: SignalManager.h:44
void Trigger(const std::string &name, ARGS &&...args)
Definition: SignalControl.h:79
const ActionBase & GetAction(const std::string &name) const
Definition: SignalControl.h:42
Generic version of Signals; needs specialization to a function type..
Definition: Signal.h:159
Definition: SignalManager.h:21
auto & Add(const std::string &name)
Definition: SignalManager.h:58
auto Link(const std::string &s, A &&a)
Definition: SignalControl.h:68
void PrintNames(std::ostream &os=std::cout)
Definition: SignalControl.h:90
const SignalBase & GetSignal(const std::string &name) const
Definition: SignalControl.h:43
void PrintNames(std::ostream &os=std::cout)
Definition: SignalManager.h:87
auto & Add(const std::function< RETURN(ARGS...)> &in_fun, const std::string &name)
Add a functon to this manager with a pre-specified name.
Definition: ActionManager.h:61
ActionManager & GetActionManager()
Definition: SignalControl.h:45
auto Link(SignalBase &s, ActionBase &a)
Definition: SignalControl.h:75
size_t GetSize() const
How many actions are in this manager?
Definition: ActionManager.h:44
void NotifyConstruct(SignalBase *signal) override
Definition: SignalManager.h:75
If we are in emscripten, make sure to include the header.
Definition: array.h:37
auto & AddAction(Ts &&...act)
Definition: SignalControl.h:49
~SignalControl()
Definition: SignalControl.h:37
#define emp_assert(...)
Definition: assert.h:199
void PrintNames(std::ostream &os=std::cout)
Print out the name of all actions maintained by this manager.
Definition: ActionManager.h:84
Definition: SignalControl.h:28
Definition: ActionManager.h:23
auto Link(SignalBase &s, const std::function< void(ARGS...)> &f)
Definition: SignalControl.h:63
auto Link(SignalBase &s, const std::string &a)
Definition: SignalControl.h:72
size_t GetNumSignals() const
Definition: SignalControl.h:40
SignalKey AddAction(const std::function< void(ARGS...)> &in_fun)
Actions without arguments or a return type can be associated with any signal.
Definition: Signal.h:358