DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
ProcessorInternalStateNameRegistry.hpp
Go to the documentation of this file.
1
9 #include <string>
10 #include <vector>
11 #include <memory>
12 #include <unordered_map>
13 #include <immintrin.h>
14 #include <array>
15
16 #ifndef TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
17 #define TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
18
19 namespace tpglibs {
20
26 template <typename T>
28 public:
30 using signal_t = T;
31
34
37
38 // Delete copy constructor and copy assignment (registry shouldn't be copied)
41
42 // Allow move semantics for efficiency
45
51
56 std::vector<std::string> get_names_of_requested_internal_states() const;
57
62 void parse_requested_internal_state_items(std::string config_string);
63
69 void register_internal_state(std::string name, std::shared_ptr<signal_t> pointer_to_state);
70
76 std::shared_ptr<signal_t> get_internal_state_item_ptr(std::string name);
77
82 std::vector<std::shared_ptr<signal_t>> get_all_requested_internal_state_item_ptrs();
83
89 bool is_registered(const std::string& name) const;
90
96 bool is_requested(const std::string& name) const;
97
98 protected:
99
104 std::vector<std::string> get_all_registered_internal_state_names();
105
107 void clear();
108
109 public:
110 // Test interfaces - only for unit testing
111 #ifdef TPGLIBS_ENABLE_TEST_INTERFACES
112 void test_clear() { clear(); }
113 std::vector<std::string> test_get_all_registered_internal_state_names() {
115 }
116 size_t test_get_map_size() const { return m_internal_state_map.size(); }
117 #endif
118
119 private:
121 std::unordered_map<std::string, std::shared_ptr<signal_t>> m_internal_state_map;
122
124 std::vector<std::string> m_requested_internal_state_names;
125 };
126
127 // Template function implementations
128
129 template <typename T>
133
134 template <typename T>
136 return m_requested_internal_state_names.size();
137 }
138
139 template <typename T>
141 return m_requested_internal_state_names;
142 }
143
144 template <typename T>
145 void ProcessorInternalStateNameRegistry<T>::register_internal_state(std::string name, std::shared_ptr<signal_t> pointer_to_state) {
146 m_internal_state_map[name] = pointer_to_state;
147 }
148
149 template <typename T>
150 std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>
152 return m_internal_state_map[name];
153 }
154
155 template <typename T>
157 std::vector<std::string> names;
158 for (const auto& item : m_internal_state_map) {
159 names.push_back(item.first);
160 }
161 return names;
162 }
163
164 template <typename T>
166 // Clear existing requested names first
167 m_requested_internal_state_names.clear();
168
169 if (config_string.empty()) {
170 return;
171 }
172
173 // Parse comma-separated items
174 std::string::size_type start = 0;
175 std::string::size_type end = config_string.find(',');
176
177 while (end != std::string::npos) {
178 // Extract item name and trim whitespace
179 std::string item_name = config_string.substr(start, end - start);
180
181 // Trim leading and trailing whitespace
182 item_name.erase(0, item_name.find_first_not_of(" \t\r\n"));
183 item_name.erase(item_name.find_last_not_of(" \t\r\n") + 1);
184
185 // Only add non-empty item names
186 if (!item_name.empty()) {
187 m_requested_internal_state_names.push_back(item_name);
188 }
189
190 start = end + 1;
191 end = config_string.find(',', start);
192 }
193
194 // Handle the last item (after the final comma or if there are no commas)
195 if (start < config_string.length()) {
196 std::string last_item = config_string.substr(start);
197
198 // Trim leading and trailing whitespace
199 last_item.erase(0, last_item.find_first_not_of(" \t\r\n"));
200 last_item.erase(last_item.find_last_not_of(" \t\r\n") + 1);
201
202 // Only add non-empty item names
203 if (!last_item.empty()) {
204 m_requested_internal_state_names.push_back(last_item);
205 }
206 }
207 }
208
209 template <typename T>
211 // reinitialize member variables
212 m_internal_state_map.clear();
213 m_requested_internal_state_names.clear();
214 }
215
216 template <typename T>
217 std::vector<std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>>
219 std::vector<std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>> item_ptrs;
220 for (const auto& item : m_requested_internal_state_names) {
221 item_ptrs.push_back(m_internal_state_map[item]);
222 }
223 return item_ptrs;
224 }
225
226 template <typename T>
227 bool ProcessorInternalStateNameRegistry<T>::is_registered(const std::string& name) const {
228 return m_internal_state_map.find(name) != m_internal_state_map.end();
229 }
230
231 template <typename T>
232 bool ProcessorInternalStateNameRegistry<T>::is_requested(const std::string& name) const {
233 for (const auto& requested_name : m_requested_internal_state_names) {
234 if (requested_name == name) {
235 return true;
236 }
237 }
238 return false;
239 }
240
241} // namespace tpglibs
242
243#endif // TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
244
bool is_registered(const std::string &name) const
Check if an internal state name is registered.
std::vector< std::string > get_all_registered_internal_state_names()
Get all registered internal state names.
ProcessorInternalStateNameRegistry(ProcessorInternalStateNameRegistry &&)=default
std::unordered_map< std::string, std::shared_ptr< signal_t > > m_internal_state_map
Map of internal state names to pointers.
ProcessorInternalStateNameRegistry & operator=(ProcessorInternalStateNameRegistry &&)=default
void register_internal_state(std::string name, std::shared_ptr< signal_t > pointer_to_state)
Register an internal state.
std::vector< std::string > get_names_of_requested_internal_states() const
Get the names of the requested internal states.
bool is_requested(const std::string &name) const
Check if an internal state name is requested.
ProcessorInternalStateNameRegistry & operator=(const ProcessorInternalStateNameRegistry &)=delete
std::shared_ptr< signal_t > get_internal_state_item_ptr(std::string name)
Get a pointer to an internal state item.
T signal_t
Signal type to use. Generally __m256i or std::array<int16_t, 16>;.
ProcessorInternalStateNameRegistry(const ProcessorInternalStateNameRegistry &)=delete
size_t get_number_of_requested_internal_states()
Get the number of requested internal states.
ProcessorInternalStateNameRegistry()=default
Constructor.
void parse_requested_internal_state_items(std::string config_string)
Parse the requested internal state items from a configuration string.
std::vector< std::shared_ptr< signal_t > > get_all_requested_internal_state_item_ptrs()
Get a vector of pointers to all internal state items.
std::vector< std::string > m_requested_internal_state_names
Vector of all requested internal state names.