libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::Topic::Callback Class Reference
Collaboration diagram for LibXR::Topic::Callback:
[legend]

Data Structures

struct  BlockHeader
 
struct  Factory
 
struct  Factory< Function, BoundArg, 3 >
 
struct  Factory< Function, BoundArg, 4 >
 
struct  FunctionTraits
 
struct  FunctionTraits< Return(*)(Args...)>
 
struct  MessageViewTraits
 
struct  MessageViewTraits< MessageView< Data > >
 
struct  PayloadOnlyBlock
 
struct  TimestampPayloadBlock
 

Public Member Functions

 Callback (const Callback &)=default
 
Callbackoperator= (const Callback &)=default
 
void Run (bool in_isr, MicrosecondTimestamp timestamp, RawData &data) const
 
uint32_t PayloadSize () const
 

Static Public Member Functions

template<typename BoundArg , typename Callable >
static Callback Create (Callable fun, BoundArg arg)
 

Private Types

template<typename T >
using RemoveCVRef = std::remove_cv_t<std::remove_reference_t<T>>
 

Private Member Functions

 Callback (BlockHeader *block)
 

Static Private Member Functions

template<typename PayloadArg >
static consteval uint32_t PayloadSize ()
 
template<typename Function , typename BoundArg , typename PayloadArg >
static void InvokePayload (Function fun, BoundArg &arg, bool in_isr, MicrosecondTimestamp timestamp, RawData &data)
 
static void EmptyRun (const BlockHeader *, bool, MicrosecondTimestamp, RawData &)
 

Private Attributes

BlockHeaderblock_ = &empty_block_
 

Static Private Attributes

template<typename T >
static constexpr bool IS_RAW_DATA
 
template<typename T >
static constexpr bool IS_MESSAGE_VIEW = MessageViewTraits<RemoveCVRef<T>>::VALUE
 
template<typename T >
static constexpr bool IS_TYPED_DATA
 
template<typename T >
static constexpr bool IS_CALLBACK_PAYLOAD
 
static BlockHeader empty_block_ {&EmptyRun, 0}
 

Detailed Description

Definition at line 421 of file subscriber.hpp.

Member Typedef Documentation

◆ RemoveCVRef

template<typename T >
using LibXR::Topic::Callback::RemoveCVRef = std::remove_cv_t<std::remove_reference_t<T>>
private

Definition at line 450 of file subscriber.hpp.

Constructor & Destructor Documentation

◆ Callback()

LibXR::Topic::Callback::Callback ( BlockHeader * block)
inlineexplicitprivate

Definition at line 654 of file subscriber.hpp.

654: block_(block ? block : &empty_block_) {}

Member Function Documentation

◆ Create()

template<typename BoundArg , typename Callable >
static Callback LibXR::Topic::Callback::Create ( Callable fun,
BoundArg arg )
inlinestaticnodiscard

Definition at line 635 of file subscriber.hpp.

636 {
637 using Function = decltype(+std::declval<Callable>());
638 using Traits = FunctionTraits<Function>;
639 static_assert(Traits::ARITY == 3 || Traits::ARITY == 4,
640 "LibXR::Topic::Callback::Create expects a capture-free callable "
641 "with bool and bound-argument parameters.");
642 return Callback(
643 Factory<Function, BoundArg, Traits::ARITY>::Create(+fun, std::move(arg)));
644 }

◆ EmptyRun()

static void LibXR::Topic::Callback::EmptyRun ( const BlockHeader * ,
bool ,
MicrosecondTimestamp ,
RawData &  )
inlinestaticprivate

Definition at line 625 of file subscriber.hpp.

625{}

◆ InvokePayload()

template<typename Function , typename BoundArg , typename PayloadArg >
static void LibXR::Topic::Callback::InvokePayload ( Function fun,
BoundArg & arg,
bool in_isr,
MicrosecondTimestamp timestamp,
RawData & data )
inlinestaticprivate

Definition at line 497 of file subscriber.hpp.

499 {
500 if constexpr (std::same_as<RemoveCVRef<PayloadArg>, RawData>)
501 {
502 fun(in_isr, arg, data);
503 }
504 else if constexpr (std::same_as<RemoveCVRef<PayloadArg>, ConstRawData>)
505 {
506 ConstRawData const_data(data);
507 fun(in_isr, arg, const_data);
508 }
509 else if constexpr (IS_MESSAGE_VIEW<PayloadArg>)
510 {
511 using View = MessageViewTraits<RemoveCVRef<PayloadArg>>;
512 using Data = typename View::DataType;
513 MessageView<Data> message{timestamp, *reinterpret_cast<Data*>(data.addr_)};
514 fun(in_isr, arg, message);
515 }
516 else
517 {
518 using Data = RemoveCVRef<PayloadArg>;
519 fun(in_isr, arg, *reinterpret_cast<Data*>(data.addr_));
520 }
521 }

◆ PayloadSize() [1/2]

template<typename PayloadArg >
static consteval uint32_t LibXR::Topic::Callback::PayloadSize ( )
inlinestaticconstevalprivate

Definition at line 476 of file subscriber.hpp.

477 {
478 if constexpr (IS_RAW_DATA<PayloadArg>)
479 {
480 return 0;
481 }
482 else if constexpr (IS_MESSAGE_VIEW<PayloadArg>)
483 {
484 using View = MessageViewTraits<RemoveCVRef<PayloadArg>>;
485 return sizeof(typename View::DataType);
486 }
487 else
488 {
489 static_assert(IS_TYPED_DATA<PayloadArg>,
490 "LibXR::Topic::Callback payload must be RawData, ConstRawData, "
491 "Topic::MessageView<T>, T, T&, or const T&.");
492 return sizeof(RemoveCVRef<PayloadArg>);
493 }
494 }

◆ PayloadSize() [2/2]

uint32_t LibXR::Topic::Callback::PayloadSize ( ) const
inline

Definition at line 651 of file subscriber.hpp.

651{ return block_->payload_size; }

◆ Run()

void LibXR::Topic::Callback::Run ( bool in_isr,
MicrosecondTimestamp timestamp,
RawData & data ) const
inline

Definition at line 646 of file subscriber.hpp.

647 {
648 block_->run(block_, in_isr, timestamp, data);
649 }

Field Documentation

◆ block_

BlockHeader* LibXR::Topic::Callback::block_ = &empty_block_
private

Definition at line 656 of file subscriber.hpp.

◆ empty_block_

BlockHeader LibXR::Topic::Callback::empty_block_ {&EmptyRun, 0}
inlinestaticprivate

Definition at line 627 of file subscriber.hpp.

627{&EmptyRun, 0};

◆ IS_CALLBACK_PAYLOAD

template<typename T >
bool LibXR::Topic::Callback::IS_CALLBACK_PAYLOAD
staticconstexprprivate
Initial value:
=
IS_RAW_DATA<T> || IS_MESSAGE_VIEW<T> || IS_TYPED_DATA<T>

Definition at line 464 of file subscriber.hpp.

◆ IS_MESSAGE_VIEW

template<typename T >
bool LibXR::Topic::Callback::IS_MESSAGE_VIEW = MessageViewTraits<RemoveCVRef<T>>::VALUE
staticconstexprprivate

Definition at line 457 of file subscriber.hpp.

◆ IS_RAW_DATA

template<typename T >
bool LibXR::Topic::Callback::IS_RAW_DATA
staticconstexprprivate
Initial value:
=
std::same_as<RemoveCVRef<T>, RawData> || std::same_as<RemoveCVRef<T>, ConstRawData>

Definition at line 453 of file subscriber.hpp.

◆ IS_TYPED_DATA

template<typename T >
bool LibXR::Topic::Callback::IS_TYPED_DATA
staticconstexprprivate
Initial value:
=
!IS_RAW_DATA<T> && !IS_MESSAGE_VIEW<T> && TopicPayload<RemoveCVRef<T>>

Definition at line 460 of file subscriber.hpp.


The documentation for this class was generated from the following file: