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