Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
ModuleRegistrationBuilder.h
1// ============================================================
2// File: declarative/ModuleRegistrationBuilder.h
3// Task D2: Property Binding System
4//
5// Provides fluent builder for module registration.
6// Usage:
7// registerModule<FileReaderModule, FileReaderModuleProps>()
8// .category(ModuleCategory::Source)
9// .description("Reads frames from files")
10// .tags("reader", "file")
11// .output("output", "EncodedImage");
12// ============================================================
13
14#pragma once
15
16#include "ModuleRegistry.h"
17#include "PropertyMacros.h"
18#include "Module.h" // For ModuleProps base class
19#include <string>
20#include <vector>
21#include <type_traits>
22#include <typeinfo>
23#include <iostream> // Debug output
24#include <limits> // For std::numeric_limits
25#include <cstdint> // For INT64_MIN, INT64_MAX
26
27#ifdef __GNUC__
28#include <cxxabi.h>
29#endif
30
31namespace apra {
32
33// Type trait has_apply_properties is defined in ModuleRegistry.h
34
35namespace detail {
36 // Helper to join strings
37 inline std::string joinStrings(const std::vector<std::string>& vec, const std::string& sep = ", ") {
38 std::string result;
39 for (size_t i = 0; i < vec.size(); ++i) {
40 if (i > 0) result += sep;
41 result += vec[i];
42 }
43 return result;
44 }
45
46 // ============================================================
47 // SFINAE helpers for detecting dynamic property support on Props class
48 // ============================================================
49
50 // Check if PropsClass has static dynamicPropertyNames()
51 template<typename P, typename = void>
52 struct has_dynamic_property_names : std::false_type {};
53
54 template<typename P>
56 std::void_t<decltype(P::dynamicPropertyNames())>> : std::true_type {};
57
58 // Check if PropsClass has getProperty(string) const
59 template<typename P, typename = void>
60 struct has_get_property : std::false_type {};
61
62 template<typename P>
64 std::void_t<decltype(std::declval<const P&>().getProperty(std::string{}))>> : std::true_type {};
65
66 // Check if PropsClass has setProperty(string, value)
67 template<typename P, typename = void>
68 struct has_set_property : std::false_type {};
69
70 template<typename P>
72 std::void_t<decltype(std::declval<P&>().setProperty(std::string{}, ScalarPropertyValue{}))>> : std::true_type {};
73
74 // Check if ModuleClass has getProps() and setProps(PropsClass&)
75 template<typename M, typename P, typename = void>
76 struct has_get_set_props : std::false_type {};
77
78 template<typename M, typename P>
79 struct has_get_set_props<M, P,
80 std::void_t<
81 decltype(std::declval<M&>().getProps()),
82 decltype(std::declval<M&>().setProps(std::declval<P&>()))
83 >> : std::true_type {};
84
85 // Combined check: module supports dynamic properties if all methods exist
86 template<typename M, typename P>
87 constexpr bool supports_dynamic_props_v =
92}
93
94// ============================================================
95// Helper to demangle type names (for automatic name detection)
96// ============================================================
97inline std::string demangleTypeName(const char* mangledName) {
98#ifdef __GNUC__
99 int status = 0;
100 char* demangled = abi::__cxa_demangle(mangledName, nullptr, nullptr, &status);
101 if (status == 0 && demangled) {
102 std::string result(demangled);
103 free(demangled);
104 return result;
105 }
106#endif
107 return std::string(mangledName);
108}
109
110// Extract just the class name (remove namespace and MSVC prefixes)
111inline std::string extractClassName(const std::string& fullName) {
112 std::string name = fullName;
113
114 // MSVC prepends "class " or "struct " to type names
115 if (name.substr(0, 6) == "class ") {
116 name = name.substr(6);
117 } else if (name.substr(0, 7) == "struct ") {
118 name = name.substr(7);
119 }
120
121 // Remove namespace prefix
122 auto pos = name.rfind("::");
123 if (pos != std::string::npos) {
124 name = name.substr(pos + 2);
125 }
126
127 return name;
128}
129
130// ============================================================
131// ModuleRegistrationBuilder - fluent builder for module registration
132// ============================================================
133template<typename ModuleClass, typename PropsClass>
136 bool registered_ = false;
137
138public:
140 // Automatically derive module name from class name
141 std::string fullName = demangleTypeName(typeid(ModuleClass).name());
142 info_.name = extractClassName(fullName);
143 }
144
145 // Explicitly set name (optional - usually auto-derived)
146 ModuleRegistrationBuilder& name(const std::string& n) {
147 info_.name = n;
148 return *this;
149 }
150
151 // Set category (required)
153 info_.category = cat;
154 return *this;
155 }
156
157 // Set description (required)
158 ModuleRegistrationBuilder& description(const std::string& desc) {
159 info_.description = desc;
160 return *this;
161 }
162
163 // Set version (optional, defaults to "1.0")
164 ModuleRegistrationBuilder& version(const std::string& ver) {
165 info_.version = ver;
166 return *this;
167 }
168
169 // Add single tag
170 ModuleRegistrationBuilder& tag(const std::string& t) {
171 info_.tags.push_back(t);
172 return *this;
173 }
174
175 // Add multiple tags (variadic)
176 template<typename... Tags>
178 (info_.tags.push_back(std::string(t)), ...);
179 return *this;
180 }
181
182 // Add input pin with single frame type
183 ModuleRegistrationBuilder& input(const std::string& pinName, const std::string& frameType,
184 MemType memType = FrameMetadata::HOST) {
186 pin.name = pinName;
187 pin.frame_types.push_back(frameType);
188 pin.required = true;
189 pin.memType = memType;
190 info_.inputs.push_back(std::move(pin));
191 return *this;
192 }
193
194 // Add input pin with multiple frame types (variadic)
195 template<typename... FrameTypes>
196 ModuleRegistrationBuilder& input(const std::string& pinName, const std::string& ft1, FrameTypes... rest) {
198 pin.name = pinName;
199 pin.frame_types.push_back(ft1);
200 (pin.frame_types.push_back(std::string(rest)), ...);
201 pin.required = true;
202 info_.inputs.push_back(std::move(pin));
203 return *this;
204 }
205
206 // Add input pin with memType and multiple frame types
207 ModuleRegistrationBuilder& inputWithMemType(const std::string& pinName, MemType memType,
208 const std::string& frameType) {
209 return input(pinName, frameType, memType);
210 }
211
212 // Add CUDA input pin (convenience for CUDA_DEVICE memType)
213 ModuleRegistrationBuilder& cudaInput(const std::string& pinName, const std::string& frameType) {
214 return input(pinName, frameType, FrameMetadata::CUDA_DEVICE);
215 }
216
217 // Add optional input pin
218 ModuleRegistrationBuilder& optionalInput(const std::string& pinName, const std::string& frameType,
219 MemType memType = FrameMetadata::HOST) {
221 pin.name = pinName;
222 pin.frame_types.push_back(frameType);
223 pin.required = false;
224 pin.memType = memType;
225 info_.inputs.push_back(std::move(pin));
226 return *this;
227 }
228
229 // Add output pin with single frame type
230 ModuleRegistrationBuilder& output(const std::string& pinName, const std::string& frameType,
231 MemType memType = FrameMetadata::HOST) {
233 pin.name = pinName;
234 pin.frame_types.push_back(frameType);
235 pin.required = true;
236 pin.memType = memType;
237 info_.outputs.push_back(std::move(pin));
238 return *this;
239 }
240
241 // Add output pin with multiple frame types (variadic)
242 template<typename... FrameTypes>
243 ModuleRegistrationBuilder& output(const std::string& pinName, const std::string& ft1, FrameTypes... rest) {
245 pin.name = pinName;
246 pin.frame_types.push_back(ft1);
247 (pin.frame_types.push_back(std::string(rest)), ...);
248 pin.required = true;
249 info_.outputs.push_back(std::move(pin));
250 return *this;
251 }
252
253 // Add output pin with memType and multiple frame types
254 ModuleRegistrationBuilder& outputWithMemType(const std::string& pinName, MemType memType,
255 const std::string& frameType) {
256 return output(pinName, frameType, memType);
257 }
258
259 // Add CUDA output pin (convenience for CUDA_DEVICE memType)
260 ModuleRegistrationBuilder& cudaOutput(const std::string& pinName, const std::string& frameType) {
261 return output(pinName, frameType, FrameMetadata::CUDA_DEVICE);
262 }
263
264 // ============================================================
265 // Image Type methods (set allowed pixel formats on last-added pin)
266 // ============================================================
267
268 // Set image types on the last input pin
269 template<typename... ImageTypes>
271 if (!info_.inputs.empty()) {
272 (info_.inputs.back().image_types.push_back(types), ...);
273 }
274 return *this;
275 }
276
277 // Set image types on the last output pin
278 template<typename... ImageTypes>
280 if (!info_.outputs.empty()) {
281 (info_.outputs.back().image_types.push_back(types), ...);
282 }
283 return *this;
284 }
285
286 // Add input pin with specific image types
287 template<typename... ImageTypes>
288 ModuleRegistrationBuilder& inputWithImageTypes(const std::string& pinName, const std::string& frameType,
289 MemType memType, ImageTypes... types) {
290 input(pinName, frameType, memType);
291 inputImageTypes(types...);
292 return *this;
293 }
294
295 // Add output pin with specific image types
296 template<typename... ImageTypes>
297 ModuleRegistrationBuilder& outputWithImageTypes(const std::string& pinName, const std::string& frameType,
298 MemType memType, ImageTypes... types) {
299 output(pinName, frameType, memType);
300 outputImageTypes(types...);
301 return *this;
302 }
303
304 // ============================================================
305 // Property definition methods
306 // ============================================================
307
308 // Add a string property
309 ModuleRegistrationBuilder& stringProp(const std::string& name, const std::string& desc,
310 bool required = false, const std::string& defaultVal = "") {
312 prop.name = name;
313 prop.type = "string";
314 prop.mutability = "static";
315 prop.required = required;
316 prop.default_value = defaultVal;
317 prop.description = desc;
318 info_.properties.push_back(std::move(prop));
319 return *this;
320 }
321
322 // Add an integer property
323 ModuleRegistrationBuilder& intProp(const std::string& name, const std::string& desc,
324 bool required = false, int64_t defaultVal = 0,
325 int64_t minVal = INT64_MIN, int64_t maxVal = INT64_MAX) {
327 prop.name = name;
328 prop.type = "int";
329 prop.mutability = "static";
330 prop.required = required;
331 prop.default_value = std::to_string(defaultVal);
332 if (minVal != INT64_MIN) prop.min_value = std::to_string(minVal);
333 if (maxVal != INT64_MAX) prop.max_value = std::to_string(maxVal);
334 prop.description = desc;
335 info_.properties.push_back(std::move(prop));
336 return *this;
337 }
338
339 // Add a float property
340 ModuleRegistrationBuilder& floatProp(const std::string& name, const std::string& desc,
341 bool required = false, double defaultVal = 0.0,
342 double minVal = -std::numeric_limits<double>::max(),
343 double maxVal = std::numeric_limits<double>::max()) {
345 prop.name = name;
346 prop.type = "float";
347 prop.mutability = "static";
348 prop.required = required;
349 prop.default_value = std::to_string(defaultVal);
350 if (minVal != -std::numeric_limits<double>::max()) prop.min_value = std::to_string(minVal);
351 if (maxVal != std::numeric_limits<double>::max()) prop.max_value = std::to_string(maxVal);
352 prop.description = desc;
353 info_.properties.push_back(std::move(prop));
354 return *this;
355 }
356
357 // Add a boolean property
358 ModuleRegistrationBuilder& boolProp(const std::string& name, const std::string& desc,
359 bool required = false, bool defaultVal = false) {
361 prop.name = name;
362 prop.type = "bool";
363 prop.mutability = "static";
364 prop.required = required;
365 prop.default_value = defaultVal ? "true" : "false";
366 prop.description = desc;
367 info_.properties.push_back(std::move(prop));
368 return *this;
369 }
370
371 // Add an enum property
372 template<typename... EnumValues>
373 ModuleRegistrationBuilder& enumProp(const std::string& name, const std::string& desc,
374 bool required, const std::string& defaultVal,
375 EnumValues... values) {
377 prop.name = name;
378 prop.type = "enum";
379 prop.mutability = "static";
380 prop.required = required;
381 prop.default_value = defaultVal;
382 prop.description = desc;
383 (prop.enum_values.push_back(std::string(values)), ...);
384 info_.properties.push_back(std::move(prop));
385 return *this;
386 }
387
388 // Add a dynamic property (can be changed at runtime)
389 ModuleRegistrationBuilder& dynamicProp(const std::string& name, const std::string& type,
390 const std::string& desc, bool required = false,
391 const std::string& defaultVal = "") {
393 prop.name = name;
394 prop.type = type;
395 prop.mutability = "dynamic";
396 prop.required = required;
397 prop.default_value = defaultVal;
398 prop.description = desc;
399 info_.properties.push_back(std::move(prop));
400 return *this;
401 }
402
403 // Mark module as managing its own output pins (creates them in addInputPin)
404 // This prevents ModuleFactory from pre-creating output pins
409
410 // Mark module as requiring a CUDA stream (cudastream_sp)
411 // Modules with this flag will have their cudaFactory called instead of factory
412 // The cudaFactory receives a void* pointing to the cudastream_sp
417
418 // Destructor registers the module
420 if (!registered_) {
421 finalize();
422 }
423 }
424
425 // Finalize with a custom factory function
426 // Use this for Props classes that don't have default constructors
427 // (e.g., Jetson modules like NvTransform, EglRenderer)
428 // The lambda is defined at the call site, avoiding GCC 9 template lambda issues
429 template<typename FactoryLambda>
430 void finalizeWith(FactoryLambda&& factoryFn) {
431 if (registered_) return;
432 registered_ = true;
433
434 if (info_.version.empty()) {
435 info_.version = "1.0";
436 }
437
438 // Forward the factory lambda directly
439 info_.factory = ModuleInfo::FactoryFn(std::forward<FactoryLambda>(factoryFn));
440
441 // No property accessor factory for custom-constructed modules
442 // (they typically don't support dynamic properties)
443
445 }
446
447 // Explicit registration (called by destructor if not called manually)
448 void finalize() {
449 if (registered_) return;
450 registered_ = true;
451
452 // Set default version if not specified
453 if (info_.version.empty()) {
454 info_.version = "1.0";
455 }
456
457 // Create factory function that applies properties and creates module
458 // Note: Explicit ModuleInfo::FactoryFn cast required for GCC 9 compatibility
459 // (GCC 9 has issues with lambda-to-std::function conversion in templates)
461 [](const std::map<std::string, ScalarPropertyValue>& props)
462 -> std::unique_ptr<Module> {
463
464 PropsClass moduleProps;
465
466 // Apply properties using SFINAE helper (MSVC-compatible)
467 // Uses function overloading instead of if constexpr
468 std::vector<std::string> missingRequired;
469 detail::tryApplyProperties(moduleProps, props, missingRequired);
470
471 if (!missingRequired.empty()) {
472 throw std::runtime_error(
473 "Missing required properties: " +
474 detail::joinStrings(missingRequired));
475 }
476
477 return std::make_unique<ModuleClass>(moduleProps);
478 });
479
480 // Create property accessor factory for modules that support dynamic props
482
483 // Register with the singleton registry
485 }
486
487private:
488 // Helper to create property accessor factory (SFINAE-enabled)
489 // Note: Explicit ModuleInfo::PropertyAccessorFactoryFn cast required for GCC 9 compatibility
490 template<typename M = ModuleClass, typename P = PropsClass>
491 typename std::enable_if<detail::supports_dynamic_props_v<M, P>, void>::type
494 [](Module* rawModule) -> ModuleInfo::PropertyAccessors {
496
497 // Cast to concrete module type
498 auto* typedModule = static_cast<ModuleClass*>(rawModule);
499
500 // Get list of dynamic property names (static on props class)
501 accessors.getDynamicPropertyNames = []() -> std::vector<std::string> {
502 return PropsClass::dynamicPropertyNames();
503 };
504
505 // Get property value from current props
506 accessors.getProperty = [typedModule](const std::string& name) -> ScalarPropertyValue {
507 PropsClass props = typedModule->getProps();
508 return props.getProperty(name);
509 };
510
511 // Set property value: get current props, modify, apply back
512 accessors.setProperty = [typedModule](const std::string& name,
513 const ScalarPropertyValue& value) -> bool {
514 PropsClass props = typedModule->getProps();
515 bool success = props.setProperty(name, value);
516 if (success) {
517 typedModule->setProps(props);
518 }
519 return success;
520 };
521
522 return accessors;
523 });
524 }
525
526 // Fallback for modules without dynamic property support
527 template<typename M = ModuleClass, typename P = PropsClass>
528 typename std::enable_if<!detail::supports_dynamic_props_v<M, P>, void>::type
530 // No-op: leave propertyAccessorFactory as nullptr
531 }
532
533public:
534
535 // Prevent copying
538
539 // Allow moving
541 : info_(std::move(other.info_)), registered_(other.registered_) {
542 other.registered_ = true; // Prevent double registration
543 }
544};
545
546// ============================================================
547// Factory function for fluent registration
548// ============================================================
549template<typename ModuleClass, typename PropsClass>
553
554// Overload for modules without Props class (rare)
555template<typename ModuleClass>
559
560// ============================================================
561// CUDA Module Registration Helper
562// Use this to set the cudaFactory for modules that require cudastream_sp
563// Must be called after the module is registered via registerModule()
564//
565// Usage (in ModuleRegistrations.cpp, inside #ifdef ENABLE_CUDA):
566// #include "CudaCommon.h"
567// setCudaModuleFactory<GaussianBlur, GaussianBlurProps>(
568// [](const auto& props, cudastream_sp stream) {
569// GaussianBlurProps moduleProps(stream);
570// // apply props...
571// return std::make_unique<GaussianBlur>(moduleProps);
572// });
573// ============================================================
574template<typename ModuleClass, typename PropsClass, typename CudaFactoryLambda>
575void setCudaModuleFactory(const std::string& moduleName, CudaFactoryLambda&& cudaFactory) {
576 auto& registry = ModuleRegistry::instance();
577 // Note: We can't directly modify the registry entry, so we need
578 // a different approach. See ModuleRegistrations.cpp for the pattern.
579 // This function is kept for documentation purposes.
580 (void)cudaFactory; // Suppress unused warning
581}
582
583} // namespace apra
MemType
Definition FrameMetadata.h:58
@ HOST
Definition FrameMetadata.h:59
@ CUDA_DEVICE
Definition FrameMetadata.h:61
Definition Module.h:151
Definition ModuleRegistrationBuilder.h:134
std::enable_if<!detail::supports_dynamic_props_v< M, P >, void >::type createPropertyAccessorFactory()
Definition ModuleRegistrationBuilder.h:529
ModuleRegistrationBuilder & inputWithMemType(const std::string &pinName, MemType memType, const std::string &frameType)
Definition ModuleRegistrationBuilder.h:207
ModuleRegistrationBuilder & enumProp(const std::string &name, const std::string &desc, bool required, const std::string &defaultVal, EnumValues... values)
Definition ModuleRegistrationBuilder.h:373
ModuleRegistrationBuilder & cudaStreamRequired()
Definition ModuleRegistrationBuilder.h:413
ModuleInfo info_
Definition ModuleRegistrationBuilder.h:135
ModuleRegistrationBuilder(const ModuleRegistrationBuilder &)=delete
ModuleRegistrationBuilder & stringProp(const std::string &name, const std::string &desc, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:309
ModuleRegistrationBuilder & input(const std::string &pinName, const std::string &ft1, FrameTypes... rest)
Definition ModuleRegistrationBuilder.h:196
std::enable_if< detail::supports_dynamic_props_v< M, P >, void >::type createPropertyAccessorFactory()
Definition ModuleRegistrationBuilder.h:492
ModuleRegistrationBuilder & outputImageTypes(ImageTypes... types)
Definition ModuleRegistrationBuilder.h:279
void finalizeWith(FactoryLambda &&factoryFn)
Definition ModuleRegistrationBuilder.h:430
ModuleRegistrationBuilder & inputImageTypes(ImageTypes... types)
Definition ModuleRegistrationBuilder.h:270
ModuleRegistrationBuilder & name(const std::string &n)
Definition ModuleRegistrationBuilder.h:146
ModuleRegistrationBuilder & intProp(const std::string &name, const std::string &desc, bool required=false, int64_t defaultVal=0, int64_t minVal=INT64_MIN, int64_t maxVal=INT64_MAX)
Definition ModuleRegistrationBuilder.h:323
ModuleRegistrationBuilder & outputWithImageTypes(const std::string &pinName, const std::string &frameType, MemType memType, ImageTypes... types)
Definition ModuleRegistrationBuilder.h:297
ModuleRegistrationBuilder & category(ModuleCategory cat)
Definition ModuleRegistrationBuilder.h:152
ModuleRegistrationBuilder & output(const std::string &pinName, const std::string &ft1, FrameTypes... rest)
Definition ModuleRegistrationBuilder.h:243
ModuleRegistrationBuilder & output(const std::string &pinName, const std::string &frameType, MemType memType=FrameMetadata::HOST)
Definition ModuleRegistrationBuilder.h:230
ModuleRegistrationBuilder()
Definition ModuleRegistrationBuilder.h:139
ModuleRegistrationBuilder & version(const std::string &ver)
Definition ModuleRegistrationBuilder.h:164
~ModuleRegistrationBuilder()
Definition ModuleRegistrationBuilder.h:419
ModuleRegistrationBuilder & operator=(const ModuleRegistrationBuilder &)=delete
ModuleRegistrationBuilder & inputWithImageTypes(const std::string &pinName, const std::string &frameType, MemType memType, ImageTypes... types)
Definition ModuleRegistrationBuilder.h:288
ModuleRegistrationBuilder & input(const std::string &pinName, const std::string &frameType, MemType memType=FrameMetadata::HOST)
Definition ModuleRegistrationBuilder.h:183
void finalize()
Definition ModuleRegistrationBuilder.h:448
ModuleRegistrationBuilder & tag(const std::string &t)
Definition ModuleRegistrationBuilder.h:170
ModuleRegistrationBuilder & description(const std::string &desc)
Definition ModuleRegistrationBuilder.h:158
bool registered_
Definition ModuleRegistrationBuilder.h:136
ModuleRegistrationBuilder & optionalInput(const std::string &pinName, const std::string &frameType, MemType memType=FrameMetadata::HOST)
Definition ModuleRegistrationBuilder.h:218
ModuleRegistrationBuilder & boolProp(const std::string &name, const std::string &desc, bool required=false, bool defaultVal=false)
Definition ModuleRegistrationBuilder.h:358
ModuleRegistrationBuilder & tags(Tags... t)
Definition ModuleRegistrationBuilder.h:177
ModuleRegistrationBuilder(ModuleRegistrationBuilder &&other) noexcept
Definition ModuleRegistrationBuilder.h:540
ModuleRegistrationBuilder & outputWithMemType(const std::string &pinName, MemType memType, const std::string &frameType)
Definition ModuleRegistrationBuilder.h:254
ModuleRegistrationBuilder & selfManagedOutputPins()
Definition ModuleRegistrationBuilder.h:405
ModuleRegistrationBuilder & cudaInput(const std::string &pinName, const std::string &frameType)
Definition ModuleRegistrationBuilder.h:213
ModuleRegistrationBuilder & cudaOutput(const std::string &pinName, const std::string &frameType)
Definition ModuleRegistrationBuilder.h:260
ModuleRegistrationBuilder & floatProp(const std::string &name, const std::string &desc, bool required=false, double defaultVal=0.0, double minVal=-std::numeric_limits< double >::max(), double maxVal=std::numeric_limits< double >::max())
Definition ModuleRegistrationBuilder.h:340
ModuleRegistrationBuilder & dynamicProp(const std::string &name, const std::string &type, const std::string &desc, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:389
void registerModule(ModuleInfo info)
Definition ModuleRegistry.cpp:25
static ModuleRegistry & instance()
Definition ModuleRegistry.cpp:17
std::string joinStrings(const std::vector< std::string > &vec, const std::string &sep=", ")
Definition ModuleRegistrationBuilder.h:37
constexpr bool supports_dynamic_props_v
Definition ModuleRegistrationBuilder.h:87
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
void setCudaModuleFactory(const std::string &moduleName, CudaFactoryLambda &&cudaFactory)
Definition ModuleRegistrationBuilder.h:575
std::string extractClassName(const std::string &fullName)
Definition ModuleRegistrationBuilder.h:111
ModuleRegistrationBuilder< ModuleClass, PropsClass > registerModule()
Definition ModuleRegistrationBuilder.h:550
std::variant< int64_t, double, bool, std::string > ScalarPropertyValue
Definition ModuleRegistry.h:30
std::string demangleTypeName(const char *mangledName)
Definition ModuleRegistrationBuilder.h:97
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< 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 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
bool selfManagedOutputPins
Definition ModuleRegistry.h:116
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::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
Definition ModuleRegistrationBuilder.h:52
Definition ModuleRegistrationBuilder.h:60
Definition ModuleRegistrationBuilder.h:76
Definition ModuleRegistrationBuilder.h:68