ion 0.12.0
Atomic concurrency support library
Loading...
Searching...
No Matches
ion::SignalToken< T > Class Template Reference

Signal token that has an associated SignalSource and last known value. More...

#include <ion/signal.hpp>

Public Types

using ValueType = T
 

Public Member Functions

Initialization.
 SignalToken () noexcept=default
 Default-initialized token.
 
 SignalToken (SignalSource< T > const *signal, std::optional< ValueType > last=std::nullopt) noexcept
 Initialize token.
 
 SignalToken (SignalToken const &) noexcept=default
 
auto operator= (SignalToken const &) noexcept -> SignalToken &=default
 
 SignalToken (SignalToken &&other) noexcept
 Move-construct token, leaving other in an invalid state.
 
auto operator= (SignalToken &&other) noexcept -> SignalToken &
 Move-assign token, leaving other in an invalid state.
 
Observers
constexpr auto IsValid () const noexcept -> bool
 
auto Load () const noexcept -> ValueType
 
constexpr auto GetSource () const -> SignalSource< ValueType > const *
 
constexpr auto GetLast () const noexcept -> ValueType
 Get last observed value.
 
Modifiers
constexpr void SetLast (ValueType last) noexcept
 Set last observed value.
 
auto Update () noexcept -> ValueType
 

Related Symbols

(Note that these are not member symbols.)

template<class T>
constexpr auto operator== (SignalToken< T > const &lhs, SignalToken< T > const &rhs) noexcept -> bool
 Equality comparison.
 
template<class T>
constexpr auto operator!= (SignalToken< T > const &lhs, SignalToken< T > const &rhs) noexcept -> bool
 Inequality comparison.
 
Wait and yield current signal value.
template<class T>
auto Wait (SignalToken< T > &token) noexcept -> T
 Wait until signal source changes and return current value.
 
template<class T, class Predicate>
auto Wait (SignalToken< T > &token, Predicate &&stop_waiting) noexcept -> T
 Wait with predicate.
 
Wait and yield Status<T>.
template<class T>
auto Wait (StatusTag, SignalToken< T > &token) noexcept -> Status< T >
 Wait until signal source changes and return current and previous values.
 
template<class T, class Predicate>
auto Wait (StatusTag, SignalToken< T > &token, Predicate &&stop_waiting) noexcept -> Status< T >
 Wait with predicate.
 
Wait and yield changes since last.
template<class T>
auto Wait (DifferenceTag, SignalToken< T > &token) noexcept -> T
 Wait until signal source changes and return difference (current - previous) value.
 
template<class T, class Predicate>
auto Wait (DifferenceTag, SignalToken< T > &token, Predicate &&stop_waiting) noexcept -> T
 Wait until signal source changes and return difference (current - previous) value.
 
Wait for either of two signals.

Effects Load and compare each of the signals with previous value.

The first one to change will be recorded in the WaitAnyResult::index. Depending on the selected overload the result of WaitAnyResult::result is either the current, difference or the Status containing both previous and current value.

template<class T1, class T2>
auto WaitAny (SignalToken< T1 > &token1, SignalToken< T2 > &token2) noexcept -> WaitAnyResult< T1, T2 >
 Wait for either of two signals to change.
 
template<class T1, class T2>
auto WaitAny (StatusTag, SignalToken< T1 > &token1, SignalToken< T2 > &token2) noexcept -> WaitAnyResult< Status< T1 >, Status< T2 > >
 Wait for either of two signals to change.
 
template<class T1, class T2>
auto WaitAny (DifferenceTag, SignalToken< T1 > &token1, SignalToken< T2 > &token2) noexcept -> WaitAnyResult< T1, T2 >
 Wait for either of two signals to change.
 

Detailed Description

template<class T>
class ion::SignalToken< T >

Signal token that has an associated SignalSource and last known value.

A SignalToken is valid (IsValid() == true) if it is associated with a SignalSource.

Moving a SignalToken will leave the moved-from object invalid.

See Signals for example.

Thread Safety
thread-compatible

Constructor & Destructor Documentation

◆ SignalToken() [1/3]

template<class T>
ion::SignalToken< T >::SignalToken ( )
defaultnoexcept

Default-initialized token.

Postcondition
IsValid() == false

◆ SignalToken() [2/3]

template<class T>
ion::SignalToken< T >::SignalToken ( SignalSource< T > const * signal,
std::optional< ValueType > last = std::nullopt )
explicitnoexcept

Initialize token.

Parameters
signalAssociated signal.
lastOptional value to set as last known signal value. If nullopt is used and signal is valid the last value will be initialized from signal source.

◆ SignalToken() [3/3]

template<class T>
ion::SignalToken< T >::SignalToken ( SignalToken< T > && other)
noexcept

Move-construct token, leaving other in an invalid state.

Parameters
otherSignalToken to move from.
Postcondition
other.IsValid() == false

Member Function Documentation

◆ GetSource()

template<class T>
auto ion::SignalToken< T >::GetSource ( ) const -> SignalSource< ValueType > const *
nodiscardconstexpr
Returns
Signal source associated with this SignalToken.

◆ IsValid()

template<class T>
auto ion::SignalToken< T >::IsValid ( ) const -> bool
nodiscardconstexprnoexcept
Returns
true if SignalToken is associated with a SignalSource.
false otherwise.

◆ Load()

template<class T>
auto ion::SignalToken< T >::Load ( ) const -> ValueType
nodiscardnoexcept
  Loads signal value but *does not* set last value.

  @pre `IsValid() == true`
  @sa Update()
  \par Memory Order
 \parblock Loads value from associated signal source using relaxed memory order (no

synchronize-with relationships).

◆ operator=()

template<class T>
auto ion::SignalToken< T >::operator= ( SignalToken< T > && other) -> SignalToken &
noexcept

Move-assign token, leaving other in an invalid state.

Parameters
otherSignalToken to move from.
Postcondition
other.IsValid() == false

◆ SetLast()

template<class T>
void ion::SignalToken< T >::SetLast ( ValueType last)
constexprnoexcept

Set last observed value.

Parameters
lastValue to set as "last" known value from signal.

◆ Update()

template<class T>
auto ion::SignalToken< T >::Update ( ) -> ValueType
noexcept
  Load from signal and set last value.

  @pre IsValid() == true
  @return New signal source value.
  @post `r.Update() == r.GetLast()`
  @sa Load()
  \par Memory Order
 \parblock Loads value from associated signal source using relaxed memory order (no

synchronize-with relationships).