DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
ProcessorInternalStateNameRegistry.hpp
Go to the documentation of this file.
1
8
9#include <array>
10#include <immintrin.h>
11#include <memory>
12#include <string>
13#include <unordered_map>
14#include <vector>
15
16#ifndef TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
17#define TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
18
19namespace tpglibs {
20
26template<typename T>
28{
29public:
31 using signal_t = T;
32
35
38
39 // Delete copy constructor and copy assignment (registry shouldn't be copied)
42
43 // Allow move semantics for efficiency
46
52
57 std::vector<std::string> get_names_of_requested_internal_states() const;
58
63 void parse_requested_internal_state_items(std::string config_string);
64
70 void register_internal_state(std::string name, std::shared_ptr<signal_t> pointer_to_state);
71
77 std::shared_ptr<signal_t> get_internal_state_item_ptr(std::string name);
78
83 std::vector<std::shared_ptr<signal_t>> get_all_requested_internal_state_item_ptrs();
84
90 bool is_registered(const std::string& name) const;
91
97 bool is_requested(const std::string& name) const;
98
99protected:
104 std::vector<std::string> get_all_registered_internal_state_names();
105
107 void clear();
108
109public:
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()
114 {
116 }
117 size_t test_get_map_size() const { return m_internal_state_map.size(); }
118#endif
119
120private:
122 std::unordered_map<std::string, std::shared_ptr<signal_t>> m_internal_state_map;
123
125 std::vector<std::string> m_requested_internal_state_names;
126};
127
128// Template function implementations
129
130template<typename T>
135
136template<typename T>
137size_t
142
143template<typename T>
144std::vector<std::string>
149
150template<typename T>
151void
153 std::shared_ptr<signal_t> pointer_to_state)
154{
155 m_internal_state_map[name] = pointer_to_state;
156}
157
158template<typename T>
159std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>
164
165template<typename T>
166std::vector<std::string>
168{
169 std::vector<std::string> names;
170 for (const auto& item : m_internal_state_map) {
171 names.push_back(item.first);
172 }
173 return names;
174}
175
176template<typename T>
177void
179{
180 // Clear existing requested names first
182
183 if (config_string.empty()) {
184 return;
185 }
186
187 // Parse comma-separated items
188 std::string::size_type start = 0;
189 std::string::size_type end = config_string.find(',');
190
191 while (end != std::string::npos) {
192 // Extract item name and trim whitespace
193 std::string item_name = config_string.substr(start, end - start);
194
195 // Trim leading and trailing whitespace
196 item_name.erase(0, item_name.find_first_not_of(" \t\r\n"));
197 item_name.erase(item_name.find_last_not_of(" \t\r\n") + 1);
198
199 // Only add non-empty item names
200 if (!item_name.empty()) {
201 m_requested_internal_state_names.push_back(item_name);
202 }
203
204 start = end + 1;
205 end = config_string.find(',', start);
206 }
207
208 // Handle the last item (after the final comma or if there are no commas)
209 if (start < config_string.length()) {
210 std::string last_item = config_string.substr(start);
211
212 // Trim leading and trailing whitespace
213 last_item.erase(0, last_item.find_first_not_of(" \t\r\n"));
214 last_item.erase(last_item.find_last_not_of(" \t\r\n") + 1);
215
216 // Only add non-empty item names
217 if (!last_item.empty()) {
218 m_requested_internal_state_names.push_back(last_item);
219 }
220 }
221}
222
223template<typename T>
224void
226{
227 // reinitialize member variables
228 m_internal_state_map.clear();
230}
231
232template<typename T>
233std::vector<std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>>
235{
236 std::vector<std::shared_ptr<typename ProcessorInternalStateNameRegistry<T>::signal_t>> item_ptrs;
237 for (const auto& item : m_requested_internal_state_names) {
238 item_ptrs.push_back(m_internal_state_map[item]);
239 }
240 return item_ptrs;
241}
242
243template<typename T>
244bool
246{
247 return m_internal_state_map.find(name) != m_internal_state_map.end();
248}
249
250template<typename T>
251bool
253{
254 for (const auto& requested_name : m_requested_internal_state_names) {
255 if (requested_name == name) {
256 return true;
257 }
258 }
259 return false;
260}
261
262} // namespace tpglibs
263
264#endif // TPGLIBS_PROCESSORINTERNALSTATENAMEREGISTRY_HPP_
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.