4#include "../messaging/message_registry.hpp"
5#include "../platform/threading.hpp"
38template<
typename Registry>
42 template<
typename... MessageDefs>
45 using UnderlyingMailbox =
decltype(extract_defs(
static_cast<Registry*
>(
nullptr)));
47 UnderlyingMailbox mailbox_;
70 return mailbox_.start();
78 return mailbox_.is_running();
82 return mailbox_.mailbox_id();
89 template<
typename PayloadT>
90 static constexpr bool is_registered = Registry::template is_registered<PayloadT>;
93 return Registry::size();
110 template<
typename PayloadT>
111 requires is_registered<PayloadT>
116 .
msg_type = Registry::template get_message_id<PayloadT>(),
125 return mailbox_.send(msg, dest_mailbox);
139 template<
typename PayloadT>
140 requires is_registered<PayloadT>
145 .
msg_type = Registry::template get_message_id<PayloadT>(),
147 .timestamp = timestamp,
154 return mailbox_.send(msg, dest_mailbox);
164 template<
typename PayloadT>
165 requires is_registered<PayloadT>
167 return mailbox_.template receive<PayloadT>();
173 template<
typename PayloadT>
174 requires is_registered<PayloadT>
176 return mailbox_.template try_receive<PayloadT>();
182 template<
typename PayloadT>
183 requires is_registered<PayloadT>
185 return mailbox_.template receive_for<PayloadT>(timeout);
193 template<
typename Visitor>
195 return mailbox_.receive_any(std::forward<Visitor>(visitor));
198 template<
typename Visitor>
200 return mailbox_.try_receive_any(std::forward<Visitor>(visitor));
203 template<
typename Visitor>
206 auto start = std::chrono::steady_clock::now();
207 while (std::chrono::steady_clock::now() -
start < timeout) {
209 auto result = mailbox_.receive_any_raw(std::chrono::milliseconds{-1});
212 bool handled = Registry::visit(
213 static_cast<uint32_t
>(result->type),
214 std::span{result->buffer.data(), result->buffer.size()},
215 [&](
auto& tims_msg) {
227 std::this_thread::sleep_for(std::chrono::milliseconds(10));
237 const UnderlyingMailbox&
underlying()
const {
return mailbox_; }
244template<
typename Registry>
MailboxError error() const
Strongly-typed mailbox for message-based communication.
Compile-time message type registry using MessageDefinition templates.
Mailbox that takes a MessageRegistry and exposes payload-only interface.
auto receive_for(std::chrono::milliseconds timeout) -> MailboxResult< TimsMessage< PayloadT > >
Receive with timeout.
const UnderlyingMailbox & underlying() const
UnderlyingMailbox & underlying()
RegistryMailbox(const RegistryMailbox &)=delete
uint32_t mailbox_id() const
RegistryMailbox & operator=(const RegistryMailbox &)=delete
auto start() -> MailboxResult< void >
auto send(PayloadT &payload, uint32_t dest_mailbox, uint64_t timestamp) -> MailboxResult< void >
Send a message payload with explicit timestamp (Phase 6.10)
auto receive_any_for(std::chrono::milliseconds timeout, Visitor &&visitor) -> MailboxResult< void >
RegistryMailbox(RegistryMailbox &&) noexcept=default
auto try_receive() -> MailboxResult< TimsMessage< PayloadT > >
Try to receive a message (non-blocking)
auto receive() -> MailboxResult< TimsMessage< PayloadT > >
Receive a message of specific payload type (blocking)
~RegistryMailbox()=default
auto send(PayloadT &payload, uint32_t dest_mailbox) -> MailboxResult< void >
Send a message payload to a destination mailbox.
static constexpr size_t num_message_types()
auto receive_any(Visitor &&visitor) -> MailboxResult< void >
Receive any registered message type using visitor pattern.
static constexpr bool is_registered
RegistryMailbox(const MailboxConfig &config)
auto try_receive_any(Visitor &&visitor) -> MailboxResult< void >
Build a complete registry with automatic Module and Mailbox aliases.
CommRaT - Modern C++ Real-Time Communication Framework.
auto make_mailbox(const MailboxConfig &config)