GNode library (C++)
Loading...
Searching...
No Matches
node.hpp
Go to the documentation of this file.
1/* Copyright (c) 2023 Otto Link. Distributed under the terms of the GNU General
2 * Public License. The full license is in the file LICENSE, distributed with
3 * this software. */
4
15#pragma once
16#include <memory>
17#include <stdexcept>
18#include <vector>
19
20#include "gnode/data.hpp"
21#include "gnode/port.hpp"
22
23namespace gnode
24{
25
26class Graph; // forward
27
33class Node
34{
35public:
40 bool is_dirty = false;
41
45 Node() = default;
46
52 Node(std::string label) : label(label) {}
53
65 Node(std::string label, std::string id) : label(label), id(id) {}
66
70 virtual ~Node() = default;
71
88 template <typename T, typename... Args>
89 void add_port(PortType port_type,
90 const std::string &port_label,
91 Args &&...args)
92 {
93 if (port_type == PortType::IN)
94 this->ports.push_back(std::make_shared<gnode::Input<T>>(port_label));
95 else
96 this->ports.push_back(
97 std::make_shared<gnode::Output<T>>(port_label,
98 std::forward<Args>(args)...));
99 }
100
105 virtual void compute() = 0;
106
113 std::shared_ptr<BaseData> get_base_data(int port_index);
114
121 std::shared_ptr<BaseData> get_base_data(const std::string &port_label);
122
132 std::string get_data_type(int port_index) const;
133
139 std::string get_graph_id() const;
140
146 std::string get_label() const { return this->label; }
147
153 std::string get_id() const { return this->id; }
154
160 int get_nports() const;
161
168 int get_nports(PortType port_type) const;
169
176 std::shared_ptr<BaseData> get_output_data(int port_index) const;
177
183 Graph *get_p_graph() const { return this->p_graph; }
184
191 int get_port_index(const std::string &port_label) const;
192
199 std::string get_port_label(int port_index) const;
200
207 PortType get_port_type(const std::string &port_label) const;
208
212 const std::vector<std::shared_ptr<Port>> &get_ports() const
213 {
214 return this->ports;
215 };
216
224 template <typename T> T *get_value_ref(const std::string &port_label) const
225 {
226 for (const auto &port : this->ports)
227 {
228 if (port->get_label() == port_label)
229 {
230 if (port->get_port_type() == PortType::IN)
231 {
232 auto inputPort = std::dynamic_pointer_cast<Input<T>>(port);
233 if (!inputPort)
234 throw std::runtime_error("Type mismatch for port: " + port_label);
235 return inputPort->get_value_ref();
236 }
237 else
238 {
239 auto outputPort = std::dynamic_pointer_cast<Output<T>>(port);
240 if (!outputPort)
241 throw std::runtime_error("Type mismatch for port: " + port_label);
242 return outputPort->get_value_ref();
243 }
244 }
245 }
246 throw std::runtime_error("Port not found: " + port_label);
247 }
248
256 template <typename T> T *get_value_ref(int port_index) const
257 {
258 if (port_index < 0 || port_index >= static_cast<int>(this->ports.size()))
259 throw std::out_of_range("Port index is out of range: " +
260 std::to_string(port_index));
261
262 if (this->ports[port_index]->get_port_type() == PortType::IN)
263 {
264 auto port = std::dynamic_pointer_cast<Input<T>>(this->ports[port_index]);
265 if (!port)
266 throw std::runtime_error("Type mismatch for port index: " +
267 std::to_string(port_index));
268 return port->get_value_ref();
269 }
270 else
271 {
272 auto port = std::dynamic_pointer_cast<Output<T>>(this->ports[port_index]);
273 if (!port)
274 throw std::runtime_error("Type mismatch for port index: " +
275 std::to_string(port_index));
276 return port->get_value_ref();
277 }
278 }
279
286 void *get_value_ref_void(int port_index) const
287 {
288 if (port_index < 0 || port_index >= static_cast<int>(this->ports.size()))
289 return nullptr;
290
291 return this->ports[port_index]->get_value_ref_void();
292 }
293
299 bool has_port(const std::string &port_label) const;
300
308 template <typename T> bool has_port(const std::string &port_label) const
309 {
310 int index = this->get_port_index(port_label);
311 if (index == -1) return false;
312 return this->ports[index]->get_data_type() == typeid(T).name();
313 }
314
320 bool is_port_connected(int port_index) const;
321
327 bool is_port_connected(const std::string &port_label) const;
328
338 void set_id(std::string new_id) { this->id = new_id; }
339
346 void set_input_data(std::shared_ptr<BaseData> data, int port_index);
347
353 void set_p_graph(Graph *new_p_graph) { this->p_graph = new_p_graph; }
354
362 template <typename T>
363 void set_value(const std::string &port_label, T new_value)
364 {
365 T *p_value = this->get_value_ref<T>(port_label);
366 if (!p_value)
367 throw std::runtime_error("set_value: cannot set value: " + port_label);
369 }
370
375 void update();
376
377private:
381 std::string label;
382
386 std::string id;
387
391 std::vector<std::shared_ptr<Port>> ports;
392
396 Graph *p_graph = nullptr;
397};
398
399} // namespace gnode
The Graph class provides methods for manipulating nodes and connections in a directed graph structure...
Definition graph.hpp:36
Template class for input ports, specialized by data type.
Definition port.hpp:125
Abstract Node class that represents a basic building block in a graph-based system.
Definition node.hpp:34
Node(std::string label)
Construct a new Node object with a specific label.
Definition node.hpp:52
Graph * get_p_graph() const
Get the reference to the belonging graph.
Definition node.hpp:183
std::vector< std::shared_ptr< Port > > ports
A vector of shared pointers to the node's ports.
Definition node.hpp:391
std::string get_graph_id() const
Get the id of the graph.
T * get_value_ref(int port_index) const
Get a reference to the value stored in a port by its index.
Definition node.hpp:256
std::string get_port_label(int port_index) const
Get the label of a port by its index.
Node()=default
Default constructor for Node.
std::string id
The ID of the node.
Definition node.hpp:386
int get_nports() const
Get the total number of ports on the node.
Graph * p_graph
Reference to the graph the node belong to, if any.
Definition node.hpp:396
void set_value(const std::string &port_label, T new_value)
Set the value of a port by its label.
Definition node.hpp:363
std::string get_data_type(int port_index) const
Get the data type of a specific port (input or output).
void update()
Update the node, which involves processing its input and output ports.
std::shared_ptr< BaseData > get_base_data(const std::string &port_label)
Retrieves a shared pointer to the data associated with the port after downcasting.
std::shared_ptr< BaseData > get_output_data(int port_index) const
Get the output data from a specific port index.
int get_port_index(const std::string &port_label) const
Get the index of a port by its label.
bool has_port(const std::string &port_label) const
Checks whether a port with the given label exists.
T * get_value_ref(const std::string &port_label) const
Get a reference to the value stored in a port by its label.
Definition node.hpp:224
std::shared_ptr< BaseData > get_base_data(int port_index)
Retrieves a shared pointer to the data associated with the port after downcasting.
std::string get_id() const
Get the ID of the node.
Definition node.hpp:153
PortType get_port_type(const std::string &port_label) const
Get the type of a port (input or output) by its label.
void set_p_graph(Graph *new_p_graph)
Set the reference to the belonging graph.
Definition node.hpp:353
std::string get_label() const
Get the label of the node.
Definition node.hpp:146
std::string label
The label of the node.
Definition node.hpp:381
void set_id(std::string new_id)
Set a new identifier for the node.
Definition node.hpp:338
bool is_dirty
Flag indicating whether the node is marked as dirty (requiring an update).
Definition node.hpp:40
virtual void compute()=0
Pure virtual function that forces derived classes to implement the compute method,...
virtual ~Node()=default
Virtual destructor for Node.
void set_input_data(std::shared_ptr< BaseData > data, int port_index)
Set input data on a specific port by its index.
bool has_port(const std::string &port_label) const
Checks whether a port exists and matches the requested type.
Definition node.hpp:308
Node(std::string label, std::string id)
Construct a new Node object with a specific label and identifier.
Definition node.hpp:65
void * get_value_ref_void(int port_index) const
Get a void* reference to the value stored in a port by its index.
Definition node.hpp:286
const std::vector< std::shared_ptr< Port > > & get_ports() const
Get the ports.
Definition node.hpp:212
bool is_port_connected(int port_index) const
Check if a port is connected by its index.
bool is_port_connected(const std::string &port_label) const
Check if a port is connected by its label.
void add_port(PortType port_type, const std::string &port_label, Args &&...args)
Add a port to the node, specifying whether it is an input or output.
Definition node.hpp:89
int get_nports(PortType port_type) const
Get the number of ports of a specific type (input or output).
Template class for output ports, specialized by data type.
Definition port.hpp:211
Defines the BaseData and Data classes for handling typed data in the gnode namespace.
Definition data.hpp:23
PortType
Enumeration for port types, indicating whether a port is an input or an output.
Definition port.hpp:33
@ IN
Represents an input port.
Definition port.hpp:34
Defines the Port, Input, and Output classes, along with the PortType enumeration for handling ports i...