31#ifndef DW_FRAMEWORK_NODEFACTORY_HPP_
32#define DW_FRAMEWORK_NODEFACTORY_HPP_
36#include <dwshared/dwfoundation/dw/core/logger/Logger.hpp>
41#include <dwshared/dwfoundation/dw/core/container/VectorFixed.hpp>
42#include <dwshared/dwfoundation/dw/core/container/StringView.hpp>
55class ParameterProvider;
60class AbstractMetaObject
63 AbstractMetaObject(
const dw::core::StringView className);
65 virtual ~AbstractMetaObject() =
default;
67 const dw::core::StringView& className()
const;
70 virtual const PortCollectionDescriptor&
getInputPorts()
const = 0;
73 virtual const PortCollectionDescriptor&
getOutputPorts()
const = 0;
76 virtual const ParameterCollectionDescriptor&
getParameters()
const = 0;
79 virtual const PassCollectionDescriptor&
getPasses()
const = 0;
82 virtual std::unique_ptr<Node>
create(ParameterProvider& provider)
const = 0;
85 dw::core::StringView m_className;
88using FactoryMap = std::map<dw::core::StringView, std::unique_ptr<AbstractMetaObject>>;
90FactoryMap& getFactoryMap();
92std::recursive_mutex& getFactoryMapMutex();
95template <
typename NodeT>
96class MetaObject :
public AbstractMetaObject
99 using AbstractMetaObject::AbstractMetaObject;
102 const PortCollectionDescriptor&
getInputPorts()
const override
105 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::INPUT>()};
113 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::OUTPUT>()};
118 const ParameterCollectionDescriptor&
getParameters()
const override
121 static const ParameterCollectionDescriptor descriptor{createParameterCollectionDescriptor<NodeT>()};
126 const PassCollectionDescriptor&
getPasses()
const override
129 static const PassCollectionDescriptor descriptor{createPassCollectionDescriptor<NodeT>()};
134 std::unique_ptr<Node>
create(ParameterProvider& provider)
const override
142template <
typename NodeT>
146 std::unique_ptr<detail::MetaObject<NodeT>> metaObject{std::make_unique<detail::MetaObject<NodeT>>(className)};
147 if (metaObject.get() ==
nullptr)
149 throw ExceptionWithStatus(DW_BAD_ALLOC,
"NodeFactory: cannot allocate meta object");
153 std::lock_guard<std::recursive_mutex> lock{detail::getFactoryMapMutex()};
154 detail::FactoryMap& factoryMap{detail::getFactoryMap()};
155 if (factoryMap.find(className) != factoryMap.end())
158 throw ExceptionWithStatus(DW_INVALID_ARGUMENT,
"registerNode() repeatedly called for the same class name: ", className);
162 factoryMap[className] = std::move(metaObject);
181#define DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffix) \
184 class Proxy##UniqueSuffix \
187 Proxy##UniqueSuffix() \
189 dw::framework::registerNode<NodeT>(#NodeT); \
192 static Proxy##UniqueSuffix g_registerNode##UniqueSuffix{}; \
195#define DW_REGISTER_NODE_(NodeT) \
196 DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffix)
198#define DW_REGISTER_NODE_GET_3RD_ARG_(arg1, arg2, arg3, ...) arg3
199#define DW_REGISTER_NODE_MACRO_CHOOSER_(...) \
200 DW_REGISTER_NODE_GET_3RD_ARG_(__VA_ARGS__, DW_REGISTER_NODE_WITH_SUFFIX_, DW_REGISTER_NODE_, )
202#define DW_REGISTER_NODE(...) \
203 DW_REGISTER_NODE_MACRO_CHOOSER_(__VA_ARGS__) \
A collection of parameter descriptors.
The interface to access parameter values identified by name and/or (semantic) type.
A collection of pass descriptors.
const PortCollectionDescriptor & getOutputPorts(const dw::core::StringView &className)
dw::core::HeapVectorFixed< dw::core::StringView > getNodeNames()
const PassCollectionDescriptor & getPasses(const dw::core::StringView &className)
std::unique_ptr< Node > createNode(const dw::core::StringView &className, ParameterProvider &provider)
const PortCollectionDescriptor & getInputPorts(const dw::core::StringView &className)
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
void registerNode(const char *className)
const ParameterCollectionDescriptor & getParameters(const dw::core::StringView &className)