From a2b7eb5d5a20a88ba491c97917efe32e3d12870f Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 18 Feb 2024 12:08:11 +0000 Subject: [PATCH] Added specific copy and move constructors for C++17 and above. --- include/etl/message_packet.h | 30 +++++++++++++++++++++++++----- test/test_message_packet.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/include/etl/message_packet.h b/include/etl/message_packet.h index df4d6d29..80a56165 100644 --- a/include/etl/message_packet.h +++ b/include/etl/message_packet.h @@ -95,11 +95,35 @@ namespace etl } #include "private/diagnostic_pop.h" + //********************************************** +#include "private/diagnostic_uninitialized_push.h" + message_packet(const message_packet& other) + : valid(other.is_valid()) + { + if (valid) + { + add_new_message(other.get()); + } + } +#include "private/diagnostic_pop.h" + + //********************************************** +#include "private/diagnostic_uninitialized_push.h" + message_packet(message_packet&& other) + : valid(other.is_valid()) + { + if (valid) + { + add_new_message(etl::move(other.get())); + } + } +#include "private/diagnostic_pop.h" + //******************************************** /// //******************************************** #include "private/diagnostic_uninitialized_push.h" - template + template || IsInMessageList>::type> explicit message_packet(T&& msg) : valid(true) { @@ -121,10 +145,6 @@ namespace etl { add_new_message_type(etl::forward(msg)); } - else if constexpr (IsMessagePacket) - { - copy(etl::forward(msg)); - } else { ETL_STATIC_ASSERT(IsInMessageList, "Message not in packet type list"); diff --git a/test/test_message_packet.cpp b/test/test_message_packet.cpp index 6c7bda23..5589c0e2 100644 --- a/test/test_message_packet.cpp +++ b/test/test_message_packet.cpp @@ -194,6 +194,16 @@ namespace using Packet = etl::message_packet; + struct Object + { + void Push(const etl::message_packet& p) + { + ::new (buffer) etl::message_packet(p); + } + + char buffer[100]; + }; + SUITE(test_message_packet) { //************************************************************************* @@ -452,6 +462,22 @@ namespace CHECK(Packet::accepts()); CHECK(!Packet::accepts()); } + + //************************************************************************* + TEST(test_message_packet_push_to_queue_bug_845) + { + using Packet = etl::message_packet; + + Object obj; + + Message1 message1(1); + Message2 message2(1.2); + Packet packet1(message1); + Packet packet2(message2); + + obj.Push(packet1); + obj.Push(packet2); + } }; }