20template <
class Obj,
class ObjMemberFn>
22 : target_{[=](T v) {
return (*obj.*fn)(v); }}
31 queued_update_.
tick = last_updated_ + 1;
32 state_ = State::Queued;
76 if (queued_update_.tick > last_updated_) {
77 target_(queued_update_.val);
78 last_updated_ = queued_update_.tick;
96 m[
"uuid"] = uuid_.string();
111template <
typename T,
typename... Args>
114 for (
auto& c : connections_) {
115 c.second.port->disconnect(
this);
120template <
typename T,
typename... Args>
122 : source_{[source](Args...) {
return source; }}
126template <
typename T,
typename... Args>
128 : source_{[source](Args...) {
return *source; }}
133template <
typename T,
typename... Args>
136 : source_{source}, args_{
Arguments(
std::forward<Args>(args)...)}
140template <
typename T,
typename... Args>
141template <
class Obj,
class ObjMemberFn>
143 : source_{[=](Args... a) {
return (*obj.*fn)(a...); }}
148template <
typename T,
typename... Args>
153 for (
const auto& c : connections_) {
155 parent_,
const_cast<ThisType*
>(
this), c.second.node, c.second.port);
160template <
typename T,
typename... Args>
163 return connections_.size();
167template <
typename T,
typename... Args>
173template <
typename T,
typename... Args>
178template <
typename T,
typename... Args>
186template <
typename T,
typename... Args>
190 for (
const auto& c : connections_) {
191 c.second.port->post(update);
193 return connections_.size() > 0;
196template <
typename T,
typename... Args>
199 for (
const auto& c : connections_) {
200 c.second.port->notify(s);
204template <
typename T,
typename... Args>
208 m[
"uuid"] = uuid_.string();
212template <
typename T,
typename... Args>
219template <
typename T,
typename... Args>
227template <
typename T,
typename... Args>
233template <
typename T,
typename... Args>
241 if (state_ == State::Idle) {
243 typedIP->post(update);
247template <
typename T,
typename... Args>
250 if (connections_.erase(ip->
uuid()) == 0) {
void setArgs(Args &&... args)
Set the arguments passed to a function source.
T run_(std::tuple< Args... > &tup, std::index_sequence< Is... >)
OutputPort(T source)
Construct with a copy of source. Source is effectively constant.
bool update() override
Update all active connections with the value of the source.
T operator()()
Get the current value of source.
Metadata serialize() override
Get port metadata.
std::size_t numConnections() const override
Get the number of active connections.
std::vector< Connection > getConnections() const override
Get a list of active connections.
void deserialize(const Metadata &m) override
Load port metadata.
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.
friend void connect(Output &op, Input &ip)
Connect an output port to an input port.
friend void disconnect(Output &op, Input &ip)
Disconnect an output port and input port.
auto uuid() const -> Uuid
static auto FromString(const std::string &str) -> Uuid
Construct a UUID from a string.
T emplace_back(T... args)
Project top-level namespace.
nlohmann::ordered_json Metadata
Metadata storage class.
ISO C++ top-level namespace.
Describes untyped connections from an output port.
Typed update sent over connections.
Exception thrown for port connection failures.