diff --git a/include/etl/generators/message_packet_generator.h b/include/etl/generators/message_packet_generator.h index d330df4d..5bd83747 100644 --- a/include/etl/generators/message_packet_generator.h +++ b/include/etl/generators/message_packet_generator.h @@ -90,63 +90,46 @@ namespace etl { } - //******************************************** - explicit message_packet(const etl::imessage& msg) - : data() - { - if (accepts(msg)) - { - add_new_message(msg); - valid = true; - } - else - { - valid = false; - } - - ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); - } - - //******************************************** - explicit message_packet(etl::imessage&& msg) - : data() - { - if (accepts(msg)) - { - add_new_message(etl::move(msg)); - valid = true; - } - else - { - valid = false; - } - - ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); - } - //******************************************** template , etl::message_packet> && - !etl::is_same_v, etl::imessage> && - !etl::is_one_of_v, TMessageTypes...>, int>> + !etl::is_same_v, etl::imessage> && + !etl::is_one_of_v, TMessageTypes...>, int>> explicit message_packet(TMessage&& msg) : data() , valid(true) { // Not etl::message_packet, not etl::imessage and in typelist. constexpr bool Enabled = (!etl::is_same_v, etl::message_packet> && - !etl::is_same_v, etl::imessage> && - etl::is_one_of_v, TMessageTypes...>); + !etl::is_same_v, etl::imessage> && + etl::is_one_of_v, TMessageTypes...>); ETL_STATIC_ASSERT(Enabled, "Message not in packet type list"); } //******************************************** - template , TMessageTypes...>, int>> - explicit message_packet(TMessage&& msg) + template + explicit message_packet(TMessage&& msg, etl::enable_if_t, etl::message_packet>, int*> p = nullptr) : data() , valid(true) { - add_new_message(etl::forward(msg)); + if constexpr (etl::is_same_v, etl::imessage>) + { + if (accepts(msg)) + { + add_new_message(etl::forward(msg)); + valid = true; + } + else + { + valid = false; + } + + ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); + } + else + { + add_new_message_type(etl::forward(msg)); + } } //********************************************** @@ -295,17 +278,19 @@ namespace etl } //******************************************** - template , TMessageTypes...>, int>> - void add_new_message(TMessage&& msg) + /// Only enabled for types that are in the typelist. + //******************************************** + template + etl::enable_if_t, TMessageTypes...>, void> + add_new_message_type(TMessage&& msg) { - (add_new_message_type::ID>(etl::forward(msg)) || ...); + void* p = data; + new (p) etl::remove_reference_t((etl::forward(msg))); } typename etl::aligned_storage::type data; bool valid; - private: - //******************************************** template bool add_new_message_type(const etl::imessage& msg) @@ -322,22 +307,6 @@ namespace etl } } - //******************************************** - template - bool add_new_message_type(const etl::imessage& msg) - { - if (TType::ID == Id) - { - void* p = data; - new (p) TType(static_cast(msg)); - return true; - } - else - { - return false; - } - } - //******************************************** template bool add_new_message_type(etl::imessage&& msg) @@ -353,22 +322,6 @@ namespace etl return false; } } - - //******************************************** - template - bool add_new_message_type(etl::imessage&& msg) - { - if (TType::ID == Id) - { - void* p = data; - new (p) TType(static_cast(msg)); - return true; - } - else - { - return false; - } - } }; #else diff --git a/include/etl/message_packet.h b/include/etl/message_packet.h index 6eeebef6..1b4b5ecf 100644 --- a/include/etl/message_packet.h +++ b/include/etl/message_packet.h @@ -78,40 +78,6 @@ namespace etl { } - //******************************************** - explicit message_packet(const etl::imessage& msg) - : data() - { - if (accepts(msg)) - { - add_new_message(msg); - valid = true; - } - else - { - valid = false; - } - - ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); - } - - //******************************************** - explicit message_packet(etl::imessage&& msg) - : data() - { - if (accepts(msg)) - { - add_new_message(etl::move(msg)); - valid = true; - } - else - { - valid = false; - } - - ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); - } - //******************************************** template , etl::message_packet> && !etl::is_same_v, etl::imessage> && @@ -129,12 +95,29 @@ namespace etl } //******************************************** - template , TMessageTypes...>, int>> - explicit message_packet(TMessage&& msg) + template + explicit message_packet(TMessage&& msg, etl::enable_if_t, etl::message_packet>, int*> p = nullptr) : data() , valid(true) { - add_new_message(etl::forward(msg)); + if constexpr(etl::is_same_v, etl::imessage>) + { + if (accepts(msg)) + { + add_new_message(etl::forward(msg)); + valid = true; + } + else + { + valid = false; + } + + ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception)); + } + else + { + add_new_message_type(etl::forward(msg)); + } } //********************************************** @@ -283,17 +266,19 @@ namespace etl } //******************************************** - template , TMessageTypes...>, int>> - void add_new_message(TMessage&& msg) + /// Only enabled for types that are in the typelist. + //******************************************** + template + etl::enable_if_t, TMessageTypes...>, void> + add_new_message_type(TMessage&& msg) { - (add_new_message_type::ID>(etl::forward(msg)) || ...); + void* p = data; + new (p) etl::remove_reference_t((etl::forward(msg))); } typename etl::aligned_storage::type data; bool valid; - private: - //******************************************** template bool add_new_message_type(const etl::imessage& msg) @@ -310,22 +295,6 @@ namespace etl } } - //******************************************** - template - bool add_new_message_type(const etl::imessage& msg) - { - if (TType::ID == Id) - { - void* p = data; - new (p) TType(static_cast(msg)); - return true; - } - else - { - return false; - } - } - //******************************************** template bool add_new_message_type(etl::imessage&& msg) @@ -341,22 +310,6 @@ namespace etl return false; } } - - //******************************************** - template - bool add_new_message_type(etl::imessage&& msg) - { - if (TType::ID == Id) - { - void* p = data; - new (p) TType(static_cast(msg)); - return true; - } - else - { - return false; - } - } }; #else diff --git a/test/test_message_packet.cpp b/test/test_message_packet.cpp index 413b7849..70876a5b 100644 --- a/test/test_message_packet.cpp +++ b/test/test_message_packet.cpp @@ -285,6 +285,29 @@ namespace CHECK_EQUAL("3", static_cast(packet3.get()).x); } + //************************************************************************* + TEST(message_packet_move_construction_from_base) + { + Message1 message1(1); + Message2 message2(2.2); + Message3 message3("3"); + Message4 message4; + + Packet packet1(static_cast(message1)); + Packet packet2(static_cast(message2)); + Packet packet3(static_cast(message3)); + + CHECK_THROW(Packet packet4(static_cast(message4)), etl::unhandled_message_exception); + + CHECK_EQUAL(MESSAGE1, packet1.get().get_message_id()); + CHECK_EQUAL(MESSAGE2, packet2.get().get_message_id()); + CHECK_EQUAL(MESSAGE3, packet3.get().get_message_id()); + + CHECK_EQUAL(1, static_cast(packet1.get()).x); + CHECK_EQUAL(2.2, static_cast(packet2.get()).x); + CHECK_EQUAL("3", static_cast(packet3.get()).x); + } + //************************************************************************* TEST(message_packet_copy_constructor) {