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>
57class ParameterProvider;
62class AbstractMetaObject
65 AbstractMetaObject(dw::core::StringView&& className);
67 virtual ~AbstractMetaObject() =
default;
69 const dw::core::StringView& className()
const;
72 virtual const PortCollectionDescriptor&
getInputPorts()
const = 0;
75 virtual const PortCollectionDescriptor&
getOutputPorts()
const = 0;
78 virtual const ParameterCollectionDescriptor&
getParameters()
const = 0;
81 virtual const PassCollectionDescriptor&
getPasses()
const = 0;
84 virtual std::unique_ptr<Node> create(ParameterProvider& provider)
const = 0;
93 dw::core::StringView m_className;
96using FactoryMap = std::map<dw::core::StringView, std::unique_ptr<AbstractMetaObject>>;
98FactoryMap& getFactoryMap();
100using FactoryErrorMap = std::map<dw::core::StringView, std::vector<dw::core::StringView>>;
102FactoryErrorMap& getFactoryErrorMap();
104std::recursive_mutex& getFactoryMutex();
107template <
typename NodeT>
108class MetaObject :
public AbstractMetaObject
111 using AbstractMetaObject::AbstractMetaObject;
114 const PortCollectionDescriptor&
getInputPorts()
const override
117 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::INPUT>()};
125 static const PortCollectionDescriptor descriptor{createPortCollectionDescriptor<NodeT, PortDirection::OUTPUT>()};
130 const ParameterCollectionDescriptor&
getParameters()
const override
133 static const ParameterCollectionDescriptor descriptor{createParameterCollectionDescriptor<NodeT>()};
138 const PassCollectionDescriptor&
getPasses()
const override
141 static const PassCollectionDescriptor descriptor{createPassCollectionDescriptor<NodeT>()};
146 std::unique_ptr<Node> create(ParameterProvider& provider)
const override
148 return NodeT::create(provider);
155 return dw::framework::detail::createPortSpecimen<NodeT, PortDirection::INPUT>(inputDescriptorIndex);
162 return dw::framework::detail::createPortSpecimen<NodeT, PortDirection::OUTPUT>(outputDescriptorIndex);
168template <
typename NodeT>
172 std::unique_ptr<detail::MetaObject<NodeT>> metaObject{std::make_unique<detail::MetaObject<NodeT>>(className)};
175 std::lock_guard<std::recursive_mutex> lock{detail::getFactoryMutex()};
176 if (
nullptr == metaObject.get())
178 detail::FactoryErrorMap& factoryErrorMap{detail::getFactoryErrorMap()};
179 factoryErrorMap[className].push_back(dw::core::StringView(
"Failed to allocate meta object"));
183 detail::FactoryMap& factoryMap{detail::getFactoryMap()};
184 if (factoryMap.find(className) != factoryMap.end())
186 detail::FactoryErrorMap& factoryErrorMap{detail::getFactoryErrorMap()};
187 factoryErrorMap[className].push_back(dw::core::StringView(
"Repeated registration of the same class name"));
191 factoryMap[className] = std::move(metaObject);
207 const dw::core::StringView& className,
208 const dw::core::StringView& identifier);
211 const dw::core::StringView& className,
212 const dw::core::StringView& identifier);
219dw::core::HeapVectorFixed<dw::core::StringView> getNodeNamesWithErrors();
221dw::core::HeapVectorFixed<dw::core::StringView> getRegistrationErrors(
const dw::core::StringView& className);
227#define DW_CGF_NODE_FACTORY_JOIN(a, b) a##b
229#define DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffix) \
232 class DW_CGF_NODE_FACTORY_JOIN(Proxy, UniqueSuffix) \
235 DW_CGF_NODE_FACTORY_JOIN(Proxy, UniqueSuffix) \
238 dw::framework::registerNode<NodeT>(#NodeT); \
241 static DW_CGF_NODE_FACTORY_JOIN(Proxy, UniqueSuffix) DW_CGF_NODE_FACTORY_JOIN(g_registerNode, UniqueSuffix){}; \
244#define DW_REGISTER_NODE_EXPAND_(NodeT, UniqueSuffixMacro) DW_REGISTER_NODE_WITH_SUFFIX_(NodeT, UniqueSuffixMacro)
246#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)
void registerNode(const char *className) noexcept
const PortCollectionDescriptor & getInputPorts(const dw::core::StringView &className)
const ParameterCollectionDescriptor & getParameters(const dw::core::StringView &className)
bool hasRegistrationErrors(bool logErrors=true)