Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
ModuleRegistry.h
1// ============================================================
2// File: declarative/ModuleRegistry.h
3// Module Registry for declarative pipeline construction
4// Task A2: Module Registry
5// ============================================================
6
7#pragma once
8
9#include <string>
10#include <string_view>
11#include <vector>
12#include <map>
13#include <memory>
14#include <mutex>
15#include <functional>
16#include <variant>
17#include <type_traits>
18#include "declarative/Metadata.h"
19
20// Forward declaration - real Module class from existing codebase
21class Module;
22
23namespace apra {
24
25// ============================================================
26// ScalarPropertyValue - Variant type for runtime property values
27// (scalar-only version for module creation; see PipelineDescription.h
28// for PropertyValue with array types used in config parsing)
29// ============================================================
30using ScalarPropertyValue = std::variant<
31 int64_t,
32 double,
33 bool,
34 std::string
35>;
36
37// ============================================================
38// Runtime representation of module metadata
39// Stores copies of metadata for runtime access
40// ============================================================
41struct ModuleInfo {
42 std::string name;
44 std::string version;
45 std::string description;
46 std::vector<std::string> tags;
47
48 struct PinInfo {
49 std::string name;
50 std::vector<std::string> frame_types;
51 bool required = true;
52 std::string description;
53 MemType memType = FrameMetadata::HOST; // Memory location (HOST, CUDA_DEVICE, etc.)
54 std::vector<ImageType> image_types; // Supported pixel formats (empty = any)
55 };
56 std::vector<PinInfo> inputs;
57 std::vector<PinInfo> outputs;
58
59 struct PropInfo {
60 std::string name;
61 std::string type; // "int", "float", "bool", "string", "enum"
62 std::string mutability; // "static", "dynamic"
63 bool required = false; // true = mandatory (user must provide), false = optional (uses default)
64 std::string default_value;
65 std::string min_value;
66 std::string max_value;
67 std::string regex_pattern;
68 std::vector<std::string> enum_values;
69 std::string description;
70 std::string unit;
71 };
72 std::vector<PropInfo> properties;
73
74 // Factory function type - creates a module from property map
75 using FactoryFn = std::function<std::unique_ptr<Module>(
76 const std::map<std::string, ScalarPropertyValue>&
77 )>;
79
80 // CUDA factory function type - creates a module from property map + CUDA stream
81 // The void* is a pointer to cudastream_sp (type-erased to avoid CUDA header dependency)
82 // Use this for modules that require cudastream_sp in their Props constructor
83 using CudaFactoryFn = std::function<std::unique_ptr<Module>(
84 const std::map<std::string, ScalarPropertyValue>&,
85 void* cudaStreamPtr // Points to cudastream_sp
86 )>;
88
89 // Flag indicating this module requires a CUDA stream
90 bool requiresCudaStream = false;
91
92 // CUDA context factory function type - creates a module from property map + CUDA context
93 // The void* is a pointer to apracucontext_sp (type-erased to avoid CUDA header dependency)
94 // Use this for modules that require apracucontext_sp (NVCodec encoder)
95 using CuContextFactoryFn = std::function<std::unique_ptr<Module>(
96 const std::map<std::string, ScalarPropertyValue>&,
97 void* cuContextPtr // Points to apracucontext_sp
98 )>;
100
101 // Flag indicating this module requires a CUDA context (for NVCodec)
102 bool requiresCuContext = false;
103
104 // Dynamic property accessor factory - creates type-erased accessors bound to a module instance
105 // Returns {getDynamicPropertyNames, getProperty, setProperty} functions
107 std::function<std::vector<std::string>()> getDynamicPropertyNames;
108 std::function<ScalarPropertyValue(const std::string&)> getProperty;
109 std::function<bool(const std::string&, const ScalarPropertyValue&)> setProperty;
110 };
113
114 // Flag indicating module creates its own output pins in addInputPin()
115 // When true, ModuleFactory skips output pin setup to avoid duplicates
117};
118
119// ============================================================
120// ModuleRegistry - Central singleton registry for all modules
121// Thread-safe registration and queries
122// ============================================================
124public:
125 // Singleton access
126 static ModuleRegistry& instance();
127
128 // Registration (called from REGISTER_MODULE macro)
129 void registerModule(ModuleInfo info);
130
131 // Register a callback that can re-register a module after clear()
132 // Called by REGISTER_MODULE macro to enable test isolation
133 using RegistrationCallback = std::function<void()>;
135
136 // Re-run all registration callbacks (call after clear() in tests)
137 void rerunRegistrations();
138
139 // Queries
140 bool hasModule(const std::string& name) const;
141 const ModuleInfo* getModule(const std::string& name) const;
142 std::vector<std::string> getAllModules() const;
143 std::vector<std::string> getModulesByCategory(ModuleCategory cat) const;
144 std::vector<std::string> getModulesByTag(const std::string& tag) const;
145 std::vector<std::string> getModulesWithAllTags(const std::vector<std::string>& tags) const;
146
147 // Factory
148 std::unique_ptr<Module> createModule(
149 const std::string& name,
150 const std::map<std::string, ScalarPropertyValue>& props
151 ) const;
152
153 // CUDA Factory - creates module with CUDA stream
154 // cudaStreamPtr should point to a cudastream_sp
155 std::unique_ptr<Module> createCudaModule(
156 const std::string& name,
157 const std::map<std::string, ScalarPropertyValue>& props,
158 void* cudaStreamPtr
159 ) const;
160
161 // Set CUDA factory for a module (call after registerModule)
162 // Used by CUDA-specific registration code
163 bool setCudaFactory(const std::string& name, ModuleInfo::CudaFactoryFn factory);
164
165 // Check if a module requires CUDA stream
166 bool moduleRequiresCudaStream(const std::string& name) const;
167
168 // CUDA Context Factory - creates module with CUDA context (for NVCodec)
169 // cuContextPtr should point to a apracucontext_sp
170 std::unique_ptr<Module> createCuContextModule(
171 const std::string& name,
172 const std::map<std::string, ScalarPropertyValue>& props,
173 void* cuContextPtr
174 ) const;
175
176 // Set CUDA context factory for a module (call after registerModule)
177 // Used by NVCodec encoder registration
178 bool setCuContextFactory(const std::string& name, ModuleInfo::CuContextFactoryFn factory);
179
180 // Check if a module requires CUDA context
181 bool moduleRequiresCuContext(const std::string& name) const;
182
183 // Export
184 std::string toJson() const;
185 std::string toToml() const;
186
187 // Clear registry (useful for testing)
188 // Note: Does NOT clear registration callbacks; call rerunRegistrations() after
189 void clear();
190
191 // Get count of registered modules
192 size_t size() const;
193
194private:
195 ModuleRegistry() = default;
196 ~ModuleRegistry() = default;
197
198 // Prevent copying
201
202 std::map<std::string, ModuleInfo> modules_;
203 std::vector<RegistrationCallback> registrationCallbacks_;
204 mutable std::mutex mutex_;
205};
206
207// ============================================================
208// Helper functions for converting Metadata types to ModuleInfo
209// ============================================================
210namespace detail {
211
212// Convert PinDef to PinInfo
215 info.name = std::string(pin.name);
216 info.required = pin.required;
217 info.description = std::string(pin.description);
218 info.memType = pin.memType;
219 for (size_t i = 0; i < pin.frame_type_count; ++i) {
220 info.frame_types.push_back(std::string(pin.frame_types[i]));
221 }
222 for (size_t i = 0; i < pin.image_type_count; ++i) {
223 info.image_types.push_back(pin.image_types[i]);
224 }
225 return info;
226}
227
228// Convert ImageType to string
229inline std::string imageTypeToString(ImageType type) {
230 switch (type) {
231 case ImageMetadata::UNSET: return "UNSET";
232 case ImageMetadata::MONO: return "MONO";
233 case ImageMetadata::BGR: return "BGR";
234 case ImageMetadata::BGRA: return "BGRA";
235 case ImageMetadata::RGB: return "RGB";
236 case ImageMetadata::RGBA: return "RGBA";
237 case ImageMetadata::YUV411_I: return "YUV411_I";
238 case ImageMetadata::YUV444: return "YUV444";
239 case ImageMetadata::YUV420: return "YUV420";
240 case ImageMetadata::UYVY: return "UYVY";
241 case ImageMetadata::YUYV: return "YUYV";
242 case ImageMetadata::NV12: return "NV12";
243 }
244 return "unknown";
245}
246
247// Convert PropDef::Type to string
248inline std::string propTypeToString(PropDef::Type type) {
249 switch (type) {
250 case PropDef::Type::Integer: return "int";
251 case PropDef::Type::Floating: return "float";
252 case PropDef::Type::Boolean: return "bool";
253 case PropDef::Type::Text: return "string";
254 case PropDef::Type::Enumeration: return "enum";
255 }
256 return "unknown";
257}
258
259// Convert MemType to string
260inline std::string memTypeToString(MemType type) {
261 switch (type) {
262 case FrameMetadata::HOST: return "HOST";
263 case FrameMetadata::HOST_PINNED: return "HOST_PINNED";
264 case FrameMetadata::CUDA_DEVICE: return "CUDA_DEVICE";
265 case FrameMetadata::DMABUF: return "DMABUF";
266 }
267 return "unknown";
268}
269
270// Convert PropDef::Mutability to string
272 switch (mut) {
273 case PropDef::Mutability::Static: return "static";
274 case PropDef::Mutability::Dynamic: return "dynamic";
275 }
276 return "unknown";
277}
278
279// Convert PropDef to PropInfo
282 info.name = std::string(prop.name);
283 info.type = propTypeToString(prop.type);
285 info.required = prop.required;
286 info.description = std::string(prop.description);
287 info.unit = std::string(prop.unit);
288 info.regex_pattern = std::string(prop.regex_pattern);
289
290 // Set type-specific values
291 switch (prop.type) {
293 info.default_value = std::to_string(prop.int_default);
294 info.min_value = std::to_string(prop.int_min);
295 info.max_value = std::to_string(prop.int_max);
296 break;
298 info.default_value = std::to_string(prop.float_default);
299 info.min_value = std::to_string(prop.float_min);
300 info.max_value = std::to_string(prop.float_max);
301 break;
303 info.default_value = prop.bool_default ? "true" : "false";
304 break;
306 info.default_value = std::string(prop.string_default);
307 break;
309 info.default_value = std::string(prop.string_default);
310 for (size_t i = 0; i < prop.enum_value_count; ++i) {
311 info.enum_values.push_back(std::string(prop.enum_values[i]));
312 }
313 break;
314 }
315 return info;
316}
317
318// Convert ModuleCategory to string
319inline std::string categoryToString(ModuleCategory cat) {
320 switch (cat) {
321 case ModuleCategory::Source: return "source";
322 case ModuleCategory::Sink: return "sink";
323 case ModuleCategory::Transform: return "transform";
324 case ModuleCategory::Analytics: return "analytics";
325 case ModuleCategory::Controller: return "controller";
326 case ModuleCategory::Utility: return "utility";
327 }
328 return "unknown";
329}
330
331// ============================================================
332// Type trait to detect if PropsClass has applyProperties method
333// Used by REGISTER_MODULE macro to apply TOML properties
334// ============================================================
335template<typename T, typename = void>
336struct has_apply_properties : std::false_type {};
337
338template<typename T>
340 std::void_t<decltype(T::applyProperties(
341 std::declval<T&>(),
342 std::declval<const std::map<std::string, ScalarPropertyValue>&>(),
343 std::declval<std::vector<std::string>&>()
344 ))>
345> : std::true_type {};
346
347template<typename T>
349
350// ============================================================
351// Helper function template to apply properties using SFINAE
352// MSVC has issues with if constexpr in lambdas within macros,
353// so we use function overloading with enable_if instead.
354// ============================================================
355template<typename T>
357 T& props,
358 const std::map<std::string, ScalarPropertyValue>& propMap,
359 std::vector<std::string>& missing
360) -> std::enable_if_t<has_apply_properties_v<T>, void>
361{
362 T::applyProperties(props, propMap, missing);
363}
364
365template<typename T>
366inline auto tryApplyProperties(
367 T& props,
368 const std::map<std::string, ScalarPropertyValue>&,
369 std::vector<std::string>&
370) -> std::enable_if_t<!has_apply_properties_v<T>, void>
371{
372 // No-op for types without applyProperties method
373 // Module will use default-constructed props
374}
375
376} // namespace detail
377
378// ============================================================
379// REGISTER_MODULE Macro
380// Registers a module at static initialization time
381//
382// Usage in .cpp file:
383// REGISTER_MODULE(FileReaderModule, FileReaderModuleProps)
384//
385// Requirements:
386// - ModuleClass must have a nested `Metadata` struct with:
387// - static constexpr std::string_view name
388// - static constexpr ModuleCategory category
389// - static constexpr std::string_view version
390// - static constexpr std::string_view description
391// - static constexpr std::array<std::string_view, N> tags
392// - static constexpr std::array<PinDef, N> inputs
393// - static constexpr std::array<PinDef, N> outputs
394// - static constexpr std::array<PropDef, N> properties
395// ============================================================
396#define REGISTER_MODULE(ModuleClass, PropsClass) \
397 static_assert(std::is_default_constructible<PropsClass>::value, \
398 "REGISTER_MODULE requires " #PropsClass " to have a default constructor. " \
399 "Add a default constructor to " #PropsClass " that initializes all members " \
400 "with sensible defaults. Required properties can be marked with PropDef::Required*()."); \
401 namespace apra { namespace _reg_##ModuleClass { \
402 inline void registerIfNeeded() { \
403 auto& registry = ModuleRegistry::instance(); \
404 const std::string moduleName = std::string(ModuleClass::Metadata::name); \
405 if (registry.hasModule(moduleName)) { \
406 return; /* Already registered */ \
407 } \
408 \
409 ModuleInfo info; \
410 info.name = moduleName; \
411 info.category = ModuleClass::Metadata::category; \
412 info.version = std::string(ModuleClass::Metadata::version); \
413 info.description = std::string(ModuleClass::Metadata::description); \
414 \
415 /* Copy tags */ \
416 for (const auto& tag : ModuleClass::Metadata::tags) { \
417 info.tags.push_back(std::string(tag)); \
418 } \
419 \
420 /* Copy inputs */ \
421 for (const auto& pin : ModuleClass::Metadata::inputs) { \
422 info.inputs.push_back(detail::toPinInfo(pin)); \
423 } \
424 \
425 /* Copy outputs */ \
426 for (const auto& pin : ModuleClass::Metadata::outputs) { \
427 info.outputs.push_back(detail::toPinInfo(pin)); \
428 } \
429 \
430 /* Copy properties */ \
431 for (const auto& prop : ModuleClass::Metadata::properties) { \
432 info.properties.push_back(detail::toPropInfo(prop)); \
433 } \
434 \
435 /* Factory function - creates module with props */ \
436 info.factory = [](const std::map<std::string, ScalarPropertyValue>& props) \
437 -> std::unique_ptr<Module> { \
438 PropsClass moduleProps; \
439 /* Apply properties using SFINAE helper (MSVC-compatible) */ \
440 std::vector<std::string> missingRequired; \
441 detail::tryApplyProperties(moduleProps, props, missingRequired); \
442 if (!missingRequired.empty()) { \
443 std::string msg = "Missing required properties: "; \
444 for (size_t i = 0; i < missingRequired.size(); ++i) { \
445 if (i > 0) msg += ", "; \
446 msg += missingRequired[i]; \
447 } \
448 throw std::runtime_error(msg); \
449 } \
450 return std::make_unique<ModuleClass>(moduleProps); \
451 }; \
452 \
453 registry.registerModule(std::move(info)); \
454 } \
455 static const int _trigger = []() { \
456 registerIfNeeded(); \
457 ModuleRegistry::instance().addRegistrationCallback(registerIfNeeded); \
458 return 0; \
459 }(); \
460 }}
461
462} // namespace apra
MemType
Definition FrameMetadata.h:58
@ HOST
Definition FrameMetadata.h:59
@ HOST_PINNED
Definition FrameMetadata.h:60
@ CUDA_DEVICE
Definition FrameMetadata.h:61
@ DMABUF
Definition FrameMetadata.h:62
ImageType
Definition ImageMetadata.h:11
@ RGBA
Definition ImageMetadata.h:17
@ YUV411_I
Definition ImageMetadata.h:18
@ YUV420
Definition ImageMetadata.h:20
@ MONO
Definition ImageMetadata.h:13
@ UNSET
Definition ImageMetadata.h:12
@ YUV444
Definition ImageMetadata.h:19
@ YUYV
Definition ImageMetadata.h:22
@ BGR
Definition ImageMetadata.h:14
@ UYVY
Definition ImageMetadata.h:21
@ BGRA
Definition ImageMetadata.h:15
@ NV12
Definition ImageMetadata.h:23
@ RGB
Definition ImageMetadata.h:16
Definition Module.h:151
Definition ModuleRegistry.h:123
~ModuleRegistry()=default
std::unique_ptr< Module > createCudaModule(const std::string &name, const std::map< std::string, ScalarPropertyValue > &props, void *cudaStreamPtr) const
Definition ModuleRegistry.cpp:144
std::function< void()> RegistrationCallback
Definition ModuleRegistry.h:133
ModuleRegistry(const ModuleRegistry &)=delete
const ModuleInfo * getModule(const std::string &name) const
Definition ModuleRegistry.cpp:64
std::vector< std::string > getModulesWithAllTags(const std::vector< std::string > &tags) const
Definition ModuleRegistry.cpp:105
std::string toToml() const
Definition ModuleRegistry.cpp:337
std::mutex mutex_
Definition ModuleRegistry.h:204
std::unique_ptr< Module > createModule(const std::string &name, const std::map< std::string, ScalarPropertyValue > &props) const
Definition ModuleRegistry.cpp:126
bool setCuContextFactory(const std::string &name, ModuleInfo::CuContextFactoryFn factory)
Definition ModuleRegistry.cpp:207
bool hasModule(const std::string &name) const
Definition ModuleRegistry.cpp:59
std::vector< std::string > getModulesByCategory(ModuleCategory cat) const
Definition ModuleRegistry.cpp:83
std::map< std::string, ModuleInfo > modules_
Definition ModuleRegistry.h:202
void rerunRegistrations()
Definition ModuleRegistry.cpp:42
std::vector< RegistrationCallback > registrationCallbacks_
Definition ModuleRegistry.h:203
void clear()
Definition ModuleRegistry.cpp:426
void addRegistrationCallback(RegistrationCallback callback)
Definition ModuleRegistry.cpp:37
ModuleRegistry()=default
size_t size() const
Definition ModuleRegistry.cpp:431
std::unique_ptr< Module > createCuContextModule(const std::string &name, const std::map< std::string, ScalarPropertyValue > &props, void *cuContextPtr) const
Definition ModuleRegistry.cpp:187
std::vector< std::string > getAllModules() const
Definition ModuleRegistry.cpp:73
bool setCudaFactory(const std::string &name, ModuleInfo::CudaFactoryFn factory)
Definition ModuleRegistry.cpp:164
std::string toJson() const
Definition ModuleRegistry.cpp:230
bool moduleRequiresCudaStream(const std::string &name) const
Definition ModuleRegistry.cpp:175
ModuleRegistry & operator=(const ModuleRegistry &)=delete
bool moduleRequiresCuContext(const std::string &name) const
Definition ModuleRegistry.cpp:218
static ModuleRegistry & instance()
Definition ModuleRegistry.cpp:17
std::vector< std::string > getModulesByTag(const std::string &tag) const
Definition ModuleRegistry.cpp:94
std::string propTypeToString(PropDef::Type type)
Definition ModuleRegistry.h:248
std::string mutabilityToString(PropDef::Mutability mut)
Definition ModuleRegistry.h:271
ModuleInfo::PinInfo toPinInfo(const PinDef &pin)
Definition ModuleRegistry.h:213
ModuleInfo::PropInfo toPropInfo(const PropDef &prop)
Definition ModuleRegistry.h:280
std::string imageTypeToString(ImageType type)
Definition ModuleRegistry.h:229
constexpr bool has_apply_properties_v
Definition ModuleRegistry.h:348
std::string categoryToString(ModuleCategory cat)
Definition ModuleRegistry.h:319
std::string memTypeToString(MemType type)
Definition ModuleRegistry.h:260
auto tryApplyProperties(T &props, const std::map< std::string, ScalarPropertyValue > &propMap, std::vector< std::string > &missing) -> std::enable_if_t< has_apply_properties_v< T >, void >
Definition ModuleRegistry.h:356
Definition FrameTypeRegistrations.h:10
ModuleCategory
Definition Metadata.h:27
ModuleRegistrationBuilder< ModuleClass, PropsClass > registerModule()
Definition ModuleRegistrationBuilder.h:550
std::variant< int64_t, double, bool, std::string > ScalarPropertyValue
Definition ModuleRegistry.h:30
Definition ModuleRegistry.h:48
MemType memType
Definition ModuleRegistry.h:53
std::string name
Definition ModuleRegistry.h:49
bool required
Definition ModuleRegistry.h:51
std::vector< ImageType > image_types
Definition ModuleRegistry.h:54
std::string description
Definition ModuleRegistry.h:52
std::vector< std::string > frame_types
Definition ModuleRegistry.h:50
Definition ModuleRegistry.h:59
bool required
Definition ModuleRegistry.h:63
std::string type
Definition ModuleRegistry.h:61
std::string max_value
Definition ModuleRegistry.h:66
std::string mutability
Definition ModuleRegistry.h:62
std::string unit
Definition ModuleRegistry.h:70
std::string regex_pattern
Definition ModuleRegistry.h:67
std::string name
Definition ModuleRegistry.h:60
std::string description
Definition ModuleRegistry.h:69
std::string min_value
Definition ModuleRegistry.h:65
std::vector< std::string > enum_values
Definition ModuleRegistry.h:68
std::string default_value
Definition ModuleRegistry.h:64
Definition ModuleRegistry.h:106
std::function< bool(const std::string &, const ScalarPropertyValue &)> setProperty
Definition ModuleRegistry.h:109
std::function< ScalarPropertyValue(const std::string &)> getProperty
Definition ModuleRegistry.h:108
std::function< std::vector< std::string >()> getDynamicPropertyNames
Definition ModuleRegistry.h:107
Definition ModuleRegistry.h:41
CuContextFactoryFn cuContextFactory
Definition ModuleRegistry.h:99
bool selfManagedOutputPins
Definition ModuleRegistry.h:116
bool requiresCuContext
Definition ModuleRegistry.h:102
ModuleCategory category
Definition ModuleRegistry.h:43
std::vector< std::string > tags
Definition ModuleRegistry.h:46
bool requiresCudaStream
Definition ModuleRegistry.h:90
std::function< PropertyAccessors(Module *)> PropertyAccessorFactoryFn
Definition ModuleRegistry.h:111
std::string description
Definition ModuleRegistry.h:45
std::vector< PropInfo > properties
Definition ModuleRegistry.h:72
std::function< std::unique_ptr< Module >( const std::map< std::string, ScalarPropertyValue > &, void *cuContextPtr)> CuContextFactoryFn
Definition ModuleRegistry.h:95
std::function< std::unique_ptr< Module >( const std::map< std::string, ScalarPropertyValue > &, void *cudaStreamPtr)> CudaFactoryFn
Definition ModuleRegistry.h:83
std::vector< PinInfo > inputs
Definition ModuleRegistry.h:56
std::function< std::unique_ptr< Module >( const std::map< std::string, ScalarPropertyValue > &)> FactoryFn
Definition ModuleRegistry.h:75
std::vector< PinInfo > outputs
Definition ModuleRegistry.h:57
std::string version
Definition ModuleRegistry.h:44
PropertyAccessorFactoryFn propertyAccessorFactory
Definition ModuleRegistry.h:112
std::string name
Definition ModuleRegistry.h:42
FactoryFn factory
Definition ModuleRegistry.h:78
CudaFactoryFn cudaFactory
Definition ModuleRegistry.h:87
Definition Metadata.h:49
MemType memType
Definition Metadata.h:55
std::array< ImageType, MAX_IMAGE_TYPES > image_types
Definition Metadata.h:58
size_t frame_type_count
Definition Metadata.h:52
bool required
Definition Metadata.h:53
std::string_view description
Definition Metadata.h:54
size_t image_type_count
Definition Metadata.h:59
std::string_view name
Definition Metadata.h:50
std::array< std::string_view, MAX_FRAME_TYPES > frame_types
Definition Metadata.h:51
Definition Metadata.h:222
std::string_view regex_pattern
Definition Metadata.h:247
Mutability
Definition Metadata.h:224
Mutability mutability
Definition Metadata.h:231
int64_t int_default
Definition Metadata.h:237
size_t enum_value_count
Definition Metadata.h:251
int64_t int_max
Definition Metadata.h:239
Type type
Definition Metadata.h:230
double float_default
Definition Metadata.h:240
int64_t int_min
Definition Metadata.h:238
std::array< std::string_view, MAX_ENUM_VALUES > enum_values
Definition Metadata.h:250
Type
Definition Metadata.h:223
bool bool_default
Definition Metadata.h:243
double float_min
Definition Metadata.h:241
std::string_view unit
Definition Metadata.h:255
std::string_view description
Definition Metadata.h:254
std::string_view name
Definition Metadata.h:229
double float_max
Definition Metadata.h:242
bool required
Definition Metadata.h:234
std::string_view string_default
Definition Metadata.h:246
Definition ModuleRegistry.h:336