Loading [MathJax]/extensions/TeX/AMSmath.js
Radium Engine  1.5.28
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NodeFactory.cpp
1#include <Dataflow/Core/NodeFactory.hpp>
2
3#include <Core/Utils/Log.hpp>
4#include <Dataflow/Core/DataflowGraph.hpp>
5#include <iostream>
6#include <memory>
7
8namespace Ra {
9namespace Dataflow {
10namespace Core {
11class Node;
12
13NodeFactory::NodeFactory( std::string name ) : m_name( std::move( name ) ) {}
14
15auto NodeFactory::name() const -> std::string {
16 return m_name;
17}
18
20 const nlohmann::json& data,
21 DataflowGraph* owningGraph ) -> std::shared_ptr<Node> {
22 if ( auto itr = m_nodesCreators.find( nodeType ); itr != m_nodesCreators.end() ) {
23 auto node = std::shared_ptr<Node> { itr->second.first( data ) };
24 if ( owningGraph != nullptr ) { owningGraph->add_node( node ); }
25 return node;
26 }
27 return nullptr;
28}
29
31 NodeCreatorFunctor nodeCreator,
32 const std::string& nodeCategory ) -> bool {
33
34 if ( auto itr = m_nodesCreators.find( nodeType ); itr == m_nodesCreators.end() ) {
35 m_nodesCreators[nodeType] = { std::move( nodeCreator ), nodeCategory };
36 return true;
37 }
38 LOG( Ra::Core::Utils::logWARNING )
39 << "NodeFactory (" << name()
40 << ") : trying to add an already existing node creator for type " << nodeType << ".";
41 return false;
42}
43
44auto NodeFactory::next_node_id() -> size_t {
45 return ++m_nodesCreated;
46}
47
49 const nlohmann::json& data,
50 DataflowGraph* owningGraph ) -> std::shared_ptr<Node> {
51 for ( const auto& itr : m_factories ) {
52 if ( auto node = itr.second->create_node( nodeType, data, owningGraph ); node ) {
53 return node;
54 }
55 }
56 LOG( Ra::Core::Utils::logERROR ) << "NodeFactorySet: unable to find constructor for "
57 << nodeType << " in any managed factory.";
58 return nullptr;
59}
60
61namespace NodeFactoriesManager {
62
68 static NodeFactorySet s_factoryManager {};
69 return s_factoryManager;
70}
71
72auto register_factory( NodeFactorySet::mapped_type factory ) -> bool {
73 return factory_manager().add_factory( std::move( factory ) );
74}
75
76auto create_factory( const NodeFactorySet::key_type& name ) -> NodeFactorySet::mapped_type {
77 auto f = factory( name );
78 if ( f == nullptr ) {
81 }
82 return f;
83}
84
85auto factory( const NodeFactorySet::key_type& name ) -> NodeFactorySet::mapped_type {
86 auto& factories = factory_manager();
87 if ( auto factory = factories.find( name ); factory != factories.end() ) {
88 return factory->second;
89 }
90 return nullptr;
91}
92
93auto unregister_factory( const NodeFactorySet::key_type& name ) -> bool {
94 return factory_manager().remove_factory( name );
95}
96
97auto default_factory() -> NodeFactorySet::mapped_type {
98 return factory( factory_manager().default_factory_name() );
99}
100
101} // namespace NodeFactoriesManager
102
103} // namespace Core
104} // namespace Dataflow
105} // namespace Ra
Represent a set of connected nodes that define a Direct Acyclic Computational Graph Ownership of node...
auto create_node(const std::string &nodeType, const nlohmann::json &data, DataflowGraph *owningGraph=nullptr) -> std::shared_ptr< Node >
Create a node using one of the functor (if it exists) registered in one factory for the given type na...
auto register_node_creator(NodeCreatorFunctor nodeCreator, const std::string &nodeCategory="RadiumNodes") -> bool
auto create_node(const std::string &nodeType, const nlohmann::json &data, DataflowGraph *owningGraph=nullptr) -> std::shared_ptr< Node >
T make_shared(T... args)
T move(T... args)
auto factory(const NodeFactorySet::key_type &name) -> NodeFactorySet::mapped_type
Gets the given factory from the manager.
auto unregister_factory(const NodeFactorySet::key_type &name) -> bool
Unregister the factory from the manager.
auto register_factory(NodeFactorySet::mapped_type factory) -> bool
Register a factory into the manager. The key will be fetched from the factory (its name)
auto default_factory() -> NodeFactorySet::mapped_type
Gets the "default" factory for nodes exported by the Core dataflow library.
auto create_factory(const NodeFactorySet::key_type &name) -> NodeFactorySet::mapped_type
Create and register a factory to the manager.
auto factory_manager() -> NodeFactorySet &
Allow static initialization without init order problems.
hepler function to manage enum as underlying types in VariableSet
Definition Cage.cpp:4
STL namespace.