mirror of
https://github.com/ETLCPP/etl.git
synced 2026-04-30 19:09:10 +08:00
Modified etl::message_packet to allow default construction, copy/move construction and copy/move assignment.
This commit is contained in:
parent
9b797f946a
commit
8171fe3784
File diff suppressed because it is too large
Load Diff
@ -68,6 +68,7 @@ cog.outl("//********************************************************************
|
||||
#include "static_assert.h"
|
||||
#include "largest.h"
|
||||
#include "alignment.h"
|
||||
#include "utility.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@ -97,52 +98,81 @@ namespace etl
|
||||
cog.outl("public:")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(const etl::imessage& msg)")
|
||||
cog.outl(" message_packet()")
|
||||
cog.outl(" : valid(false)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(const etl::imessage& msg)")
|
||||
cog.outl(" : valid(true)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(msg);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(etl::imessage&& msg)")
|
||||
cog.outl(" : valid(true)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(msg));")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet(const message_packet& other)")
|
||||
cog.outl(" : valid(other.is_valid())")
|
||||
cog.outl(" {")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
for n in range(1, int(Handlers) + 1):
|
||||
cog.out(" case T%d::ID:" %n)
|
||||
cog.out(" ::new (p) T%d(static_cast<const T%d&>(msg));" % (n, n))
|
||||
cog.outl(" break;")
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" add_new_message(other.get());")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" template <typename T>")
|
||||
cog.outl(" explicit message_packet(const T& msg)")
|
||||
cog.outl(" message_packet(message_packet&& other)")
|
||||
cog.outl(" : valid(other.is_valid())")
|
||||
cog.outl(" {")
|
||||
cog.out(" ETL_STATIC_ASSERT((etl::is_one_of<T, ")
|
||||
for n in range(1, int(Handlers)):
|
||||
cog.out("T%d, " % n)
|
||||
cog.outl("T%s>::value), \"Unsupported type for this message packet\");" % int(Handlers))
|
||||
cog.outl("")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl(" ::new (p) T(static_cast<const T&>(msg));")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(other.get()));")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet& operator =(const message_packet& rhs)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" valid = rhs.is_valid();")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(rhs.get());")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" return *this;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet& operator =(message_packet&& rhs)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" valid = rhs.is_valid();")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(rhs.get()));")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" return *this;")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" ~message_packet()")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
|
||||
cog.outl("")
|
||||
cog.outl("#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)")
|
||||
cog.outl(" pmsg->~imessage();")
|
||||
cog.outl("#else")
|
||||
cog.outl(" size_t id = pmsg->message_id;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for n in range(1, int(Handlers) + 1):
|
||||
cog.outl(" case T%s::ID: static_cast<T%s*>(pmsg)->~T%s(); break;" % (n, n, n))
|
||||
cog.outl(" default: assert(false); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
@ -157,6 +187,12 @@ namespace etl
|
||||
cog.outl(" return *static_cast<const etl::imessage*>(data);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" bool is_valid() const")
|
||||
cog.outl(" {")
|
||||
cog.outl(" return valid;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" enum")
|
||||
cog.outl(" {")
|
||||
cog.out(" SIZE = etl::largest<")
|
||||
@ -171,14 +207,60 @@ namespace etl
|
||||
cog.outl("")
|
||||
cog.outl("private:")
|
||||
cog.outl("")
|
||||
cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void delete_current_message()")
|
||||
cog.outl(" {")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
|
||||
cog.outl("")
|
||||
cog.outl("#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)")
|
||||
cog.outl(" pmsg->~imessage();")
|
||||
cog.outl("#else")
|
||||
cog.outl(" size_t id = pmsg->message_id;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for n in range(1, int(Handlers) + 1):
|
||||
cog.outl(" case T%s::ID: static_cast<T%s*>(pmsg)->~T%s(); break;" % (n, n, n))
|
||||
cog.outl(" default: assert(false); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" #endif")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void add_new_message(const etl::imessage& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for n in range(1, int(Handlers) + 1):
|
||||
cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(n, n, n))
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" message_packet(const message_packet&) ETL_DELETE;")
|
||||
cog.outl(" message_packet& operator =(const message_packet&) ETL_DELETE;")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" message_packet(message_packet&&) ETL_DELETE;")
|
||||
cog.outl(" message_packet& operator =(message_packet&&) ETL_DELETE;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void add_new_message(etl::imessage&& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for n in range(1, int(Handlers) + 1):
|
||||
cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(n, n, n))
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
|
||||
cog.outl(" bool valid;")
|
||||
cog.outl("};")
|
||||
|
||||
####################################
|
||||
@ -215,54 +297,81 @@ namespace etl
|
||||
cog.outl("public:")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(const etl::imessage& msg)")
|
||||
cog.outl(" message_packet()")
|
||||
cog.outl(" : valid(false)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(const etl::imessage& msg)")
|
||||
cog.outl(" : valid(true)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(msg);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" explicit message_packet(etl::imessage&& msg)")
|
||||
cog.outl(" : valid(true)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(msg));")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet(const message_packet& other)")
|
||||
cog.outl(" : valid(other.is_valid())")
|
||||
cog.outl(" {")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
for t in range(1, n + 1):
|
||||
cog.out(" case T%d::ID:" %t)
|
||||
cog.out(" ::new (p) T%d(static_cast<const T%d&>(msg));" % (t, t))
|
||||
cog.outl(" break;")
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" add_new_message(other.get());")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" template <typename T>")
|
||||
cog.outl(" explicit message_packet(const T& msg)")
|
||||
cog.outl(" message_packet(message_packet&& other)")
|
||||
cog.outl(" : valid(other.is_valid())")
|
||||
cog.outl(" {")
|
||||
cog.out(" ETL_STATIC_ASSERT((etl::is_one_of<T, ")
|
||||
for t in range(1, n):
|
||||
cog.out("T%d, " % t)
|
||||
cog.outl("T%s>::value), \"Unsupported type for this message packet\");" % n)
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(other.get()));")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl(" ::new (p) T(static_cast<const T&>(msg));")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet& operator =(const message_packet& rhs)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" valid = rhs.is_valid();")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(rhs.get());")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" return *this;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_packet& operator =(message_packet&& rhs)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" valid = rhs.is_valid();")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" add_new_message(etl::move(rhs.get()));")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" return *this;")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" ~message_packet()")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
|
||||
cog.outl("")
|
||||
cog.outl("#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)")
|
||||
cog.outl(" pmsg->~imessage();")
|
||||
cog.outl("#else")
|
||||
cog.outl(" size_t id = pmsg->message_id;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for t in range(1, n + 1):
|
||||
cog.outl(" case T%s::ID: static_cast<T%s*>(pmsg)->~T%s(); break;" % (t, t, t))
|
||||
cog.outl(" default: assert(false); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl(" delete_current_message();")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
@ -277,6 +386,12 @@ namespace etl
|
||||
cog.outl(" return *static_cast<const etl::imessage*>(data);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" bool is_valid() const")
|
||||
cog.outl(" {")
|
||||
cog.outl(" return valid;")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" enum")
|
||||
cog.outl(" {")
|
||||
cog.out(" SIZE = etl::largest<")
|
||||
@ -291,14 +406,60 @@ namespace etl
|
||||
cog.outl("")
|
||||
cog.outl("private:")
|
||||
cog.outl("")
|
||||
cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void delete_current_message()")
|
||||
cog.outl(" {")
|
||||
cog.outl(" if (valid)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
|
||||
cog.outl("")
|
||||
cog.outl("#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)")
|
||||
cog.outl(" pmsg->~imessage();")
|
||||
cog.outl("#else")
|
||||
cog.outl(" size_t id = pmsg->message_id;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for t in range(1, n + 1):
|
||||
cog.outl(" case T%s::ID: static_cast<T%s*>(pmsg)->~T%s(); break;" % (t, t, t))
|
||||
cog.outl(" default: assert(false); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" #endif")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void add_new_message(const etl::imessage& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for t in range(1, n + 1):
|
||||
cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(t, t, t))
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" message_packet(const message_packet&) ETL_DELETE;")
|
||||
cog.outl(" message_packet& operator =(const message_packet&) ETL_DELETE;")
|
||||
cog.outl("#if ETL_CPP11_SUPPORTED")
|
||||
cog.outl(" message_packet(message_packet&&) ETL_DELETE;")
|
||||
cog.outl(" message_packet& operator =(message_packet&&) ETL_DELETE;")
|
||||
cog.outl(" //********************************************")
|
||||
cog.outl(" void add_new_message(etl::imessage&& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" const size_t id = msg.message_id;")
|
||||
cog.outl(" void* p = data;")
|
||||
cog.outl("")
|
||||
cog.outl(" switch (id)")
|
||||
cog.outl(" {")
|
||||
for t in range(1, n + 1):
|
||||
cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(t, t, t))
|
||||
cog.outl(" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
|
||||
cog.outl(" }")
|
||||
cog.outl(" }")
|
||||
cog.outl("#endif")
|
||||
cog.outl("")
|
||||
cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
|
||||
cog.outl(" bool valid;")
|
||||
cog.outl("};")
|
||||
]]]*/
|
||||
/*[[[end]]]*/
|
||||
|
||||
@ -38,8 +38,8 @@ SOFTWARE.
|
||||
///\ingroup utilities
|
||||
|
||||
#define ETL_VERSION_MAJOR 17
|
||||
#define ETL_VERSION_MINOR 4
|
||||
#define ETL_VERSION_PATCH 3
|
||||
#define ETL_VERSION_MINOR 5
|
||||
#define ETL_VERSION_PATCH 0
|
||||
#define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) "." ETL_STRINGIFY(ETL_VERSION_MINOR) "." ETL_STRINGIFY(ETL_VERSION_PATCH)
|
||||
#define ETL_VERSION_W ETL_STRINGIFY(ETL_VERSION_MAJOR) L"." ETL_STRINGIFY(ETL_VERSION_MINOR) L"." ETL_STRINGIFY(ETL_VERSION_PATCH)
|
||||
#define ETL_VERSION_U16 ETL_STRINGIFY(ETL_VERSION_MAJOR) u"." ETL_STRINGIFY(ETL_VERSION_MINOR) u"." ETL_STRINGIFY(ETL_VERSION_PATCH)
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Embedded Template Library",
|
||||
"version": "17.4.3",
|
||||
"version": "17.5.0",
|
||||
"authors": {
|
||||
"name": "John Wellbelove",
|
||||
"email": "john.wellbelove@etlcpp.com"
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
name=Embedded Template Library
|
||||
version=17.4.3
|
||||
version=17.5.0
|
||||
author= John Wellbelove <john.wellbelove@etlcpp.com>
|
||||
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
|
||||
license=MIT
|
||||
|
||||
@ -1,3 +1,8 @@
|
||||
===============================================================================
|
||||
17.5.0
|
||||
Modified etl::message_packet to allow default construction, copy/move construction
|
||||
and copy/move assignment.
|
||||
|
||||
===============================================================================
|
||||
17.4.3
|
||||
Changed local 'work' variables from uint_least8_t to uint32_t to avoid possible overflow.
|
||||
|
||||
@ -50,30 +50,126 @@ namespace
|
||||
{
|
||||
Message1(int x_)
|
||||
: x(x_)
|
||||
, moved(false)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message1(const Message1& other)
|
||||
: x(other.x)
|
||||
, moved(false)
|
||||
, copied(true)
|
||||
{
|
||||
}
|
||||
|
||||
Message1(Message1&& other)
|
||||
: x(other.x)
|
||||
, moved(true)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message1& operator =(const Message1& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = false;
|
||||
copied = true;
|
||||
}
|
||||
|
||||
Message1& operator =(Message1&& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = true;
|
||||
copied = false;
|
||||
}
|
||||
|
||||
int x;
|
||||
bool moved;
|
||||
bool copied;
|
||||
};
|
||||
|
||||
struct Message2 : public etl::message<MESSAGE2>
|
||||
{
|
||||
Message2(double x_)
|
||||
: x(x_)
|
||||
, moved(false)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message2(const Message2& other)
|
||||
: x(other.x)
|
||||
, moved(false)
|
||||
, copied(true)
|
||||
{
|
||||
}
|
||||
|
||||
Message2(Message2&& other)
|
||||
: x(other.x)
|
||||
, moved(true)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message2& operator =(const Message2& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = false;
|
||||
copied = true;
|
||||
}
|
||||
|
||||
Message2& operator =(Message2&& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = true;
|
||||
copied = false;
|
||||
}
|
||||
|
||||
double x;
|
||||
bool moved;
|
||||
bool copied;
|
||||
};
|
||||
|
||||
struct Message3 : public etl::message<MESSAGE3>
|
||||
{
|
||||
Message3(std::string x_)
|
||||
: x(x_)
|
||||
, moved(false)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message3(const Message3& other)
|
||||
: x(other.x)
|
||||
, moved(false)
|
||||
, copied(true)
|
||||
{
|
||||
}
|
||||
|
||||
Message3(Message3&& other)
|
||||
: x(other.x)
|
||||
, moved(true)
|
||||
, copied(false)
|
||||
{
|
||||
}
|
||||
|
||||
Message3& operator =(const Message3& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = false;
|
||||
copied = true;
|
||||
}
|
||||
|
||||
Message3& operator =(Message3&& other)
|
||||
{
|
||||
x = other.x;
|
||||
moved = true;
|
||||
copied = false;
|
||||
}
|
||||
|
||||
std::string x;
|
||||
bool moved;
|
||||
bool copied;
|
||||
};
|
||||
|
||||
struct Message4 : public etl::message<MESSAGE4>
|
||||
@ -103,11 +199,41 @@ namespace
|
||||
CHECK_EQUAL(MESSAGE2, packet2.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE3, packet3.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(!static_cast<Message2&>(packet2.get()).moved);
|
||||
CHECK(!static_cast<Message3&>(packet3.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(static_cast<Message2&>(packet2.get()).copied);
|
||||
CHECK(static_cast<Message3&>(packet3.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(2.2, static_cast<Message2&>(packet2.get()).x);
|
||||
CHECK_EQUAL("3", static_cast<Message3&>(packet3.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_packet_move_construction)
|
||||
{
|
||||
Message1 message1(1);
|
||||
Message2 message2(2.2);
|
||||
|
||||
Packet packet1(message1);
|
||||
Packet packet2(std::move(message2));
|
||||
|
||||
CHECK_EQUAL(MESSAGE1, packet1.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE2, packet2.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(static_cast<Message2&>(packet2.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(!static_cast<Message2&>(packet2.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(2.2, static_cast<Message2&>(packet2.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_constant_packet_construction)
|
||||
{
|
||||
@ -154,5 +280,97 @@ namespace
|
||||
CHECK_EQUAL(2.2, static_cast<Message2&>(packet2.get()).x);
|
||||
CHECK_EQUAL("3", static_cast<Message3&>(packet3.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_packet_copy_consructor)
|
||||
{
|
||||
Message1 message1(1);
|
||||
Message2 message2(2.2);
|
||||
|
||||
Packet packet1(message1);
|
||||
Packet packet2(packet1);
|
||||
|
||||
CHECK_EQUAL(MESSAGE1, packet1.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE1, packet2.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(!static_cast<Message1&>(packet2.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(static_cast<Message1&>(packet2.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet2.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_packet_move_consructor)
|
||||
{
|
||||
Message1 message1(1);
|
||||
Message2 message2(2.2);
|
||||
|
||||
Packet packet1(message1);
|
||||
Packet packet2(std::move(Packet(message1)));
|
||||
|
||||
CHECK_EQUAL(MESSAGE1, packet1.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE1, packet2.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(static_cast<Message1&>(packet2.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(!static_cast<Message1&>(packet2.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet2.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_packet_assignment)
|
||||
{
|
||||
Message1 message1(1);
|
||||
Message2 message2(2.2);
|
||||
|
||||
Packet packet1(message1);
|
||||
Packet packet2;
|
||||
|
||||
packet2 = packet1;
|
||||
|
||||
CHECK_EQUAL(MESSAGE1, packet1.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE1, packet2.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(!static_cast<Message1&>(packet2.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(static_cast<Message1&>(packet2.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet2.get()).x);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST(message_packet_move_assignment)
|
||||
{
|
||||
Message1 message1(1);
|
||||
Message2 message2(2.2);
|
||||
|
||||
Packet packet1(message1);
|
||||
Packet packet2;
|
||||
|
||||
packet2 = std::move(packet1);
|
||||
|
||||
CHECK_EQUAL(MESSAGE1, packet1.get().message_id);
|
||||
CHECK_EQUAL(MESSAGE1, packet2.get().message_id);
|
||||
|
||||
CHECK(!static_cast<Message1&>(packet1.get()).moved);
|
||||
CHECK(static_cast<Message1&>(packet2.get()).moved);
|
||||
|
||||
CHECK(static_cast<Message1&>(packet1.get()).copied);
|
||||
CHECK(!static_cast<Message1&>(packet2.get()).copied);
|
||||
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet1.get()).x);
|
||||
CHECK_EQUAL(1, static_cast<Message1&>(packet2.get()).x);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user