44#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)
48 template <
typename... TMessageTypes>
54 static constexpr bool IsMessagePacket = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::message_packet<TMessageTypes...>>;
57 static constexpr bool IsInMessageList = etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<T>>, TMessageTypes...>;
60 static constexpr bool IsIMessage = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::imessage>;
64 using message_types = etl::type_list<TMessageTypes...>;
68 constexpr message_packet() noexcept
78 template <
typename T,
typename =
typename etl::enable_if< IsIMessage<T> || IsInMessageList<T>,
int>::type>
79 explicit message_packet(T&& msg)
82 if constexpr (IsIMessage<T>)
86 add_new_message(etl::forward<T>(msg));
96 else if constexpr (IsInMessageList<T>)
98 add_new_message_type<T>(etl::forward<T>(msg));
102 ETL_STATIC_ASSERT(IsInMessageList<T>,
"Message not in packet type list");
108 message_packet(
const message_packet& other)
110 valid = other.is_valid();
114 add_new_message(other.get());
120 message_packet(message_packet&& other)
122 valid = other.is_valid();
126 add_new_message(etl::move(other.get()));
132 void copy(
const message_packet& other)
134 valid = other.is_valid();
138 add_new_message(other.get());
143 void copy(message_packet&& other)
145 valid = other.is_valid();
149 add_new_message(etl::move(other.get()));
155 message_packet& operator=(
const message_packet& rhs)
157 delete_current_message();
158 valid = rhs.is_valid();
161 add_new_message(rhs.get());
170 message_packet& operator=(message_packet&& rhs)
172 delete_current_message();
173 valid = rhs.is_valid();
176 add_new_message(etl::move(rhs.get()));
186 delete_current_message();
202 bool is_valid()
const
210 return (accepts_message<TMessageTypes::ID>(
id) || ...);
216 return accepts(msg.get_message_id());
220 template <etl::message_
id_t Id>
221 static ETL_CONSTEXPR
bool accepts()
223 return (accepts_message<TMessageTypes::ID, Id>() || ...);
227 template <
typename TMessage>
228 static ETL_CONSTEXPR
typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value,
bool>
::type accepts()
230 return accepts<TMessage::ID>();
242 template <etl::message_
id_t Id1, etl::message_
id_t Id2>
243 static bool accepts_message()
249 template <etl::message_
id_t Id1>
257 void delete_current_message()
263 #if ETL_HAS_VIRTUAL_MESSAGES
266 delete_message(pmsg);
272 #if !ETL_HAS_VIRTUAL_MESSAGES
276 (delete_message_type<TMessageTypes>(pmsg) || ...);
280 template <
typename TType>
283 if (TType::ID == pmsg->get_message_id())
285 TType* p =
static_cast<TType*
>(pmsg);
299 (add_new_message_type<TMessageTypes>(msg) || ...);
305 (add_new_message_type<TMessageTypes>(etl::move(msg)) || ...);
312 template <
typename TMessage>
313 etl::enable_if_t< etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<TMessage>>, TMessageTypes...>,
void>
314 add_new_message_type(TMessage&& msg)
317 new (p) etl::remove_reference_t<TMessage>((etl::forward<TMessage>(msg)));
323 template <
typename TType>
326 if (TType::ID == msg.get_message_id())
329 new (p) TType(
static_cast<const TType&
>(msg));
341 template <
typename TType>
344 if (TType::ID == msg.get_message_id())
347 new (p) TType(
static_cast<TType&&
>(msg));
369 template <
typename T>
370 static constexpr bool IsMessagePacket = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::message_packet<>>;
372 template <
typename T>
373 static constexpr bool IsInMessageList =
false;
375 template <
typename T>
376 static constexpr bool IsIMessage = etl::is_same_v<etl::remove_const_t<etl::remove_reference_t<T>>,
etl::imessage>;
380 using message_types = etl::type_list<>;
384 constexpr message_packet() noexcept {}
396 void copy(
const message_packet& ) {}
399 void copy(message_packet&& ) {}
403 message_packet& operator=(
const message_packet& )
411 message_packet& operator=(message_packet&& )
421 bool is_valid()
const
433 static ETL_CONSTEXPR
bool accepts(
const etl::imessage& )
439 template <etl::message_
id_t Id>
440 static ETL_CONSTEXPR
bool accepts()
446 template <
typename TMessage>
447 static ETL_CONSTEXPR
typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value,
bool>::type accepts()
462 template <
typename TList>
463 struct message_packet_from_type_list;
465 template <
typename... TTypes>
466 struct message_packet_from_type_list<etl::type_list<TTypes...>>
468 using type = etl::message_packet<TTypes...>;
471 template <
typename TTypeList>
472 using message_packet_from_type_list_t =
typename message_packet_from_type_list<TTypeList>::type;
475 #include "private/message_packet_cpp03.h"