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 // ============================================================
404 // Path property definition methods
405 // ============================================================
406
407 // Add a file path property (single file, e.g., /path/to/video.mp4)
408 ModuleRegistrationBuilder& filePathProp(const std::string& name, const std::string& desc,
409 PathRequirement requirement, bool required = false,
410 const std::string& defaultVal = "") {
412 prop.name = name;
413 prop.type = "string";
414 prop.mutability = "static";
415 prop.required = required;
416 prop.default_value = defaultVal;
417 prop.description = desc;
419 prop.path_requirement = requirement;
420 info_.properties.push_back(std::move(prop));
421 return *this;
422 }
423
424 // Add a directory path property
425 ModuleRegistrationBuilder& directoryPathProp(const std::string& name, const std::string& desc,
426 PathRequirement requirement, bool required = false,
427 const std::string& defaultVal = "") {
429 prop.name = name;
430 prop.type = "string";
431 prop.mutability = "static";
432 prop.required = required;
433 prop.default_value = defaultVal;
434 prop.description = desc;
436 prop.path_requirement = requirement;
437 info_.properties.push_back(std::move(prop));
438 return *this;
439 }
440
441 // Add a file pattern property (with wildcards, e.g., frame_????.jpg)
442 ModuleRegistrationBuilder& filePatternProp(const std::string& name, const std::string& desc,
443 PathRequirement requirement, bool required = false,
444 const std::string& defaultVal = "") {
446 prop.name = name;
447 prop.type = "string";
448 prop.mutability = "static";
449 prop.required = required;
450 prop.default_value = defaultVal;
451 prop.description = desc;
453 prop.path_requirement = requirement;
454 info_.properties.push_back(std::move(prop));
455 return *this;
456 }
457
458 // Add a network URL property (e.g., rtsp://host/stream) - no filesystem validation
459 ModuleRegistrationBuilder& networkURLProp(const std::string& name, const std::string& desc,
460 bool required = false,
461 const std::string& defaultVal = "") {
463 prop.name = name;
464 prop.type = "string";
465 prop.mutability = "static";
466 prop.required = required;
467 prop.default_value = defaultVal;
468 prop.description = desc;
471 info_.properties.push_back(std::move(prop));
472 return *this;
473 }
474
475 // Mark module as managing its own output pins (creates them in addInputPin)
476 // This prevents ModuleFactory from pre-creating output pins
481
482 // Mark module as requiring a CUDA stream (cudastream_sp)
483 // Modules with this flag will have their cudaFactory called instead of factory
484 // The cudaFactory receives a void* pointing to the cudastream_sp
489
490 // Destructor registers the module
492 if (!registered_) {
493 finalize();
494 }
495 }
496
497 // Finalize with a custom factory function
498 // Use this for Props classes that don't have default constructors
499 // (e.g., Jetson modules like NvTransform, EglRenderer)
500 // The lambda is defined at the call site, avoiding GCC 9 template lambda issues
501 template<typename FactoryLambda>
502 void finalizeWith(FactoryLambda&& factoryFn) {
503 if (registered_) return;
504 registered_ = true;
505
506 if (info_.version.empty()) {
507 info_.version = "1.0";
508 }
509
510 // Forward the factory lambda directly
511 info_.factory = ModuleInfo::FactoryFn(std::forward<FactoryLambda>(factoryFn));
512
513 // No property accessor factory for custom-constructed modules
514 // (they typically don't support dynamic properties)
515
517 }
518
519 // Explicit registration (called by destructor if not called manually)
520 void finalize() {
521 if (registered_) return;
522 registered_ = true;
523
524 // Set default version if not specified
525 if (info_.version.empty()) {
526 info_.version = "1.0";
527 }
528
529 // Create factory function that applies properties and creates module
530 // Note: Explicit ModuleInfo::FactoryFn cast required for GCC 9 compatibility
531 // (GCC 9 has issues with lambda-to-std::function conversion in templates)
533 [](const std::map<std::string, ScalarPropertyValue>& props)
534 -> std::unique_ptr<Module> {
535
536 PropsClass moduleProps;
537
538 // Apply properties using SFINAE helper (MSVC-compatible)
539 // Uses function overloading instead of if constexpr
540 std::vector<std::string> missingRequired;
541 detail::tryApplyProperties(moduleProps, props, missingRequired);
542
543 if (!missingRequired.empty()) {
544 throw std::runtime_error(
545 "Missing required properties: " +
546 detail::joinStrings(missingRequired));
547 }
548
549 return std::make_unique<ModuleClass>(moduleProps);
550 });
551
552 // Create property accessor factory for modules that support dynamic props
554
555 // Register with the singleton registry
557 }
558
559private:
560 // Helper to create property accessor factory (SFINAE-enabled)
561 // Note: Explicit ModuleInfo::PropertyAccessorFactoryFn cast required for GCC 9 compatibility
562 template<typename M = ModuleClass, typename P = PropsClass>
563 typename std::enable_if<detail::supports_dynamic_props_v<M, P>, void>::type
566 [](Module* rawModule) -> ModuleInfo::PropertyAccessors {
568
569 // Cast to concrete module type
570 auto* typedModule = static_cast<ModuleClass*>(rawModule);
571
572 // Get list of dynamic property names (static on props class)
573 accessors.getDynamicPropertyNames = []() -> std::vector<std::string> {
574 return PropsClass::dynamicPropertyNames();
575 };
576
577 // Get property value from current props
578 accessors.getProperty = [typedModule](const std::string& name) -> ScalarPropertyValue {
579 PropsClass props = typedModule->getProps();
580 return props.getProperty(name);
581 };
582
583 // Set property value: get current props, modify, apply back
584 accessors.setProperty = [typedModule](const std::string& name,
585 const ScalarPropertyValue& value) -> bool {
586 PropsClass props = typedModule->getProps();
587 bool success = props.setProperty(name, value);
588 if (success) {
589 typedModule->setProps(props);
590 }
591 return success;
592 };
593
594 return accessors;
595 });
596 }
597
598 // Fallback for modules without dynamic property support
599 template<typename M = ModuleClass, typename P = PropsClass>
600 typename std::enable_if<!detail::supports_dynamic_props_v<M, P>, void>::type
602 // No-op: leave propertyAccessorFactory as nullptr
603 }
604
605public:
606
607 // Prevent copying
610
611 // Allow moving
613 : info_(std::move(other.info_)), registered_(other.registered_) {
614 other.registered_ = true; // Prevent double registration
615 }
616};
617
618// ============================================================
619// Factory function for fluent registration
620// ============================================================
621template<typename ModuleClass, typename PropsClass>
625
626// Overload for modules without Props class (rare)
627template<typename ModuleClass>
631
632// ============================================================
633// CUDA Module Registration Helper
634// Use this to set the cudaFactory for modules that require cudastream_sp
635// Must be called after the module is registered via registerModule()
636//
637// Usage (in ModuleRegistrations.cpp, inside #ifdef ENABLE_CUDA):
638// #include "CudaCommon.h"
639// setCudaModuleFactory<GaussianBlur, GaussianBlurProps>(
640// [](const auto& props, cudastream_sp stream) {
641// GaussianBlurProps moduleProps(stream);
642// // apply props...
643// return std::make_unique<GaussianBlur>(moduleProps);
644// });
645// ============================================================
646template<typename ModuleClass, typename PropsClass, typename CudaFactoryLambda>
647void setCudaModuleFactory(const std::string& moduleName, CudaFactoryLambda&& cudaFactory) {
648 auto& registry = ModuleRegistry::instance();
649 // Note: We can't directly modify the registry entry, so we need
650 // a different approach. See ModuleRegistrations.cpp for the pattern.
651 // This function is kept for documentation purposes.
652 (void)cudaFactory; // Suppress unused warning
653}
654
655} // 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:601
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:485
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:564
ModuleRegistrationBuilder & outputImageTypes(ImageTypes... types)
Definition ModuleRegistrationBuilder.h:279
void finalizeWith(FactoryLambda &&factoryFn)
Definition ModuleRegistrationBuilder.h:502
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 & networkURLProp(const std::string &name, const std::string &desc, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:459
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:491
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:520
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 & filePathProp(const std::string &name, const std::string &desc, PathRequirement requirement, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:408
ModuleRegistrationBuilder & tags(Tags... t)
Definition ModuleRegistrationBuilder.h:177
ModuleRegistrationBuilder(ModuleRegistrationBuilder &&other) noexcept
Definition ModuleRegistrationBuilder.h:612
ModuleRegistrationBuilder & directoryPathProp(const std::string &name, const std::string &desc, PathRequirement requirement, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:425
ModuleRegistrationBuilder & outputWithMemType(const std::string &pinName, MemType memType, const std::string &frameType)
Definition ModuleRegistrationBuilder.h:254
ModuleRegistrationBuilder & selfManagedOutputPins()
Definition ModuleRegistrationBuilder.h:477
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
ModuleRegistrationBuilder & filePatternProp(const std::string &name, const std::string &desc, PathRequirement requirement, bool required=false, const std::string &defaultVal="")
Definition ModuleRegistrationBuilder.h:442
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:360
Definition FrameTypeRegistrations.h:10
ModuleCategory
Definition Metadata.h:27
PathRequirement
Definition Metadata.h:52
void setCudaModuleFactory(const std::string &moduleName, CudaFactoryLambda &&cudaFactory)
Definition ModuleRegistrationBuilder.h:647
std::string extractClassName(const std::string &fullName)
Definition ModuleRegistrationBuilder.h:111
ModuleRegistrationBuilder< ModuleClass, PropsClass > registerModule()
Definition ModuleRegistrationBuilder.h:622
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
PathType path_type
Definition ModuleRegistry.h:73
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
bool selfManagedOutputPins
Definition ModuleRegistry.h:120
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::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
Definition ModuleRegistrationBuilder.h:52
Definition ModuleRegistrationBuilder.h:60
Definition ModuleRegistrationBuilder.h:76
Definition ModuleRegistrationBuilder.h:68