Loading [MathJax]/jax/output/HTML-CSS/config.js
Radium Engine  1.5.29
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TransformNode.hpp
1#pragma once
2#include <Core/Utils/TypesUtils.hpp>
3#include <Dataflow/Core/Node.hpp>
4
5#include <functional>
6
7namespace Ra {
8namespace Dataflow {
9namespace Core {
10namespace Functionals {
11
26template <typename coll_t, typename v_t = typename coll_t::value_type>
27class TransformNode : public Node
28{
29 public:
33 using TransformOperator = std::function<v_t( const v_t& )>;
34
39 explicit TransformNode( const std::string& instanceName );
40
46 TransformNode( const std::string& instanceName, TransformOperator op );
47
48 void init() override;
49 bool execute() override;
50
53
54 protected:
55 TransformNode( const std::string& instanceName,
56 const std::string& typeName,
58
59 void toJsonInternal( nlohmann::json& data ) const override { Node::toJsonInternal( data ); }
60 bool fromJsonInternal( const nlohmann::json& data ) override {
61 return Node::fromJsonInternal( data );
62 }
63
64 private:
65 RA_NODE_PORT_IN( coll_t, data );
66 RA_NODE_PORT_IN( TransformOperator, op );
67 RA_NODE_PORT_OUT_WITH_DATA( coll_t, result );
68
69 public:
70 static const std::string& node_typename();
71};
72
73// -----------------------------------------------------------------
74// ---------------------- inline methods ---------------------------
75
76template <typename coll_t, typename v_t>
78 TransformNode( instanceName, node_typename(), []( v_t ) { return v_t {}; } ) {}
79
80template <typename coll_t, typename v_t>
82 TransformNode( instanceName, node_typename(), op ) {}
83
84template <typename coll_t, typename v_t>
86 m_port_in_op->set_default_value( op );
87}
88
89template <typename coll_t, typename v_t>
91 Node::init();
92 m_result.clear();
93}
94
95template <typename coll_t, typename v_t>
97 const auto& f = m_port_in_op->data();
98 const auto& inData = m_port_in_data->data();
99 m_result.clear();
100 // m_elements.reserve( inData.size() ); // --> this is not a requirement of
101 // SequenceContainer
102 std::transform( inData.begin(), inData.end(), std::back_inserter( m_result ), f );
103
104 return true;
105}
106
107template <typename coll_t, typename v_t>
109 static std::string demangledName =
110 std::string { "Transform<" } + Ra::Core::Utils::simplifiedDemangledType<coll_t>() + ">";
111 return demangledName;
112}
113
114template <typename coll_t, typename v_t>
116 const std::string& typeName,
117 TransformOperator op ) :
118 Node( instanceName, typeName ) {
119 m_port_in_op->set_default_value( op );
120}
121
122} // namespace Functionals
123} // namespace Core
124} // namespace Dataflow
125} // namespace Ra
T back_inserter(T... args)
Transform an iterable collection.
std::function< v_t(const v_t &)> TransformOperator
bool fromJsonInternal(const nlohmann::json &data) override
Internal json representation of the Node.
void toJsonInternal(nlohmann::json &data) const override
Internal json representation of the Node.
TransformNode(const std::string &instanceName)
Construct an identity transformer.
void init() override
Initializes the node content.
void set_operator(TransformOperator op)
Sets the operator on the node.
bool execute() override
Executes the node.
Base abstract class for all the nodes added and used by the node system.
Definition Node.hpp:40
virtual void init()
Initializes the node content.
Definition Node.hpp:428
virtual bool fromJsonInternal(const nlohmann::json &data)
Internal json representation of the Node.
Definition Node.cpp:91
virtual void toJsonInternal(nlohmann::json &data) const
Internal json representation of the Node.
Definition Node.cpp:109
hepler function to manage enum as underlying types in VariableSet
Definition Cage.cpp:4
T transform(T... args)