An abstract reactor that can be subclassed to define new reactors. More...
#include <xronos/sdk/reactor.hh>
Public Member Functions | |
Reactor (std::string_view name, Context parent_context) | |
Constructor. | |
Public Member Functions inherited from xronos::sdk::Element | |
auto | name () const noexcept -> const std::string & |
Get the element's name. | |
auto | fqn () const noexcept -> const std::string & |
Get the element's fully qualified name. | |
auto | add_attribute (std::string_view key, const AttributeValue &value) noexcept -> bool |
Annotate an element with an attribute. | |
template<std::ranges::input_range R> requires requires(std::ranges::range_value_t<R> pair) { { pair.first } -> std::convertible_to<std::string_view>; { pair.second } -> std::convertible_to<AttributeValue>; } | |
auto | add_attributes (const R &range) noexcept -> bool |
Annotate an element with multiple attributes. | |
auto | add_attributes (std::initializer_list< std::pair< std::string_view, AttributeValue > > attributes) -> bool |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
virtual | ~Element ()=default |
Virtual destructor. |
Protected Member Functions | |
auto | context (std::source_location source_location=std::source_location::current()) noexcept -> ReactorContext |
Get a context object for constructing reactor elements and contained reactors. | |
auto | get_time () const noexcept -> TimePoint |
Get the current timestamp. | |
auto | get_lag () const noexcept -> Duration |
Get the current lag. | |
auto | get_time_since_startup () const noexcept -> Duration |
Get the time that passed since the startup event. | |
auto | startup () const noexcept -> const EventSource< void > & |
Get the startup event source. | |
auto | shutdown () const noexcept -> const EventSource< void > & |
Get the shutdown event source. | |
void | request_shutdown () noexcept |
Request the termination of a currently running reactor program. | |
template<class T> | |
void | connect (const InputPort< T > &from, const InputPort< T > &to) |
Connect two ports. | |
template<class T> | |
void | connect (const OutputPort< T > &from, const OutputPort< T > &to) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
template<class T> | |
void | connect (const OutputPort< T > &from, const InputPort< T > &to) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
template<class T> | |
void | connect (const InputPort< T > &from, const InputPort< T > &to, Duration delay) |
Connect two ports with a delay. | |
template<class T> | |
void | connect (const OutputPort< T > &from, const OutputPort< T > &to, Duration delay) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
template<class T> | |
void | connect (const OutputPort< T > &from, const InputPort< T > &to, Duration delay) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
template<class ReactionClass> requires (std::is_base_of_v<BaseReaction, ReactionClass>) | |
void | add_reaction (std::string_view name, std::source_location source_location=std::source_location::current()) |
Instantiate and add a new reaction to the reactor. |
Private Member Functions | |
virtual void | assemble ()=0 |
Method that sets up the internal topology of the reactor. |
An abstract reactor that can be subclassed to define new reactors.
xronos::sdk::Reactor::Reactor | ( | std::string_view | name, |
Context | parent_context ) |
Constructor.
name | The name of the reactor instance. |
parent_context | Either the environment's or the containing reactor's context. |
|
nodiscardprotectednoexcept |
Get a context object for constructing reactor elements and contained reactors.
source_location | Source location of the call site. Normally this should be omitted to use the default argument. |
|
nodiscardprotectednoexcept |
Get the current timestamp.
This does not read wall-clock time. The Xronos runtime uses an internal clock to control how a program advances.
|
nodiscardprotectednoexcept |
Get the current lag.
Since in the Xronos SDK time does not advance while reactions execute, the internal clock may advance slower than a wall clock would. The lag denotes the difference between the wall clock and the internal clock. It is a measure of how far the execution of reactions lags behind events in the physical world.
|
nodiscardprotectednoexcept |
Get the time that passed since the startup event.
|
nodiscardprotectednoexcept |
Get the startup event source.
|
nodiscardprotectednoexcept |
Get the shutdown event source.
|
protectednoexcept |
|
protected |
Connect two ports.
Creates a new connection from the port given in from
to the port given in to
. Messages are delivered without a delay. This means that the timestamp at which the message is received is the same as the timestamp at which it was sent.
T | Value type associated with events relayed by the connection. |
from | The port to draw the connection from |
to | The port to draw the connection to. |
|
protected |
Connect two ports with a delay.
Creates a new connection from the port given in from
to the port given in to
. Messages are delivered with a delay. This means that the timestamp at which the message is received is the timestamp at which it was sent plus delay
.
T | Value type associated with events relayed by the connection. |
from | The port to draw the connection from |
to | The port to draw the connection to. |
delay | The delay to apply to all messages. |
|
protected |
Instantiate and add a new reaction to the reactor.
This is intended to be invoked when overloading assemble() in a subclass. This factor method presents the only mechanism for correctly registering a reaction for execution by the runtime.
ReactionClass | The reaction class to instantiate. This is typically a subclass of Reaction. |
name | The name of the reaction |
source_location | Source location of the call site. Normally this should be omitted to use the default argument. |
|
privatepure virtual |
Method that sets up the internal topology of the reactor.
This method needs to be overridden by concrete subclasses. The method is called by the runtime before the execution starts. An implementation of assemble() should call add_reaction() to instantiate the reactor's reactions. If the reactor contains other reactors, their ports may be connected using connect().