From 774384e316ea793a61c3b36149aa48af5fb132ea Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 10 Aug 2021 12:37:33 +0100 Subject: [PATCH] Fixes after merge --- include/etl/generators/largest_generator.h | 7 +- .../etl/generators/message_packet_generator.h | 292 ++++++++++++++++++ .../etl/generators/message_router_generator.h | 104 +++++++ include/etl/largest.h | 5 + include/etl/message_packet.h | 31 +- 5 files changed, 418 insertions(+), 21 deletions(-) diff --git a/include/etl/generators/largest_generator.h b/include/etl/generators/largest_generator.h index 0c3225a9..d748e2dd 100644 --- a/include/etl/generators/largest_generator.h +++ b/include/etl/generators/largest_generator.h @@ -396,11 +396,8 @@ namespace etl #endif #if ETL_CPP17_SUPPORTED - template - inline constexpr size_t largest_size_v = largest::size; - - template - inline constexpr size_t largest_alignment_v = largest::alignment; + template + inline constexpr size_t largest_size = largest::size; #endif #else diff --git a/include/etl/generators/message_packet_generator.h b/include/etl/generators/message_packet_generator.h index 523840f0..854a575e 100644 --- a/include/etl/generators/message_packet_generator.h +++ b/include/etl/generators/message_packet_generator.h @@ -74,6 +74,297 @@ cog.outl("//******************************************************************** namespace etl { +#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03) + //*************************************************************************** + // The definition for all message types. + //*************************************************************************** + template + class message_packet + { + public: + + //******************************************** + message_packet() + : valid(false) + { + } + + //******************************************** + explicit message_packet(const etl::imessage& msg) + : valid(true) + { + add_new_message(msg); + } + + //******************************************** + explicit message_packet(etl::imessage&& msg) + : valid(true) + { + add_new_message(etl::move(msg)); + } + + //******************************************** + template , etl::imessage> && + !etl::is_same_v, etl::message_packet>, int> = 0> + explicit message_packet(TMessage&& msg) + : valid(true) + { + add_new_message(etl::forward(msg)); + } + + //********************************************** + message_packet(const message_packet& other) + : valid(other.is_valid()) + { + if (valid) + { + add_new_message(other.get()); + } + } + + //********************************************** + message_packet(message_packet&& other) + : valid(other.is_valid()) + { + if (valid) + { + add_new_message(etl::move(other.get())); + } + } + + //********************************************** + message_packet& operator =(const message_packet& rhs) + { + delete_current_message(); + valid = rhs.is_valid(); + if (valid) + { + add_new_message(rhs.get()); + } + + return *this; + } + + //********************************************** + message_packet& operator =(message_packet&& rhs) + { + delete_current_message(); + valid = rhs.is_valid(); + if (valid) + { + add_new_message(etl::move(rhs.get())); + } + + return *this; + } + + //******************************************** + ~message_packet() + { + delete_current_message(); + } + + //******************************************** + etl::imessage& get() ETL_NOEXCEPT + { + return *static_cast(data); + } + + //******************************************** + const etl::imessage& get() const ETL_NOEXCEPT + { + return *static_cast(data); + } + + //******************************************** + bool is_valid() const + { + return valid; + } + + //********************************************** + static ETL_CONSTEXPR bool accepts(etl::message_id_t id) + { + return (accepts_message(id) || ...); + } + + //********************************************** + static ETL_CONSTEXPR bool accepts(const etl::imessage& msg) + { + return accepts(msg.get_message_id()); + } + + //********************************************** + template + static ETL_CONSTEXPR bool accepts() + { + return (accepts_message() || ...); + } + + //********************************************** + template + static ETL_CONSTEXPR + typename etl::enable_if::value, bool>::type + accepts() + { + return accepts(); + } + + enum + { + SIZE = etl::largest::size, + ALIGNMENT = etl::largest::alignment + }; + + private: + + //********************************************** + template + static ETL_CONSTEXPR bool accepts_message() + { + return Id1 == Id2; + } + + //********************************************** + template + static ETL_CONSTEXPR bool accepts_message(etl::message_id_t id2) + { + return Id1 == id2; + } + + //******************************************** + void delete_current_message() + { + if (valid) + { + etl::imessage* pmsg = static_cast(data); + +#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES) + pmsg->~imessage(); +#else + if (!(delete_current_message_type(pmsg->get_message_id()) || ...)) + { + ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception)); + } +#endif + } + } + + //******************************************** + void add_new_message(const etl::imessage& msg) + { + if (!(add_new_message_type(msg) || ...)) + { + ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception)); + } + } + + //******************************************** + void add_new_message(etl::imessage&& msg) + { + if (!(add_new_message_type(etl::move(msg)) || ...)) + { + ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception)); + } + } + + //******************************************** + template , etl::imessage>, int> = 0> + void add_new_message(TMessage&& msg) + { + if (!(add_new_message_type::ID>(etl::forward(msg)) || ...)) + { + ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception)); + } + } + + typename etl::aligned_storage::type data; + bool valid; + + private: + + //******************************************** + template + bool delete_current_message_type(etl::message_id_t Id) + { + if (TType::ID == Id) + { + static_cast(data)->~TType(); + return true; + } + else + { + return false; + } + } + + //******************************************** + template + bool add_new_message_type(const etl::imessage& msg) + { + if (TType::ID == msg.get_message_id()) + { + void* p = data; + new (p) TType(static_cast(msg)); + return true; + } + else + { + return false; + } + } + + //******************************************** + 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) + { + if (TType::ID == msg.get_message_id()) + { + void* p = data; + new (p) TType(static_cast(msg)); + return true; + } + else + { + 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 + /*[[[cog import cog ################################################ @@ -539,6 +830,7 @@ namespace etl cog.outl("};") ]]]*/ /*[[[end]]]*/ +#endif } #endif diff --git a/include/etl/generators/message_router_generator.h b/include/etl/generators/message_router_generator.h index eda0338f..082ce2eb 100644 --- a/include/etl/generators/message_router_generator.h +++ b/include/etl/generators/message_router_generator.h @@ -307,6 +307,109 @@ namespace etl destination.receive(message); } +#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03) + //*************************************************************************** + // The definition for all message types. + //*************************************************************************** + template + class message_router : public imessage_router + { + public: + + typedef etl::message_packet message_packet; + + //********************************************** + message_router(etl::message_router_id_t id_) + : imessage_router(id_) + { + ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id)); + } + + //********************************************** + message_router(etl::message_router_id_t id_, etl::imessage_router& successor_) + : imessage_router(id_, successor_) + { + ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id)); + } + + //********************************************** + using etl::imessage_router::receive; + + void receive(const etl::imessage& msg) ETL_OVERRIDE + { + const bool was_handled = (receive_message_type(msg) || ...); + + if (!was_handled) + { + if (has_successor()) + { + get_successor().receive(msg); + } + else + { + static_cast(this)->on_receive_unknown(msg); + } + } + } + + //********************************************** + using imessage_router::accepts; + + bool accepts(etl::message_id_t id) const ETL_OVERRIDE + { + return (accepts_type(id) || ...); + } + + //******************************************** + ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE + { + return false; + } + + //******************************************** + bool is_producer() const ETL_OVERRIDE + { + return true; + } + + //******************************************** + bool is_consumer() const ETL_OVERRIDE + { + return true; + } + + private: + + //******************************************** + template + bool receive_message_type(const etl::imessage& msg) + { + if (TMessage::ID == msg.get_message_id()) + { + static_cast(this)->on_receive(static_cast(msg)); + return true; + } + else + { + return false; + } + } + + //******************************************** + template + bool accepts_type(etl::message_id_t id) const + { + if (TMessage::ID == id) + { + return true; + } + else + { + return false; + } + } + }; +#else /*[[[cog import cog ################################################ @@ -536,6 +639,7 @@ namespace etl cog.outl("};") ]]]*/ /*[[[end]]]*/ +#endif } #endif diff --git a/include/etl/largest.h b/include/etl/largest.h index cb5f390b..210b4cee 100644 --- a/include/etl/largest.h +++ b/include/etl/largest.h @@ -347,6 +347,11 @@ namespace etl using largest_t = typename largest::type; #endif +#if ETL_CPP17_SUPPORTED + template + inline constexpr size_t largest_size = largest::size; +#endif + #else //*************************************************************************** /// Template to determine the largest type, size and alignment. diff --git a/include/etl/message_packet.h b/include/etl/message_packet.h index 9858dd24..fbdfc342 100644 --- a/include/etl/message_packet.h +++ b/include/etl/message_packet.h @@ -54,7 +54,6 @@ SOFTWARE. #include "message.h" #include "error_handler.h" #include "static_assert.h" -#include "exception.h" #include "largest.h" #include "alignment.h" #include "utility.h" @@ -94,8 +93,8 @@ namespace etl //******************************************** template , etl::imessage> && - !etl::is_same_v, etl::message_packet>, int> = 0> - explicit message_packet(TMessage&& msg) + !etl::is_same_v, etl::message_packet>, int> = 0> + explicit message_packet(TMessage&& msg) : valid(true) { add_new_message(etl::forward(msg)); @@ -201,7 +200,7 @@ namespace etl enum { - SIZE = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -285,8 +284,8 @@ namespace etl { return false; } - } - + } + //******************************************** template bool add_new_message_type(const etl::imessage& msg) @@ -498,7 +497,7 @@ namespace etl enum { - Size = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -598,7 +597,7 @@ namespace etl } #endif - typename etl::aligned_storage::type data; + typename etl::aligned_storage::type data; bool valid; }; @@ -746,7 +745,7 @@ namespace etl enum { - Size = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -843,7 +842,7 @@ namespace etl } #endif - typename etl::aligned_storage::type data; + typename etl::aligned_storage::type data; bool valid; }; @@ -991,7 +990,7 @@ namespace etl enum { - Size = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -1085,7 +1084,7 @@ namespace etl } #endif - typename etl::aligned_storage::type data; + typename etl::aligned_storage::type data; bool valid; }; @@ -1233,7 +1232,7 @@ namespace etl enum { - Size = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -1324,7 +1323,7 @@ namespace etl } #endif - typename etl::aligned_storage::type data; + typename etl::aligned_storage::type data; bool valid; }; @@ -1471,7 +1470,7 @@ namespace etl enum { - Size = etl::largest::size, + SIZE = etl::largest::size, ALIGNMENT = etl::largest::alignment }; @@ -1559,7 +1558,7 @@ namespace etl } #endif - typename etl::aligned_storage::type data; + typename etl::aligned_storage::type data; bool valid; };