46#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)
50 template <
typename... TMessageTypes>
56 static constexpr bool IsMessagePacket = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::message_packet<TMessageTypes...>>;
59 static constexpr bool IsInMessageList = etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<T>>, TMessageTypes...>;
62 static constexpr bool IsIMessage = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::imessage>;
66 using message_types = etl::type_list<TMessageTypes...>;
70 constexpr message_packet() noexcept
80 template <
typename T,
typename =
typename etl::enable_if< IsIMessage<T> || IsInMessageList<T>,
int>::type>
81 explicit message_packet(T&& msg)
84 if constexpr (IsIMessage<T>)
88 add_new_message(etl::forward<T>(msg));
98 else if constexpr (IsInMessageList<T>)
100 add_new_message_type<T>(etl::forward<T>(msg));
104 ETL_STATIC_ASSERT(IsInMessageList<T>,
"Message not in packet type list");
110 message_packet(
const message_packet& other)
112 valid = other.is_valid();
116 add_new_message(other.get());
122 message_packet(message_packet&& other)
124 valid = other.is_valid();
128 add_new_message(etl::move(other.get()));
134 void copy(
const message_packet& other)
136 valid = other.is_valid();
140 add_new_message(other.get());
145 void copy(message_packet&& other)
147 valid = other.is_valid();
151 add_new_message(etl::move(other.get()));
157 message_packet& operator=(
const message_packet& rhs)
159 delete_current_message();
160 valid = rhs.is_valid();
163 add_new_message(rhs.get());
172 message_packet& operator=(message_packet&& rhs)
174 delete_current_message();
175 valid = rhs.is_valid();
178 add_new_message(etl::move(rhs.get()));
188 delete_current_message();
204 bool is_valid()
const
212 return (accepts_message<TMessageTypes::ID>(
id) || ...);
218 return accepts(msg.get_message_id());
222 template <etl::message_
id_t Id>
223 static ETL_CONSTEXPR
bool accepts()
225 return (accepts_message<TMessageTypes::ID, Id>() || ...);
229 template <
typename TMessage>
230 static ETL_CONSTEXPR
typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value,
bool>
::type accepts()
232 return accepts<TMessage::ID>();
244 template <etl::message_
id_t Id1, etl::message_
id_t Id2>
245 static bool accepts_message()
251 template <etl::message_
id_t Id1>
259 void delete_current_message()
265 #if ETL_HAS_VIRTUAL_MESSAGES
268 delete_message(pmsg);
274 #if !ETL_HAS_VIRTUAL_MESSAGES
278 (delete_message_type<TMessageTypes>(pmsg) || ...);
282 template <
typename TType>
285 if (TType::ID == pmsg->get_message_id())
287 TType* p =
static_cast<TType*
>(pmsg);
301 (add_new_message_type<TMessageTypes>(msg) || ...);
307 (add_new_message_type<TMessageTypes>(etl::move(msg)) || ...);
314 template <
typename TMessage>
315 etl::enable_if_t< etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<TMessage>>, TMessageTypes...>,
void>
316 add_new_message_type(TMessage&& msg)
319 new (p) etl::remove_reference_t<TMessage>((etl::forward<TMessage>(msg)));
325 template <
typename TType>
328 if (TType::ID == msg.get_message_id())
331 new (p) TType(
static_cast<const TType&
>(msg));
343 template <
typename TType>
346 if (TType::ID == msg.get_message_id())
349 new (p) TType(
static_cast<TType&&
>(msg));
371 template <
typename T>
372 static constexpr bool IsMessagePacket = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::message_packet<>>;
374 template <
typename T>
375 static constexpr bool IsInMessageList =
false;
377 template <
typename T>
378 static constexpr bool IsIMessage = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::imessage>;
382 using message_types = etl::type_list<>;
386 constexpr message_packet()
noexcept {}
390 message_packet(
const message_packet& ) {}
394 message_packet(message_packet&& ) {}
398 void copy(
const message_packet& ) {}
401 void copy(message_packet&& ) {}
405 message_packet& operator=(
const message_packet& )
413 message_packet& operator=(message_packet&& )
423 bool is_valid()
const
441 template <etl::message_
id_t Id>
442 static ETL_CONSTEXPR
bool accepts()
448 template <
typename TMessage>
449 static ETL_CONSTEXPR
typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value,
bool>
::type accepts()
464 template <
typename TList>
465 struct message_packet_from_type_list;
467 template <
typename... TTypes>
468 struct message_packet_from_type_list<
etl::type_list<TTypes...>>
473 template <
typename TTypeList>
474 using message_packet_from_type_list_t =
typename message_packet_from_type_list<TTypeList>::type;
477 #include "private/message_packet_cpp03.h"