smgl 0.11.0
Structured Metadata Engine and Graph Objects Library
Loading...
Searching...
No Matches
Ports.hpp
Go to the documentation of this file.
1#pragma once
2
5#include <exception>
6#include <functional>
7#include <tuple>
8#include <unordered_map>
9#include <vector>
10
11#include "smgl/Metadata.hpp"
12#include "smgl/Uuid.hpp"
13
14namespace smgl
15{
16
19public:
21 explicit bad_connection(const char* msg) : msg_(msg) {}
23 explicit bad_connection(std::string msg) : msg_(std::move(msg)) {}
25 const char* what() const noexcept override { return msg_.c_str(); }
26
27protected:
30};
31
33template <typename T>
34struct Update {
36 T val;
39};
40
42class Input;
43class Output;
44template <typename T>
45class InputPort;
46template <typename T, typename... Args>
47class OutputPort;
48class Node;
56void connect(Output& op, Input& ip);
57
63void disconnect(Output& op, Input& ip);
64
66void operator>>(Output& op, Input& ip);
68void operator<<(Input& ip, Output& op);
69
71struct Connection {
73 Connection() = default;
75 Connection(Node* s, Output* sp, Node* d, Input* dp)
76 : srcNode{s}, srcPort{sp}, destNode{d}, destPort{dp}
77 {
78 }
80 Node* srcNode{nullptr};
82 Output* srcPort{nullptr};
84 Node* destNode{nullptr};
86 Input* destPort{nullptr};
87};
88
91{
92public:
94 enum class State { Idle, Waiting, Queued, Error };
95
97 virtual bool update() = 0;
98
100 virtual void notify(State s) = 0;
101
103 State state() const;
104
107
109 void setParent(Node* p);
110
112 virtual Metadata serialize() = 0;
113
115 virtual void deserialize(const Metadata& m) = 0;
116
117protected:
119 Port() = default;
121 explicit Port(State s);
123 virtual ~Port() = default;
125 State state_{State::Idle};
127 Node* parent_{nullptr};
128};
129
131class Input : public Port
132{
133public:
136
143
145 virtual Input& operator=(Output& op);
146
147protected:
151 ~Input() override;
152
154 virtual void connect(Output* op) final;
156 virtual void disconnect(Output* op) final;
157
159 Output* src_{nullptr};
162
163private:
165 friend void connect(Output& op, Input& ip);
167 friend void disconnect(Output& op, Input& ip);
169 template <typename OutputValType, typename... OutputArgs>
170 friend class OutputPort;
171};
172
174class Output : public Port
175{
176public:
180 virtual std::size_t numConnections() const = 0;
181
182protected:
186 ~Output() override = default;
187
189 virtual void connect(Input* ip) = 0;
191 virtual void disconnect(Input* ip) = 0;
192
193private:
195 friend void connect(Output& op, Input& ip);
197 friend void disconnect(Output& op, Input& ip);
199 friend Input;
200};
201
211template <typename T>
212class InputPort : public Input
213{
214public:
216 ~InputPort() override = default;
217
219 explicit InputPort(T* target);
220
222 explicit InputPort(std::function<void(T)> target);
223
225 template <class Obj, class ObjMemberFn>
226 explicit InputPort(Obj* obj, ObjMemberFn&& fn);
227
229 InputPort(const InputPort&) = delete;
231 InputPort& operator=(const InputPort&) = delete;
233 InputPort(const InputPort&&) = delete;
235 InputPort& operator=(const InputPort&&) = delete;
236
242 void post(const Update<T>& u);
243
251 void post(T v, bool immediate = false);
252
254 void operator()(const Update<T>& u);
255
257 void operator()(T v, bool immediate = false);
258
261
263 InputPort<T>& operator=(Output& op) override;
264
266 bool update() override;
267
269 void notify(State s) override;
270
272 Metadata serialize() override;
273
275 void deserialize(const Metadata& m) override;
276
277private:
282};
283
293template <typename T, typename... Args>
294class OutputPort : public Output
295{
296public:
301 using Arguments = std::tuple<Args...>;
302
304 ~OutputPort() override;
305
309 explicit OutputPort(T source);
310
312 explicit OutputPort(T* source);
313
321 explicit OutputPort(std::function<T(Args...)> source, Args&&... args);
322
330 template <class Obj, class ObjMemberFn>
331 explicit OutputPort(Obj* obj, ObjMemberFn&& fn, Args&&... args);
332
334 OutputPort(const OutputPort&) = delete;
336 OutputPort& operator=(const OutputPort&) = delete;
338 OutputPort(const OutputPort&&) = delete;
340 OutputPort& operator=(const OutputPort&&) = delete;
341
344
346 std::size_t numConnections() const override;
347
349 void setArgs(Args&&... args);
350
352 T val();
354 T operator()();
355
357 bool update() override;
358
360 void notify(State s) override;
361
363 Metadata serialize() override;
364
366 void deserialize(const Metadata& m) override;
367
368private:
371
374
376 template <std::size_t... Is>
378
381
388 void connect(Input* ip) final;
389
391 void disconnect(Input* ip) final;
392
400
403};
404
405} // namespace smgl
406
407#include "smgl/PortsImpl.hpp"
T c_str(T... args)
Typed InputPort class.
Definition Ports.hpp:213
bool update() override
Update the target with the most recently posted update.
Definition PortsImpl.hpp:73
Update< T > queued_update_
Definition Ports.hpp:281
~InputPort() override=default
void notify(State s) override
Receive a state update from a connected port.
Definition PortsImpl.hpp:86
Metadata serialize() override
Get port metadata.
Definition PortsImpl.hpp:93
void deserialize(const Metadata &m) override
Load port metadata.
std::function< void(T)> target_
Definition Ports.hpp:279
InputPort & operator=(const InputPort &)=delete
InputPort & operator=(const InputPort &&)=delete
void operator()(const Update< T > &u)
Post an update to the port.
Definition PortsImpl.hpp:46
InputPort(const InputPort &&)=delete
InputPort(const InputPort &)=delete
void post(const Update< T > &u)
Post an update to the port.
Definition PortsImpl.hpp:27
Generic input port interface.
Definition Ports.hpp:132
virtual Input & operator=(Output &op)
Connect an output port to an input port.
friend void connect(Output &op, Input &ip)
Connect an output port to an input port.
std::size_t last_updated_
Definition Ports.hpp:161
std::size_t numConnections() const
Get the number of connections.
std::vector< Connection > getConnections() const
virtual void disconnect(Output *op) final
~Input() override
virtual void connect(Output *op) final
Output * src_
Definition Ports.hpp:159
friend void disconnect(Output &op, Input &ip)
Disconnect an output port and input port.
Generic Node class.
Definition Node.hpp:70
Typed OutputPort class.
Definition Ports.hpp:295
void setArgs(Args &&... args)
Set the arguments passed to a function source.
std::unordered_map< Uuid, TypedConnection > connections_
Definition Ports.hpp:402
T run_(std::tuple< Args... > &tup, std::index_sequence< Is... >)
~OutputPort() override
bool update() override
Update all active connections with the value of the source.
T operator()()
Get the current value of source.
OutputPort(const OutputPort &)=delete
Metadata serialize() override
Get port metadata.
OutputPort & operator=(const OutputPort &)=delete
std::size_t numConnections() const override
Get the number of active connections.
OutputPort & operator=(const OutputPort &&)=delete
OutputPort(const OutputPort &&)=delete
std::vector< Connection > getConnections() const override
Get a list of active connections.
Arguments args_
Definition Ports.hpp:373
void deserialize(const Metadata &m) override
Load port metadata.
std::function< T(Args...)> source_
Definition Ports.hpp:370
T val()
Get the current value of source.
void notify(State s) override
Notify all active connections of this port's state.
Generic output port interface.
Definition Ports.hpp:175
friend void connect(Output &op, Input &ip)
Connect an output port to an input port.
~Output() override=default
virtual void connect(Input *ip)=0
virtual std::vector< Connection > getConnections() const =0
virtual std::size_t numConnections() const =0
friend Input
Definition Ports.hpp:199
virtual void disconnect(Input *ip)=0
friend void disconnect(Output &op, Input &ip)
Disconnect an output port and input port.
Generic port interface.
Definition Ports.hpp:91
State state() const
Port()=default
void setState(State s)
virtual void deserialize(const Metadata &m)=0
Node * parent_
Definition Ports.hpp:127
void setParent(Node *p)
State state_
Definition Ports.hpp:125
Port(State s)
virtual void notify(State s)=0
virtual bool update()=0
virtual Metadata serialize()=0
virtual ~Port()=default
Base class for objects which are uniquely identifiable.
Definition Uuid.hpp:77
Project top-level namespace.
void operator<<(Input &ip, Output &op)
Connect an output port to an input port.
void disconnect(Output &op, Input &ip)
Disconnect an output port and input port.
void connect(Output &op, Input &ip)
Connect an output port to an input port.
nlohmann::ordered_json Metadata
Metadata storage class.
Definition Metadata.hpp:12
@ Error
Error messages and above.
Definition Logging.hpp:23
void operator>>(Output &op, Input &ip)
Connect an output port to an input port.
ISO C++ top-level namespace.
Describes untyped connections from an output port.
Definition Ports.hpp:71
Connection()=default
Node * srcNode
Definition Ports.hpp:80
Connection(Node *s, Output *sp, Node *d, Input *dp)
Definition Ports.hpp:75
Output * srcPort
Definition Ports.hpp:82
Node * destNode
Definition Ports.hpp:84
Input * destPort
Definition Ports.hpp:86
Describes typed connections from an output port.
Definition Ports.hpp:394
Typed update sent over connections.
Definition Ports.hpp:34
std::size_t tick
Definition Ports.hpp:38
Exception thrown for port connection failures.
Definition Ports.hpp:18
bad_connection(const char *msg)
Definition Ports.hpp:21
std::string msg_
Definition Ports.hpp:29
bad_connection(std::string msg)
Definition Ports.hpp:23
const char * what() const noexcept override
Definition Ports.hpp:25