Turned etl::send_message into templates so that direct calls to concrete routers are possible

This commit is contained in:
John Wellbelove 2024-03-15 10:58:11 +00:00
parent b807bad3e3
commit 80613827c9

View File

@ -342,11 +342,22 @@ namespace etl
}
};
//***************************************************************************
/// Is T ultimately derived from etl::imessage_router?
//***************************************************************************
template <typename T>
struct is_message_router : public etl::bool_constant<etl::is_base_of<etl::imessage_router, typename etl::remove_cvref<T>::type>::value>
{
};
//***************************************************************************
/// Send a message to a router.
//***************************************************************************
static inline void send_message(etl::imessage_router& destination,
const etl::imessage& message)
template <typename TRouter, typename TMessage>
static
typename etl::enable_if<etl::is_message_router<TRouter>::value && etl::is_message<TMessage>::value, void>::type
send_message(TRouter& destination,
const TMessage& message)
{
destination.receive(message);
}
@ -354,8 +365,11 @@ namespace etl
//***************************************************************************
/// Send a shared message to a router.
//***************************************************************************
static inline void send_message(etl::imessage_router& destination,
etl::shared_message message)
template <typename TRouter>
static
typename etl::enable_if<etl::is_message_router<TRouter>::value, void>::type
send_message(TRouter& destination,
etl::shared_message message)
{
destination.receive(message);
}
@ -363,9 +377,12 @@ namespace etl
//***************************************************************************
/// Send a message to a router with a particular id.
//***************************************************************************
static inline void send_message(etl::imessage_router& destination,
etl::message_router_id_t id,
const etl::imessage& message)
template <typename TRouter, typename TMessage>
static
typename etl::enable_if<etl::is_message_router<TRouter>::value && etl::is_message<TMessage>::value, void>::type
send_message(TRouter& destination,
etl::message_router_id_t id,
const TMessage& message)
{
destination.receive(id, message);
}
@ -373,9 +390,12 @@ namespace etl
//***************************************************************************
/// Send a shared message to a router with a particular id.
//***************************************************************************
static inline void send_message(etl::imessage_router& destination,
etl::message_router_id_t id,
etl::shared_message message)
template <typename TRouter>
static
typename etl::enable_if<etl::is_message_router<TRouter>::value, void>::type
send_message(TRouter& destination,
etl::message_router_id_t id,
etl::shared_message message)
{
destination.receive(id, message);
}