31#ifndef DW_FRAMEWORK_NODEFACTORY_HPP_
32#define DW_FRAMEWORK_NODEFACTORY_HPP_
36#include <dw/core/logger/Logger.hpp>
41#include <dw/core/container/VectorFixed.hpp>
42#include <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;
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;
83typedef std::map<dw::core::StringView, std::unique_ptr<AbstractMetaObject>> FactoryMap;
85FactoryMap& getFactoryMap();
87std::recursive_mutex& getFactoryMapMutex();
89template <
typename NodeT>
90class 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
130template <
typename NodeT>
133 auto metaObject = std::make_unique<detail::MetaObject<NodeT>>(className);
136 throw ExceptionWithStatus(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 ExceptionWithStatus(DW_INVALID_ARGUMENT,
"registerNode() repeatedly called for the same class name: ", className);
147 factoryMap[className] = std::move(metaObject);
166#define _DW_REGISTER_NODE_WITH_SUFFIX(NodeT, UniqueSuffix) \
169 class Proxy##UniqueSuffix \
172 Proxy##UniqueSuffix() \
174 dw::framework::registerNode<NodeT>(#NodeT); \
177 static Proxy##UniqueSuffix g_registerNode##UniqueSuffix{}; \
180#define _DW_REGISTER_NODE(NodeT) \
181 _DW_REGISTER_NODE_WITH_SUFFIX(NodeT, UniqueSuffix)
183#define _DW_REGISTER_NODE_GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
184#define _DW_REGISTER_NODE_MACRO_CHOOSER(...) \
185 _DW_REGISTER_NODE_GET_3RD_ARG(__VA_ARGS__, _DW_REGISTER_NODE_WITH_SUFFIX, _DW_REGISTER_NODE, )
187#define DW_REGISTER_NODE(...) \
188 _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)