Empirical
SignalManager.h
Go to the documentation of this file.
1 // This file is part of Empirical, https://github.com/devosoft/Empirical
2 // Copyright (C) Michigan State University, 2016-2017.
3 // Released under the MIT Software license; see doc/LICENSE
4 //
5 //
6 // This file defines the SignalManager class, which collects sets of Signals to be looked up
7 // or manipulated later.
8 
9 #ifndef EMP_CONTROL_SIGNAL_MANAGER
10 #define EMP_CONTROL_SIGNAL_MANAGER
11 
12 #include <string>
13 #include <unordered_map>
14 
15 #include "../tools/string_utils.h"
16 
17 #include "Signal.h"
18 
19 namespace emp {
20 
22  private:
23  std::unordered_map<std::string, SignalBase *> signal_map;
24  uint32_t next_id=1;
25  std::string prefix = "emp_signal_";
26 
27  // Generate a unique signal name to prevent duplicates.
28  inline std::string GenerateSignalName(const std::string & pre="") {
29  if (pre=="") return emp::to_string(prefix, next_id++); // Use default version.
30  return emp::to_string(pre, next_id++);
31  }
32  public:
33  SignalManager() : signal_map() { ; }
34  SignalManager(SignalManager &&) = default; // Normal juggle is okay for move constructor
35  SignalManager(const SignalManager & in) : signal_map(), next_id(in.next_id), prefix(in.prefix) {
36  // Copy all signals from input manager.
37  for (const auto & x : in.signal_map) {
38  signal_map[x.first] = x.second->Clone();
39  }
40  }
41  ~SignalManager() { for (auto & x : signal_map) delete x.second; }
42 
43  uint32_t GetNextID() const { return next_id; }
44  size_t GetSize() const { return signal_map.size(); }
45 
46  SignalBase & operator[](const std::string & name) {
47  emp_assert(signal_map.find(name) != signal_map.end());
48  return *(signal_map[name]);
49  }
50  const SignalBase & operator[](const std::string & name) const {
51  auto it = signal_map.find(name);
52  emp_assert(it != signal_map.end());
53  return *(it->second);
54  }
55 
56 // template <typename... ARGS>
57  template <typename FUN_T>
58  auto & Add(const std::string & name) {
59  auto * new_signal = new Signal<FUN_T>(name);
60  signal_map[name] = new_signal;
61  new_signal->signal_id = next_id++;
62  new_signal->managers.push_back(this);
63  new_signal->prime_manager = this;
64  return *new_signal;
65  }
66 
67  template <typename FUN_T>
68  auto & Add(Signal<FUN_T> & signal) {
69  signal_map[signal.name] = &signal;
70  signal.signal_id = next_id++; // @CAO: Who should control the signal id?
71  signal.managers.push_back(this);
72  return signal;
73  }
74 
75  void NotifyConstruct(SignalBase * signal) override {
76  // This signal is currently being constructed and should be added to this manager.
77  signal_map[signal->name] = signal;
78  signal->signal_id = next_id++; // @CAO: Who should control the signal id?
79  signal->managers.push_back(this);
80  }
81 
82  void NotifyDestruct(SignalBase * signal) override {
83  // This signal is no longer valid and needs to be removed from this manager.
84  signal_map.erase(signal->name);
85  }
86 
87  void PrintNames(std::ostream & os=std::cout) {
88  os << signal_map.size() << " signals found:\n";
89  for (auto & x : signal_map) os << " " << x.first << std::endl;
90  }
91  };
92 
93 }
94 
95 #endif
uint32_t signal_id
What is the unique ID of this signal?
Definition: Signal.h:103
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
Base class for all signals.
Definition: Signal.h:97
Definition: Signal.h:84
~SignalManager()
Definition: SignalManager.h:41
SignalManager()
Definition: SignalManager.h:33
std::string name
What is the unique name of this signal?
Definition: Signal.h:102
size_t GetSize() const
Definition: SignalManager.h:44
void NotifyDestruct(SignalBase *signal) override
Definition: SignalManager.h:82
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
static const PrintStr endl("<br>")
Pre-define emp::endl to insert a "<br>" and thus acting like a newline.
void PrintNames(std::ostream &os=std::cout)
Definition: SignalManager.h:87
emp::vector< man_t * > managers
What manager is handling this signal?
Definition: Signal.h:106
SignalManager(const SignalManager &in)
Definition: SignalManager.h:35
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 & Add(Signal< FUN_T > &signal)
Definition: SignalManager.h:68
#define emp_assert(...)
Definition: assert.h:199
SignalBase & operator[](const std::string &name)
Definition: SignalManager.h:46
const SignalBase & operator[](const std::string &name) const
Definition: SignalManager.h:50
uint32_t GetNextID() const
Definition: SignalManager.h:43