CommRaT 2.0.0
C++20 Real-Time Messaging Framework
Loading...
Searching...
No Matches
commrat::MessageRegistry< MessageDefs > Class Template Reference

Compile-time message type registry using MessageDefinition templates. More...

#include <commrat/messaging/message_registry.hpp>

Classes

struct  IsInTuple
 
struct  IsInTuple< T, std::tuple< Types... > >
 

Public Types

using PayloadTypes = typename ExtractPayloads< ProcessedDefs >::PayloadTypes
 
template<uint32_t ID>
using PayloadTypeFor = typename TypeByID< ID, 0 >::type
 Get the payload type by message ID (compile-time)
 
template<std::size_t I>
using type_at = std::tuple_element_t< I, PayloadTypes >
 Get payload type at index I.
 

Static Public Member Functions

template<typename... Payloads>
static constexpr size_t calc_max_size (std::tuple< Payloads... > *)
 
template<typename... SpecificTypes>
static constexpr size_t max_size_for_types ()
 Calculate maximum message size for specific payload types.
 
template<typename T >
requires is_registered_v<T>
static constexpr uint32_t get_message_id ()
 Get the message ID for a given payload type.
 
template<typename T >
requires is_registered_v<T>
static auto serialize (T &message)
 Serialize a message with automatic type registration check.
 
template<typename PayloadT >
requires is_registered_v<PayloadT>
static auto serialize (TimsMessage< PayloadT > &message)
 Serialize a TimsMessage<PayloadT> wrapper.
 
template<typename T >
requires is_registered_v<T> && (!requires { typename T::payload_type; })
static auto deserialize (std::span< const std::byte > data)
 Deserialize a message with known type at compile time.
 
template<typename MsgT >
requires requires { typename MsgT::payload_type; } && is_registered_v<typename MsgT::payload_type>
static auto deserialize (std::span< const std::byte > data)
 Deserialize a TimsMessage<PayloadT> wrapper.
 
template<typename Visitor >
static bool visit (uint32_t msg_id, std::span< const std::byte > data, Visitor &&visitor)
 Visit a message by its message ID using a visitor.
 
template<typename Callback >
static bool dispatch (uint32_t msg_id, std::span< const std::byte > data, Callback &&callback)
 Deserialize message by ID and dispatch to callback.
 
static constexpr size_t max_buffer_size ()
 Get maximum buffer size needed for any message in the registry.
 
static constexpr size_t size ()
 Get number of registered message types.
 
template<typename... Defs>
static constexpr auto get_all_ids_impl (std::tuple< Defs... > *)
 Get list of all message IDs in the registry.
 
static constexpr auto message_ids ()
 
template<typename T >
static constexpr std::size_t get_type_index ()
 Get type index for payload type T.
 

Static Public Attributes

template<typename T >
static constexpr bool is_registered_v = IsInTuple<T, PayloadTypes>::value
 
static constexpr size_t num_types = sizeof...(MessageDefs)
 
static constexpr size_t max_message_size = calc_max_size(static_cast<PayloadTypes*>(nullptr))
 
template<typename T >
static constexpr bool is_registered = is_registered_v<T>
 Check if a payload type is registered.
 
template<uint32_t ID>
static constexpr bool has_message_id = TypeByID<ID, 0>::found
 Check if a message ID is registered.
 

Detailed Description

template<typename... MessageDefs>
class commrat::MessageRegistry< MessageDefs >

Compile-time message type registry using MessageDefinition templates.

This registry uses the new MessageDefinition system for compile-time message ID generation, auto-increment, collision detection, and type-safe dispatch.

Usage: using MyRegistry = MessageRegistry< MessageDefinition<StatusData, MessagePrefix::UserDefined, UserSubPrefix::Data>, MessageDefinition<CommandMessage, MessagePrefix::UserDefined, UserSubPrefix::Commands>, MessageDefinition<SubscribeRequest, MessagePrefix::System, SystemSubPrefix::Subscription, 0x0001> >;

// Auto-increment and collision detection happen at compile-time // max_message_size calculated from all payload types

Definition at line 148 of file message_registry.hpp.

Member Typedef Documentation

◆ PayloadTypeFor

template<typename... MessageDefs>
template<uint32_t ID>
using commrat::MessageRegistry< MessageDefs >::PayloadTypeFor = typename TypeByID<ID, 0>::type

Get the payload type by message ID (compile-time)

Definition at line 333 of file message_registry.hpp.

◆ PayloadTypes

template<typename... MessageDefs>
using commrat::MessageRegistry< MessageDefs >::PayloadTypes = typename ExtractPayloads<ProcessedDefs>::PayloadTypes

Definition at line 167 of file message_registry.hpp.

◆ type_at

template<typename... MessageDefs>
template<std::size_t I>
using commrat::MessageRegistry< MessageDefs >::type_at = std::tuple_element_t<I, PayloadTypes>

Get payload type at index I.

Definition at line 518 of file message_registry.hpp.

Member Function Documentation

◆ calc_max_size()

template<typename... MessageDefs>
template<typename... Payloads>
static constexpr size_t commrat::MessageRegistry< MessageDefs >::calc_max_size ( std::tuple< Payloads... > *  )
inlinestaticconstexpr

◆ deserialize() [1/2]

template<typename... MessageDefs>
template<typename T >
requires is_registered_v<T> && (!requires { typename T::payload_type; })
static auto commrat::MessageRegistry< MessageDefs >::deserialize ( std::span< const std::byte >  data)
inlinestatic

Deserialize a message with known type at compile time.

Use this when you know the message type at compile time. For payload types, deserializes to TimsMessage<T> and extracts payload.

Parameters
dataBuffer containing serialized message
Returns
DeserializeResult containing the deserialized payload

Definition at line 402 of file message_registry.hpp.

◆ deserialize() [2/2]

template<typename... MessageDefs>
template<typename MsgT >
requires requires { typename MsgT::payload_type; } && is_registered_v<typename MsgT::payload_type>
static auto commrat::MessageRegistry< MessageDefs >::deserialize ( std::span< const std::byte >  data)
inlinestatic

Deserialize a TimsMessage<PayloadT> wrapper.

Overload for TimsMessage<PayloadT> where PayloadT is registered. This enables payload-only registration while still deserializing the full message with header.

Definition at line 427 of file message_registry.hpp.

◆ dispatch()

template<typename... MessageDefs>
template<typename Callback >
static bool commrat::MessageRegistry< MessageDefs >::dispatch ( uint32_t  msg_id,
std::span< const std::byte >  data,
Callback &&  callback 
)
inlinestatic

Deserialize message by ID and dispatch to callback.

This is a convenience wrapper around visit() for consistency with older API.

Parameters
msg_idThe message ID (32-bit)
dataBuffer containing serialized message
callbackCallback function that accepts any message type
Returns
true if message was successfully deserialized and dispatched

Definition at line 470 of file message_registry.hpp.

References commrat::MessageRegistry< MessageDefs >::visit().

◆ get_all_ids_impl()

template<typename... MessageDefs>
template<typename... Defs>
static constexpr auto commrat::MessageRegistry< MessageDefs >::get_all_ids_impl ( std::tuple< Defs... > *  )
inlinestaticconstexpr

Get list of all message IDs in the registry.

Definition at line 496 of file message_registry.hpp.

References commrat::make_message_id().

Referenced by commrat::MessageRegistry< MessageDefs >::message_ids().

◆ get_message_id()

template<typename... MessageDefs>
template<typename T >
requires is_registered_v<T>
static constexpr uint32_t commrat::MessageRegistry< MessageDefs >::get_message_id ( )
inlinestaticconstexpr

Get the message ID for a given payload type.

Definition at line 325 of file message_registry.hpp.

◆ get_type_index()

template<typename... MessageDefs>
template<typename T >
static constexpr std::size_t commrat::MessageRegistry< MessageDefs >::get_type_index ( )
inlinestaticconstexpr

Get type index for payload type T.

Definition at line 524 of file message_registry.hpp.

◆ max_buffer_size()

template<typename... MessageDefs>
static constexpr size_t commrat::MessageRegistry< MessageDefs >::max_buffer_size ( )
inlinestaticconstexpr

◆ max_size_for_types()

template<typename... MessageDefs>
template<typename... SpecificTypes>
static constexpr size_t commrat::MessageRegistry< MessageDefs >::max_size_for_types ( )
inlinestaticconstexpr

Calculate maximum message size for specific payload types.

This allows creating typed mailboxes with correct buffer sizes instead of using max_message_size for all mailboxes (which wastes memory).

Template Parameters
SpecificTypesSubset of payload types
Returns
Maximum serialized size among the specified types

Example:

// Only need buffer for ResetCmd (16 bytes) and CalibrateCmd (24 bytes)
constexpr size_t cmd_buffer_size = Registry::max_size_for_types<ResetCmd, CalibrateCmd>();
// Result: 24 bytes instead of Registry::max_message_size (e.g., 2048 bytes)

Definition at line 210 of file message_registry.hpp.

References commrat::MessageRegistry< MessageDefs >::max_buffer_size().

◆ message_ids()

template<typename... MessageDefs>
static constexpr auto commrat::MessageRegistry< MessageDefs >::message_ids ( )
inlinestaticconstexpr

◆ serialize() [1/2]

template<typename... MessageDefs>
template<typename T >
requires is_registered_v<T>
static auto commrat::MessageRegistry< MessageDefs >::serialize ( T &  message)
inlinestatic

Serialize a message with automatic type registration check.

This function provides compile-time type safety - will not compile if the message type is not registered in the registry.

Parameters
messageThe message to serialize
Returns
SerializeResult containing buffer and size

Definition at line 356 of file message_registry.hpp.

References commrat::serialize_message().

Referenced by commrat::MessageRegistry< MessageDefs >::serialize().

◆ serialize() [2/2]

template<typename... MessageDefs>
template<typename PayloadT >
requires is_registered_v<PayloadT>
static auto commrat::MessageRegistry< MessageDefs >::serialize ( TimsMessage< PayloadT > &  message)
inlinestatic

Serialize a TimsMessage<PayloadT> wrapper.

Overload for TimsMessage<PayloadT> where PayloadT is registered. This enables payload-only registration while still serializing the full message with header.

Definition at line 378 of file message_registry.hpp.

References commrat::TimsMessage< PayloadT >::header, commrat::TimsHeader::msg_size, commrat::TimsHeader::msg_type, and commrat::MessageRegistry< MessageDefs >::serialize().

◆ size()

template<typename... MessageDefs>
static constexpr size_t commrat::MessageRegistry< MessageDefs >::size ( )
inlinestaticconstexpr

Get number of registered message types.

Definition at line 488 of file message_registry.hpp.

References commrat::MessageRegistry< MessageDefs >::num_types.

◆ visit()

template<typename... MessageDefs>
template<typename Visitor >
static bool commrat::MessageRegistry< MessageDefs >::visit ( uint32_t  msg_id,
std::span< const std::byte >  data,
Visitor &&  visitor 
)
inlinestatic

Visit a message by its message ID using a visitor.

This provides runtime dispatch when the message type is not known at compile time. Uses template expansion to generate efficient switch-like behavior without virtual functions.

The visitor should accept any message type in the registry: auto visitor = [](auto&& msg) { using MsgType = std::decay_t<decltype(msg)>; // Handle message... };

Parameters
msg_idThe message ID (32-bit)
dataBuffer containing serialized message
visitorVisitor function/lambda that accepts any message type
Returns
true if message was successfully deserialized and visited

Definition at line 455 of file message_registry.hpp.

Referenced by commrat::MessageRegistry< MessageDefs >::dispatch().

Member Data Documentation

◆ has_message_id

template<typename... MessageDefs>
template<uint32_t ID>
constexpr bool commrat::MessageRegistry< MessageDefs >::has_message_id = TypeByID<ID, 0>::found
staticconstexpr

Check if a message ID is registered.

Definition at line 339 of file message_registry.hpp.

◆ is_registered

template<typename... MessageDefs>
template<typename T >
constexpr bool commrat::MessageRegistry< MessageDefs >::is_registered = is_registered_v<T>
staticconstexpr

Check if a payload type is registered.

Definition at line 318 of file message_registry.hpp.

◆ is_registered_v

template<typename... MessageDefs>
template<typename T >
constexpr bool commrat::MessageRegistry< MessageDefs >::is_registered_v = IsInTuple<T, PayloadTypes>::value
staticconstexpr

Definition at line 179 of file message_registry.hpp.

◆ max_message_size

template<typename... MessageDefs>
constexpr size_t commrat::MessageRegistry< MessageDefs >::max_message_size = calc_max_size(static_cast<PayloadTypes*>(nullptr))
staticconstexpr

◆ num_types

template<typename... MessageDefs>
constexpr size_t commrat::MessageRegistry< MessageDefs >::num_types = sizeof...(MessageDefs)
staticconstexpr

Definition at line 182 of file message_registry.hpp.

Referenced by commrat::MessageRegistry< MessageDefs >::size().


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