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, const Context &parent_context) | |
| Constructor. | |
| Public Member Functions inherited from xronos::sdk::Element | |
| Element (Element &&)=default | |
| Move constructor. | |
| virtual | ~Element ()=default |
| Virtual destructor. | |
| 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. | |
| auto | fqn () const noexcept -> const std::string & |
| Get the element's fully qualified name. | |
| auto | name () const noexcept -> const std::string & |
| Get the element's name. | |
| auto | operator= (Element &&) -> Element &=default |
| Move assignment operator. | |
| auto | uid () const noexcept -> std::uint64_t |
| Get the element's unique ID. | |
Protected Member Functions | |
| 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. | |
| template<class ReactionClass> requires (std::is_base_of_v<BaseReaction, ReactionClass>) | |
| void | add_reaction_with_deadline (std::string_view name, Duration deadline, std::source_location source_location=std::source_location::current()) |
| Instantiate and add a new reaction with a deadline to the reactor. | |
| template<class T, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const InputPort< T, FromSerializer > &from, const InputPort< T, ToSerializer > &to) |
| Connect two ports. | |
| template<class T, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const InputPort< T, FromSerializer > &from, const InputPort< T, ToSerializer > &to, Duration delay) |
| Connect two ports with a delay. | |
|
template<class T, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const OutputPort< T, FromSerializer > &from, const InputPort< T, ToSerializer > &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, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const OutputPort< T, FromSerializer > &from, const InputPort< T, ToSerializer > &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, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const OutputPort< T, FromSerializer > &from, const OutputPort< T, ToSerializer > &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, template< class > class FromSerializer, template< class > class ToSerializer> requires std::is_same_v<FromSerializer<T>, NoSerializer<T>> || std::is_same_v<ToSerializer<T>, NoSerializer<T>> || std::is_same_v <FromSerializer<T>, ToSerializer<T>> | |
| void | connect (const OutputPort< T, FromSerializer > &from, const OutputPort< T, ToSerializer > &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. | |
| auto | context (std::source_location source_location=std::source_location::current()) noexcept -> ReactorContext |
| Get a context object for constructing elements and contained reactors. | |
| auto | shutdown () noexcept -> Shutdown & |
| Get the shutdown event source. | |
| auto | startup () const noexcept -> const Startup & |
| Get the startup event source. | |
Private Member Functions | |
| virtual void | assemble ()=0 |
| Assemble the reactor. | |
An abstract reactor that can be subclassed to define new reactors.
| xronos::sdk::Reactor::Reactor | ( | std::string_view | name, |
| const Context & | parent_context ) |
Constructor.
| name | The name of the reactor instance. |
| parent_context | Either the environment's or the containing reactor's context. |
|
protected |
Instantiate and add a new reaction to the reactor.
This factory method is intended to be invoked when overloading assemble() in a subclass. It instantiates a reaction and registers it for execution by the runtime.
The order in which a reactor adds its reactions is its reaction order. When multiple reactions of this reactor trigger at the same timestamp, they run in this order. It implies no order between different reactors' reactions.
| 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. |
|
protected |
Instantiate and add a new reaction with a deadline to the reactor.
This factory method is intended to be invoked when overloading assemble() in a subclass. It instantiates a reaction and registers it for execution by the runtime.
In contrast to add_reaction(), this method annotates the added reaction with a deadline. The deadline is relative to the current time of the triggering event. The deadline is missed if the handler does not complete within this duration.
| ReactionClass | The reaction class to instantiate. This is typically a subclass of Reaction. |
| name | The name of the reaction |
| deadline | Relative deadline of the reaction |
| source_location | Source location of the call site. Normally this should be omitted to use the default argument. |
|
privatepure virtual |
Assemble the reactor.
Assembly is the phase in which reactors create their elements and declare connections, triggers, and effects, before execution begins. The runtime calls this method on every reactor before execution starts, and concrete subclasses must override it. 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().
|
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.
A port may feed several connections but receives through at most one. The environment connects only ports of top-level reactors.
| T | Value type associated with messages relayed by the connection. |
| from | The port to connect from. |
| to | The port to connect to. |
A reactor connects only its own ports and those of the reactors it directly contains, never deeper or across.
|
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.
A port may feed several connections but receives through at most one. The environment connects only ports of top-level reactors.
| T | Value type associated with messages relayed by the connection. |
| from | The port to connect from. |
| to | The port to connect to. |
| delay | The delay to apply to all messages. |
A reactor connects only its own ports and those of the reactors it directly contains, never deeper or across.
|
nodiscardprotectednoexcept |
Get a context object for constructing 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 shutdown event source.
|
nodiscardprotectednoexcept |
Get the startup event source.