34#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
63#ifndef ETL_MESSAGE_ROUTER_INCLUDED
64#define ETL_MESSAGE_ROUTER_INCLUDED
69#include "message_packet.h"
70#include "message_types.h"
91 message_router_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
104 message_router_illegal_id(string_type file_name_, numeric_type line_number_)
105 : message_router_exception(ETL_ERROR_TEXT(
"message router:illegal id", ETL_MESSAGE_ROUTER_FILE_ID
"A"), file_name_, line_number_)
124 virtual ~imessage_router() {}
127 virtual bool is_null_router()
const = 0;
128 virtual bool is_producer()
const = 0;
129 virtual bool is_consumer()
const = 0;
132 virtual void receive(etl::message_router_id_t destination_router_id,
const etl::imessage&
message)
134 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
147 virtual void receive(etl::message_router_id_t destination_router_id,
etl::shared_message shared_msg)
149 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
158 return accepts(msg.get_message_id());
162 etl::message_router_id_t get_message_router_id()
const
164 return message_router_id;
169 NULL_MESSAGE_ROUTER = 255,
171 ALL_MESSAGE_ROUTERS = 253,
172 MESSAGE_BROKER = 252,
173 MESSAGE_ROUTER = 251,
174 MAX_MESSAGE_ROUTER = 249
179 imessage_router(etl::message_router_id_t id_)
180 : message_router_id(id_)
184 imessage_router(etl::message_router_id_t id_, imessage_router& successor_)
186 , message_router_id(id_)
193 imessage_router(
const imessage_router&);
194 imessage_router& operator =(
const imessage_router&);
196 etl::message_router_id_t message_router_id;
202 class null_message_router :
public imessage_router
207 null_message_router()
208 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
214 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
219 using etl::imessage_router::receive;
230 using etl::imessage_router::accepts;
245 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
251 bool is_producer()
const ETL_OVERRIDE
257 bool is_consumer()
const ETL_OVERRIDE
263 static null_message_router& instance()
265 static null_message_router nmr;
274 return etl::null_message_router::instance();
280 class message_producer :
public imessage_router
286 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
292 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
297 message_producer(etl::message_router_id_t id_)
298 : imessage_router(id_)
305 : imessage_router(id_, successor_)
311 using etl::imessage_router::receive;
322 using etl::imessage_router::accepts;
337 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
343 bool is_producer()
const ETL_OVERRIDE
349 bool is_consumer()
const ETL_OVERRIDE
358 template <
typename T>
366 template <
typename TRouter,
typename TMessage>
369 send_message(TRouter& destination,
378 template <
typename TRouter>
381 send_message(TRouter& destination,
384 destination.receive(message);
390 template <
typename TRouter,
typename TMessage>
392 typename etl::enable_if<etl::is_message_router<TRouter>::value && etl::is_message<TMessage>::value,
void>::type
393 send_message(TRouter& destination,
394 etl::message_router_id_t
id,
397 destination.receive(
id,
message);
403 template <
typename TRouter>
405 typename etl::enable_if<etl::is_message_router<TRouter>::value,
void>::type
406 send_message(TRouter& destination,
407 etl::message_router_id_t
id,
410 destination.receive(
id,
message);
416#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03_IMPLEMENTATION)
420 template <
typename TDerived,
typename... TMessageTypes>
425 typedef etl::message_packet<TMessageTypes...> message_packet;
429 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
434 message_router(etl::imessage_router& successor_)
435 : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)
440 message_router(etl::message_router_id_t id_)
441 : imessage_router(id_)
443 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
447 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
448 : imessage_router(id_, successor_)
450 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
454 using etl::imessage_router::receive;
456 void receive(
const etl::imessage& msg) ETL_OVERRIDE
458 const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
468 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
473 template <typename TMessage, typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value,
int>::type = 0>
474 void receive(
const TMessage& msg)
476 if constexpr (etl::is_one_of<TMessage, TMessageTypes...>::value)
478 static_cast<TDerived*
>(
this)->on_receive(msg);
488 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
494 using imessage_router::accepts;
498 return (accepts_type<TMessageTypes>(
id) || ...);
502 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
508 bool is_producer() const ETL_OVERRIDE
514 bool is_consumer() const ETL_OVERRIDE
522 template <
typename TMessage>
523 bool receive_message_type(
const etl::imessage& msg)
525 if (TMessage::ID == msg.get_message_id())
527 static_cast<TDerived*
>(
this)->on_receive(
static_cast<const TMessage&
>(msg));
537 template <
typename TMessage>
540 if (TMessage::ID ==
id)
This is the base of all message routers.
Definition message_router_generator.h:121
Base exception class for message router.
Definition message_router_generator.h:88
Router id is out of the legal range.
Definition message_router_generator.h:101
Definition message_router.h:558
Definition shared_message.h:49
ETL_NODISCARD etl::imessage & get_message()
Get a reference to the contained message.
Definition shared_message.h:189
Adds successor traits to a class.
Definition successor.h:73
bool has_successor() const
Definition successor.h:184
successor_type & get_successor() const
Definition successor.h:174
successor()
Definition successor.h:81
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
enable_if
Definition type_traits_generator.h:1254
bitset_ext
Definition absolute.h:39
etl::imessage_router & get_null_message_router()
null message router functionality.
Definition message_router_generator.h:272
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40
Definition type_traits_generator.h:912
Is T ultimately derived from etl::imessage_router?
Definition message_router_generator.h:360