361 bool is_null_router() const ETL_OVERRIDE
367 bool is_producer() const ETL_OVERRIDE
373 bool is_consumer() const ETL_OVERRIDE
382 template <
typename T>
390 template <
typename TRouter,
typename TMessage>
391 static typename etl::enable_if< etl::is_message_router<TRouter>::value && etl::is_message<TMessage>::value,
void>
::type
392 send_message(TRouter& destination,
const TMessage&
message)
400 template <
typename TRouter>
401 static typename etl::enable_if<etl::is_message_router<TRouter>::value,
void>
::type send_message(TRouter& destination,
etl::shared_message message)
403 destination.receive(message);
409 template <
typename TRouter,
typename TMessage>
410 static typename etl::enable_if< etl::is_message_router<TRouter>::value && etl::is_message<TMessage>::value,
void>::type
411 send_message(TRouter& destination, etl::message_router_id_t
id,
const TMessage&
message)
413 destination.receive(
id,
message);
419 template <
typename TRouter>
420 static typename etl::enable_if<etl::is_message_router<TRouter>::value,
void>::type send_message(TRouter& destination, etl::message_router_id_t
id,
423 destination.receive(
id,
message);
429#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03_IMPLEMENTATION)
433 template <
typename TDerived,
typename... TMessageTypes>
440 using typename private_message_router::traits<TMessageTypes...>::message_packet;
441 using typename private_message_router::traits<TMessageTypes...>::message_types;
442 using typename private_message_router::traits< TMessageTypes...>::sorted_message_types;
448 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
456 message_router(etl::imessage_router& successor_)
457 : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)
464 message_router(etl::message_router_id_t id_)
465 : imessage_router(id_)
467 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
473 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
474 : imessage_router(id_, successor_)
476 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
482 using etl::imessage_router::receive;
490 void receive(
const etl::imessage& msg) ETL_OVERRIDE
496 if (
id >= Message_Id_Start)
518 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
528 template <
typename TMessage,
typename etl::enable_if<etl::is_one_of<TMessage, TMessageTypes...>::value,
int>::type = 0>
529 void receive(
const TMessage& msg)
532 static_cast<TDerived*
>(
this)->on_receive(msg);
542 template <
typename TMessage,
543 typename etl::enable_if< etl::is_message<TMessage>::value && !etl::is_one_of<TMessage, TMessageTypes...>::value,
int>::type = 0>
544 void receive(
const TMessage& msg)
553 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
561 using imessage_router::accepts;
569 if (
id >= Message_Id_Start)
571 const size_t index = get_dispatch_index_from_message_id(
id);
573 if (index < Number_Of_Messages)
584 bool is_null_router() const ETL_OVERRIDE
590 bool is_producer() const ETL_OVERRIDE
596 bool is_consumer() const ETL_OVERRIDE
603 static constexpr size_t Number_Of_Messages =
sizeof...(TMessageTypes);
604 static constexpr etl::message_id_t Message_Id_Start = etl::type_list_type_at_index_t<sorted_message_types, 0>::ID;
609 template <
size_t Index,
bool Last = (Index + 1U >= Number_Of_Messages)>
610 struct contiguous_impl;
612 template <
size_t Index>
613 struct contiguous_impl<Index, true> : etl::true_type
617 template <
size_t Index>
618 struct contiguous_impl<Index, false>
619 : etl::bool_constant< (etl::type_list_type_at_index_t<sorted_message_types, Index>::ID + 1U
620 == etl::type_list_type_at_index_t<sorted_message_types, Index + 1U>::ID)
621 && contiguous_impl<Index + 1U>::value>
627 static constexpr bool Message_Ids_Are_Contiguous = (Number_Of_Messages <= 1U) ? true : contiguous_impl<0U>::value;
629 using handler_ptr = void (*)(TDerived&,
630 const etl::imessage&);
633 using message_dispatch_table_t = etl::array<handler_ptr,
645 template <
typename TMessage>
646 static void call_on_receive(TDerived& derived,
const imessage& msg)
648 derived.on_receive(
static_cast<const TMessage&
>(msg));
659 return &call_on_receive< etl::type_list_type_at_index_t<sorted_message_types, Index>>;
666 template <
size_t... Indices>
667 static constexpr message_dispatch_table_t make_message_dispatch_table(etl::index_sequence<Indices...>)
669 return message_dispatch_table_t{{get_message_handler<Indices>()...}};
677 template <
size_t Index>
680 return etl::type_list_type_at_index_t<sorted_message_types, Index>::ID;
687 template <
size_t... Indices>
688 static constexpr message_id_table_t make_message_id_table(etl::index_sequence<Indices...>)
690 return message_id_table_t{{get_message_id_from_index<Indices>()...}};
703 if ETL_IF_CONSTEXPR (Message_Ids_Are_Contiguous)
706 return static_cast<size_t>(
id - Message_Id_Start);
712 size_t right = Number_Of_Messages;
716 size_t mid = (left + right) / 2;
718 if (message_id_table[mid] ==
id)
722 else if (message_id_table[mid] <
id)
733 return Number_Of_Messages;
740 void dispatch(
const etl::imessage& msg,
size_t index)
742 message_dispatch_table[index](
static_cast<TDerived&
>(*this), msg);
749 static ETL_INLINE_VAR
constexpr message_dispatch_table_t message_dispatch_table =
750 etl::message_router<TDerived, TMessageTypes...>::make_message_dispatch_table(
751 etl::make_index_sequence< etl::message_router< TDerived, TMessageTypes...>::Number_Of_Messages>{});
757 static ETL_INLINE_VAR
constexpr message_id_table_t message_id_table = etl::message_router<TDerived, TMessageTypes...>::make_message_id_table(
758 etl::make_index_sequence< etl::message_router< TDerived, TMessageTypes...>::Number_Of_Messages>{});
761 #if ETL_USING_CPP11 && !ETL_USING_CPP17
762 template <
typename TDerived,
typename... TMessageTypes>
763 constexpr const typename etl::message_router< TDerived, TMessageTypes...>::message_dispatch_table_t
764 etl::message_router<TDerived, TMessageTypes...>::message_dispatch_table;
766 template <
typename TDerived,
typename... TMessageTypes>
767 constexpr const typename etl::message_router< TDerived, TMessageTypes...>::message_id_table_t
768 etl::message_router<TDerived, TMessageTypes...>::message_id_table;
774 template <
typename TDerived>
785 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
793 message_router(etl::imessage_router& successor_)
794 : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)
801 message_router(etl::message_router_id_t id_)
811 : imessage_router(id_, successor_)
818 using etl::imessage_router::receive;
839 using imessage_router::accepts;
858 bool is_null_router() const ETL_OVERRIDE
864 bool is_producer() const ETL_OVERRIDE
870 bool is_consumer() const ETL_OVERRIDE
880 template <
typename TDerived,
typename TList>
881 struct message_router_from_type_list;
883 template <
typename TDerived,
typename... TMessageTypes>
884 struct message_router_from_type_list<TDerived, etl::type_list<TMessageTypes...>>
886 using type = etl::message_router<TDerived, TMessageTypes...>;
889 template <
typename TDerived,
typename TTypeList>
890 using message_router_from_type_list_t =
typename message_router_from_type_list<TDerived, TTypeList>::type;
893 #include "private/message_router_cpp03.h"