18#include "declarative/Metadata.h"
46 std::vector<std::string>
tags;
75 using FactoryFn = std::function<std::unique_ptr<Module>(
76 const std::map<std::string, ScalarPropertyValue>&
84 const std::map<std::string, ScalarPropertyValue>&,
96 const std::map<std::string, ScalarPropertyValue>&,
140 bool hasModule(
const std::string& name)
const;
144 std::vector<std::string>
getModulesByTag(
const std::string& tag)
const;
149 const std::string& name,
150 const std::map<std::string, ScalarPropertyValue>& props
156 const std::string& name,
157 const std::map<std::string, ScalarPropertyValue>& props,
171 const std::string& name,
172 const std::map<std::string, ScalarPropertyValue>& props,
184 std::string
toJson()
const;
185 std::string
toToml()
const;
335template<
typename T,
typename =
void>
340 std::void_t<decltype(T::applyProperties(
342 std::declval<const std::map<std::string, ScalarPropertyValue>&>(),
343 std::declval<std::vector<std::string>&>()
345> : std::true_type {};
358 const std::map<std::string, ScalarPropertyValue>& propMap,
359 std::vector<std::string>& missing
360) -> std::enable_if_t<has_apply_properties_v<T>,
void>
362 T::applyProperties(props, propMap, missing);
368 const std::map<std::string, ScalarPropertyValue>&,
369 std::vector<std::string>&
370) -> std::enable_if_t<!has_apply_properties_v<T>,
void>
396#define REGISTER_MODULE(ModuleClass, PropsClass) \
397 static_assert(std::is_default_constructible<PropsClass>::value, \
398 "REGISTER_MODULE requires " #PropsClass " to have a default constructor. " \
399 "Add a default constructor to " #PropsClass " that initializes all members " \
400 "with sensible defaults. Required properties can be marked with PropDef::Required*()."); \
401 namespace apra { namespace _reg_##ModuleClass { \
402 inline void registerIfNeeded() { \
403 auto& registry = ModuleRegistry::instance(); \
404 const std::string moduleName = std::string(ModuleClass::Metadata::name); \
405 if (registry.hasModule(moduleName)) { \
410 info.name = moduleName; \
411 info.category = ModuleClass::Metadata::category; \
412 info.version = std::string(ModuleClass::Metadata::version); \
413 info.description = std::string(ModuleClass::Metadata::description); \
416 for (const auto& tag : ModuleClass::Metadata::tags) { \
417 info.tags.push_back(std::string(tag)); \
421 for (const auto& pin : ModuleClass::Metadata::inputs) { \
422 info.inputs.push_back(detail::toPinInfo(pin)); \
426 for (const auto& pin : ModuleClass::Metadata::outputs) { \
427 info.outputs.push_back(detail::toPinInfo(pin)); \
431 for (const auto& prop : ModuleClass::Metadata::properties) { \
432 info.properties.push_back(detail::toPropInfo(prop)); \
436 info.factory = [](const std::map<std::string, ScalarPropertyValue>& props) \
437 -> std::unique_ptr<Module> { \
438 PropsClass moduleProps; \
440 std::vector<std::string> missingRequired; \
441 detail::tryApplyProperties(moduleProps, props, missingRequired); \
442 if (!missingRequired.empty()) { \
443 std::string msg = "Missing required properties: "; \
444 for (size_t i = 0; i < missingRequired.size(); ++i) { \
445 if (i > 0) msg += ", "; \
446 msg += missingRequired[i]; \
448 throw std::runtime_error(msg); \
450 return std::make_unique<ModuleClass>(moduleProps); \
453 registry.registerModule(std::move(info)); \
455 static const int _trigger = []() { \
456 registerIfNeeded(); \
457 ModuleRegistry::instance().addRegistrationCallback(registerIfNeeded); \
Definition ModuleRegistry.h:123
~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:133
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:204
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:202
void rerunRegistrations()
Definition ModuleRegistry.cpp:42
std::vector< RegistrationCallback > registrationCallbacks_
Definition ModuleRegistry.h:203
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:248
std::string mutabilityToString(PropDef::Mutability mut)
Definition ModuleRegistry.h:271
ModuleInfo::PinInfo toPinInfo(const PinDef &pin)
Definition ModuleRegistry.h:213
ModuleInfo::PropInfo toPropInfo(const PropDef &prop)
Definition ModuleRegistry.h:280
std::string imageTypeToString(ImageType type)
Definition ModuleRegistry.h:229
constexpr bool has_apply_properties_v
Definition ModuleRegistry.h:348
std::string categoryToString(ModuleCategory cat)
Definition ModuleRegistry.h:319
std::string memTypeToString(MemType type)
Definition ModuleRegistry.h:260
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
ModuleRegistrationBuilder< ModuleClass, PropsClass > registerModule()
Definition ModuleRegistrationBuilder.h:550
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
std::string regex_pattern
Definition ModuleRegistry.h:67
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
CuContextFactoryFn cuContextFactory
Definition ModuleRegistry.h:99
bool selfManagedOutputPins
Definition ModuleRegistry.h:116
bool requiresCuContext
Definition ModuleRegistry.h:102
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::function< std::unique_ptr< Module >( const std::map< std::string, ScalarPropertyValue > &, void *cuContextPtr)> CuContextFactoryFn
Definition ModuleRegistry.h:95
std::function< std::unique_ptr< Module >( const std::map< std::string, ScalarPropertyValue > &, void *cudaStreamPtr)> CudaFactoryFn
Definition ModuleRegistry.h:83
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
CudaFactoryFn cudaFactory
Definition ModuleRegistry.h:87
MemType memType
Definition Metadata.h:55
std::array< ImageType, MAX_IMAGE_TYPES > image_types
Definition Metadata.h:58
size_t frame_type_count
Definition Metadata.h:52
bool required
Definition Metadata.h:53
std::string_view description
Definition Metadata.h:54
size_t image_type_count
Definition Metadata.h:59
std::string_view name
Definition Metadata.h:50
std::array< std::string_view, MAX_FRAME_TYPES > frame_types
Definition Metadata.h:51
Definition Metadata.h:222
std::string_view regex_pattern
Definition Metadata.h:247
Mutability
Definition Metadata.h:224
Mutability mutability
Definition Metadata.h:231
int64_t int_default
Definition Metadata.h:237
size_t enum_value_count
Definition Metadata.h:251
int64_t int_max
Definition Metadata.h:239
Type type
Definition Metadata.h:230
double float_default
Definition Metadata.h:240
int64_t int_min
Definition Metadata.h:238
std::array< std::string_view, MAX_ENUM_VALUES > enum_values
Definition Metadata.h:250
Type
Definition Metadata.h:223
bool bool_default
Definition Metadata.h:243
double float_min
Definition Metadata.h:241
std::string_view unit
Definition Metadata.h:255
std::string_view description
Definition Metadata.h:254
std::string_view name
Definition Metadata.h:229
double float_max
Definition Metadata.h:242
bool required
Definition Metadata.h:234
std::string_view string_default
Definition Metadata.h:246
Definition ModuleRegistry.h:336