31 #ifndef DW_FRAMEWORK_NODEFACTORY_HPP_ 32 #define DW_FRAMEWORK_NODEFACTORY_HPP_ 41 #include <dw/core/container/VectorFixed.hpp> 42 #include <dw/core/container/StringView.hpp> 55 class ParameterProvider;
60 class AbstractMetaObject
63 AbstractMetaObject(
const dw::core::StringView className);
65 virtual ~AbstractMetaObject() =
default;
67 const dw::core::StringView& className()
const;
69 virtual const PortCollectionDescriptor&
getInputPorts()
const = 0;
71 virtual const PortCollectionDescriptor&
getOutputPorts()
const = 0;
73 virtual const ParameterCollectionDescriptor&
getParameters()
const = 0;
75 virtual const PassCollectionDescriptor&
getPasses()
const = 0;
77 virtual std::unique_ptr<Node>
create(ParameterProvider& provider)
const = 0;
80 dw::core::StringView m_className;
83 typedef std::map<dw::core::StringView, std::unique_ptr<AbstractMetaObject>> FactoryMap;
85 FactoryMap& getFactoryMap();
87 std::recursive_mutex& getFactoryMapMutex();
89 template <
typename NodeT>
90 class MetaObject :
public AbstractMetaObject
93 MetaObject(
const dw::core::StringView className)
94 : AbstractMetaObject(std::move(className))
98 const PortCollectionDescriptor&
getInputPorts()
const override 100 static const PortCollectionDescriptor descriptor = createPortCollectionDescriptor<NodeT, PortDirection::INPUT>();
106 static const PortCollectionDescriptor descriptor = createPortCollectionDescriptor<NodeT, PortDirection::OUTPUT>();
110 const ParameterCollectionDescriptor&
getParameters()
const override 112 static const ParameterCollectionDescriptor descriptor = createParameterCollectionDescriptor<NodeT>();
116 const PassCollectionDescriptor&
getPasses()
const override 118 static const PassCollectionDescriptor descriptor = createPassCollectionDescriptor<NodeT>();
122 std::unique_ptr<Node>
create(ParameterProvider& provider)
const override 130 template <
typename NodeT>
133 auto metaObject = std::make_unique<detail::MetaObject<NodeT>>(className);
136 throw Exception(DW_BAD_ALLOC,
"NodeFactory: cannot allocate meta object");
139 std::lock_guard<std::recursive_mutex> lock(detail::getFactoryMapMutex());
140 auto& factoryMap = detail::getFactoryMap();
141 if (factoryMap.find(className) != factoryMap.end())
143 throw Exception(DW_INVALID_ARGUMENT,
"registerNode() repeatedly called for the same class name: ", className);
147 factoryMap[className] = std::move(metaObject);
151 dw::core::HeapVectorFixed<dw::core::StringView>
getNodeNames();
166 #define _DW_REGISTER_NODE_WITH_SUFFIX(NodeT, UniqueSuffix) \ 169 struct Proxy##UniqueSuffix \ 171 Proxy##UniqueSuffix() \ 173 dw::framework::registerNode<NodeT>(#NodeT); \ 176 static Proxy##UniqueSuffix g_registerNode##UniqueSuffix; \ 179 #define _DW_REGISTER_NODE(NodeT) \ 180 _DW_REGISTER_NODE_WITH_SUFFIX(NodeT, UniqueSuffix) 182 #define _DW_REGISTER_NODE_GET_3RD_ARG(arg1, arg2, arg3, ...) arg3 183 #define _DW_REGISTER_NODE_MACRO_CHOOSER(...) \ 184 _DW_REGISTER_NODE_GET_3RD_ARG(__VA_ARGS__, _DW_REGISTER_NODE_WITH_SUFFIX, _DW_REGISTER_NODE, ) 186 #define DW_REGISTER_NODE(...) \ 187 _DW_REGISTER_NODE_MACRO_CHOOSER(__VA_ARGS__) \ 190 #endif //DW_FRAMEWORK_NODEFACTORY_HPP_ const PortCollectionDescriptor & getInputPorts(const dw::core::StringView &className)
std::unique_ptr< Node > createNode(const dw::core::StringView &className, ParameterProvider &provider)
const PortCollectionDescriptor & getOutputPorts(const dw::core::StringView &className)
dw::core::HeapVectorFixed< dw::core::StringView > getNodeNames()
const ParameterCollectionDescriptor & getParameters(const dw::core::StringView &className)
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
Instantiate a node using parameters from the passed provider.
void registerNode(const char *className)
const PassCollectionDescriptor & getPasses(const dw::core::StringView &className)
A collection of pass descriptors.
The interface to access parameter values identified by name and/or (semantic) type.
A collection of parameter descriptors.