16#include "ModuleRegistry.h"
17#include "PropertyMacros.h"
37 inline std::string
joinStrings(
const std::vector<std::string>& vec,
const std::string& sep =
", ") {
39 for (
size_t i = 0; i < vec.size(); ++i) {
40 if (i > 0) result += sep;
51 template<
typename P,
typename =
void>
56 std::void_t<decltype(P::dynamicPropertyNames())>> : std::true_type {};
59 template<
typename P,
typename =
void>
64 std::void_t<decltype(std::declval<const P&>().getProperty(std::string{}))>> : std::true_type {};
67 template<
typename P,
typename =
void>
72 std::void_t<decltype(std::declval<P&>().setProperty(std::string{}, ScalarPropertyValue{}))>> : std::true_type {};
75 template<
typename M,
typename P,
typename =
void>
78 template<
typename M,
typename P>
81 decltype(std::declval<M&>().getProps()),
82 decltype(std::declval<M&>().setProps(std::declval<P&>()))
83 >> : std::true_type {};
86 template<
typename M,
typename P>
100 char* demangled = abi::__cxa_demangle(mangledName,
nullptr,
nullptr, &status);
101 if (status == 0 && demangled) {
102 std::string result(demangled);
107 return std::string(mangledName);
112 std::string name = fullName;
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);
122 auto pos = name.rfind(
"::");
123 if (pos != std::string::npos) {
124 name = name.substr(pos + 2);
133template<
typename ModuleClass,
typename PropsClass>
176 template<
typename... Tags>
178 (
info_.
tags.push_back(std::string(t)), ...);
195 template<
typename... FrameTypes>
200 (pin.
frame_types.push_back(std::string(rest)), ...);
208 const std::string& frameType) {
209 return input(pinName, frameType, memType);
242 template<
typename... FrameTypes>
247 (pin.
frame_types.push_back(std::string(rest)), ...);
255 const std::string& frameType) {
256 return output(pinName, frameType, memType);
269 template<
typename... ImageTypes>
272 (
info_.
inputs.back().image_types.push_back(types), ...);
278 template<
typename... ImageTypes>
281 (
info_.
outputs.back().image_types.push_back(types), ...);
287 template<
typename... ImageTypes>
289 MemType memType, ImageTypes... types) {
290 input(pinName, frameType, memType);
296 template<
typename... ImageTypes>
298 MemType memType, ImageTypes... types) {
299 output(pinName, frameType, memType);
310 bool required =
false,
const std::string& defaultVal =
"") {
313 prop.
type =
"string";
324 bool required =
false, int64_t defaultVal = 0,
325 int64_t minVal = INT64_MIN, int64_t maxVal = INT64_MAX) {
332 if (minVal != INT64_MIN) prop.
min_value = std::to_string(minVal);
333 if (maxVal != INT64_MAX) prop.
max_value = std::to_string(maxVal);
341 bool required =
false,
double defaultVal = 0.0,
342 double minVal = -std::numeric_limits<double>::max(),
343 double maxVal = std::numeric_limits<double>::max()) {
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);
359 bool required =
false,
bool defaultVal =
false) {
372 template<
typename... EnumValues>
374 bool required,
const std::string& defaultVal,
375 EnumValues... values) {
383 (prop.
enum_values.push_back(std::string(values)), ...);
390 const std::string& desc,
bool required =
false,
391 const std::string& defaultVal =
"") {
429 template<
typename FactoryLambda>
461 [](
const std::map<std::string, ScalarPropertyValue>& props)
462 -> std::unique_ptr<Module> {
464 PropsClass moduleProps;
468 std::vector<std::string> missingRequired;
471 if (!missingRequired.empty()) {
472 throw std::runtime_error(
473 "Missing required properties: " +
477 return std::make_unique<ModuleClass>(moduleProps);
490 template<
typename M = ModuleClass,
typename P = PropsClass>
491 typename std::enable_if<detail::supports_dynamic_props_v<M, P>,
void>::type
498 auto* typedModule =
static_cast<ModuleClass*
>(rawModule);
502 return PropsClass::dynamicPropertyNames();
507 PropsClass props = typedModule->getProps();
508 return props.getProperty(
name);
514 PropsClass props = typedModule->getProps();
515 bool success = props.setProperty(
name, value);
517 typedModule->setProps(props);
527 template<
typename M = ModuleClass,
typename P = PropsClass>
528 typename std::enable_if<!detail::supports_dynamic_props_v<M, P>,
void>::type
542 other.registered_ =
true;
549template<
typename ModuleClass,
typename PropsClass>
555template<
typename ModuleClass>
574template<
typename ModuleClass,
typename PropsClass,
typename CudaFactoryLambda>
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