31#ifndef DW_FRAMEWORK_NODEFACTORY_HPP_
32#define DW_FRAMEWORK_NODEFACTORY_HPP_
36#include <dwshared/dwfoundation/dw/core/logger/Logger.hpp>
42#include <dwshared/dwfoundation/dw/core/container/VectorFixed.hpp>
43#include <dwshared/dwfoundation/dw/core/container/StringView.hpp>
56class ParameterProvider;
61class AbstractMetaObject
64 AbstractMetaObject(
const dw::core::StringView className);
66 virtual ~AbstractMetaObject() =
default;
68 const dw::core::StringView& className()
const;
71 virtual const PortCollectionDescriptor&
getInputPorts()
const = 0;
74 virtual const PortCollectionDescriptor&
getOutputPorts()
const = 0;
77 virtual const ParameterCollectionDescriptor&
getParameters()
const = 0;
80 virtual const PassCollectionDescriptor&
getPasses()
const = 0;
83 virtual std::unique_ptr<Node>
create(ParameterProvider& provider)
const = 0;
92 dw::core::StringView m_className;
95using FactoryMap = std::map<dw::core::StringView, std::unique_ptr<AbstractMetaObject>>;
97FactoryMap& getFactoryMap();
99std::recursive_mutex& getFactoryMapMutex();
102template <
typename NodeT>
103class MetaObject :
public AbstractMetaObject
106 using AbstractMetaObject::AbstractMetaObject;
109 const PortCollectionDescriptor&
getInputPorts()
const override
112 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::INPUT>()};
120 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::OUTPUT>()};
125 const ParameterCollectionDescriptor&
getParameters()
const override
128 static const ParameterCollectionDescriptor descriptor{createParameterCollectionDescriptor<NodeT>()};
133 const PassCollectionDescriptor&
getPasses()
const override
136 static const PassCollectionDescriptor descriptor{createPassCollectionDescriptor<NodeT>()};
141 std::unique_ptr<Node>
create(ParameterProvider& provider)
const override
150 return dw::framework::detail::createPortSpecimen<NodeT, PortDirection::INPUT>(inputDescriptorIndex);
157 return dw::framework::detail::createPortSpecimen<NodeT, PortDirection::OUTPUT>(outputDescriptorIndex);
163template <
typename NodeT>
167 std::unique_ptr<detail::MetaObject<NodeT>> metaObject{std::make_unique<detail::MetaObject<NodeT>>(className)};
168 if (metaObject.get() ==
nullptr)
170 throw ExceptionWithStatus(DW_BAD_ALLOC,
"NodeFactory: cannot allocate meta object");
174 std::lock_guard<std::recursive_mutex> lock{detail::getFactoryMapMutex()};
175 detail::FactoryMap& factoryMap{detail::getFactoryMap()};
176 if (factoryMap.find(className) != factoryMap.end())
179 throw ExceptionWithStatus(DW_INVALID_ARGUMENT,
"registerNode() repeatedly called for the same class name: ", className);
183 factoryMap[className] = std::move(metaObject);
200 const dw::core::StringView& className,
201 const dw::core::StringView& identifier);
204 const dw::core::StringView& className,
205 const dw::core::StringView& identifier);
210#define DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffix) \
213 class Proxy##UniqueSuffix \
216 Proxy##UniqueSuffix() \
218 dw::framework::registerNode<NodeT>(#NodeT); \
221 static Proxy##UniqueSuffix g_registerNode##UniqueSuffix{}; \
224#define DW_REGISTER_NODE_EXPAND_(NodeT, UniqueSuffixMacro) DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffixMacro)
226#define DW_REGISTER_NODE(NodeT) DW_REGISTER_NODE_EXPAND_(NodeT, __LINE__)
A collection of parameter descriptors.
The interface to access parameter values identified by name and/or (semantic) type.
A collection of pass descriptors.
size_t getDescriptorIndex(const char *identifier) const
GenericDataReference createOutputPortSpecimen(const dw::core::StringView &className, const dw::core::StringView &identifier)
const PortCollectionDescriptor & getOutputPorts(const dw::core::StringView &className)
GenericDataReference createInputPortSpecimen(const dw::core::StringView &className, const dw::core::StringView &identifier)
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)