18#include "declarative/Metadata.h"
46 std::vector<std::string>
tags;
79 using FactoryFn = std::function<std::unique_ptr<Module>(
80 const std::map<std::string, ScalarPropertyValue>&
88 const std::map<std::string, ScalarPropertyValue>&,
100 const std::map<std::string, ScalarPropertyValue>&,
144 bool hasModule(
const std::string& name)
const;
148 std::vector<std::string>
getModulesByTag(
const std::string& tag)
const;
153 const std::string& name,
154 const std::map<std::string, ScalarPropertyValue>& props
160 const std::string& name,
161 const std::map<std::string, ScalarPropertyValue>& props,
175 const std::string& name,
176 const std::map<std::string, ScalarPropertyValue>& props,
188 std::string
toJson()
const;
189 std::string
toToml()
const;
339template<
typename T,
typename =
void>
344 std::void_t<decltype(T::applyProperties(
346 std::declval<const std::map<std::string, ScalarPropertyValue>&>(),
347 std::declval<std::vector<std::string>&>()
349> : std::true_type {};
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>
366 T::applyProperties(props, propMap, missing);
372 const std::map<std::string, ScalarPropertyValue>&,
373 std::vector<std::string>&
374) -> std::enable_if_t<!has_apply_properties_v<T>,
void>
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)) { \
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); \
420 for (const auto& tag : ModuleClass::Metadata::tags) { \
421 info.tags.push_back(std::string(tag)); \
425 for (const auto& pin : ModuleClass::Metadata::inputs) { \
426 info.inputs.push_back(detail::toPinInfo(pin)); \
430 for (const auto& pin : ModuleClass::Metadata::outputs) { \
431 info.outputs.push_back(detail::toPinInfo(pin)); \
435 for (const auto& prop : ModuleClass::Metadata::properties) { \
436 info.properties.push_back(detail::toPropInfo(prop)); \
440 info.factory = [](const std::map<std::string, ScalarPropertyValue>& props) \
441 -> std::unique_ptr<Module> { \
442 PropsClass moduleProps; \
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]; \
452 throw std::runtime_error(msg); \
454 return std::make_unique<ModuleClass>(moduleProps); \
457 registry.registerModule(std::move(info)); \
459 static const int _trigger = []() { \
460 registerIfNeeded(); \
461 ModuleRegistry::instance().addRegistrationCallback(registerIfNeeded); \
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
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
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