34#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
63#ifndef ETL_MESSAGE_PACKET_INCLUDED
64#define ETL_MESSAGE_PACKET_INCLUDED
68#include "static_assert.h"
77#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)
81 template <
typename... TMessageTypes>
88 static constexpr bool IsMessagePacket = etl::is_same_v< etl::remove_const_t<etl::remove_reference_t<T>>,
etl::message_packet<TMessageTypes...>>;
91 static constexpr bool IsInMessageList = etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<T>>, TMessageTypes...>;
94 static constexpr bool IsIMessage = etl::is_same_v<remove_const_t<etl::remove_reference_t<T>>,
etl::imessage>;
110 template <
typename T>
111 explicit message_packet(T&& msg)
114 if constexpr (IsIMessage<T>)
118 add_new_message(etl::forward<T>(msg));
126 ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));
128 else if constexpr (IsInMessageList<T>)
130 add_new_message_type<T>(etl::forward<T>(msg));
132 else if constexpr (IsMessagePacket<T>)
134 copy(etl::forward<T>(msg));
138 ETL_STATIC_ASSERT(IsInMessageList<T>,
"Message not in packet type list");
144 void copy(
const message_packet& other)
146 valid = other.is_valid();
150 add_new_message(other.get());
155 void copy(message_packet&& other)
157 valid = other.is_valid();
161 add_new_message(etl::move(other.get()));
166 message_packet& operator =(
const message_packet& rhs)
168 delete_current_message();
169 valid = rhs.is_valid();
172 add_new_message(rhs.get());
179 message_packet& operator =(message_packet&& rhs)
181 delete_current_message();
182 valid = rhs.is_valid();
185 add_new_message(etl::move(rhs.get()));
194 delete_current_message();
210 bool is_valid()
const
218 return (accepts_message<TMessageTypes::ID>(
id) || ...);
224 return accepts(msg.get_message_id());
228 template <etl::message_
id_t Id>
229 static ETL_CONSTEXPR
bool accepts()
231 return (accepts_message<TMessageTypes::ID, Id>() || ...);
235 template <
typename TMessage>
240 return accepts<TMessage::ID>();
252 template <etl::message_
id_t Id1, etl::message_
id_t Id2>
253 static bool accepts_message()
259 template <etl::message_
id_t Id1>
267 void delete_current_message()
281 (add_new_message_type<TMessageTypes>(msg) || ...);
287 (add_new_message_type<TMessageTypes>(etl::move(msg)) || ...);
293 template <
typename TMessage>
294 etl::enable_if_t<etl::is_one_of_v<etl::remove_const_t<etl::remove_reference_t<TMessage>>, TMessageTypes...>,
void>
295 add_new_message_type(TMessage&& msg)
298 new (p) etl::remove_reference_t<TMessage>((etl::forward<TMessage>(msg)));
302 template <
typename TType>
305 if (TType::ID == msg.get_message_id())
308 new (p) TType(
static_cast<const TType&
>(msg));
318 template <
typename TType>
321 if (TType::ID == msg.get_message_id())
324 new (p) TType(
static_cast<TType&&
>(msg));
485 cog.outl(" : valid(
true)
")
487 generate_static_assert_cpp11(int(Handlers))
489 cog.outl("#include \
"etl/private/diagnostic_pop.h\"")
491 cog.outl(
" //********************************************")
492 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
493 cog.outl(
" template <typename TMessage>")
494 cog.out(
" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
495 for n in range(1,
int(Handlers)):
497 cog.outl(
"T%s> >::value &&" % int(Handlers))
498 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
499 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
500 for n in range(1, int(Handlers)):
502 cog.outl(
"T%s>::value, int>::type = 0)" % int(Handlers))
503 cog.outl(
" : valid(true)")
505 generate_static_assert_cpp03(int(Handlers))
507 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
510 cog.outl(
" //**********************************************")
511 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
512 cog.outl(
" message_packet(const message_packet& other)")
513 cog.outl(
" : valid(other.is_valid())")
515 cog.outl(
" if (valid)")
517 cog.outl(
" add_new_message(other.get());")
520 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
522 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
523 cog.outl(
" //**********************************************")
524 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
525 cog.outl(
" message_packet(message_packet&& other)")
526 cog.outl(
" : valid(other.is_valid())")
528 cog.outl(
" if (valid)")
530 cog.outl(
" add_new_message(etl::move(other.get()));")
533 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
536 cog.outl(
" //**********************************************")
537 cog.outl(
" message_packet& operator =(const message_packet& rhs)")
539 cog.outl(
" delete_current_message();")
540 cog.outl(
" valid = rhs.is_valid();")
541 cog.outl(
" if (valid)")
543 cog.outl(
" add_new_message(rhs.get());")
546 cog.outl(
" return *this;")
549 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
550 cog.outl(
" //**********************************************")
551 cog.outl(
" message_packet& operator =(message_packet&& rhs)")
553 cog.outl(
" delete_current_message();")
554 cog.outl(
" valid = rhs.is_valid();")
555 cog.outl(
" if (valid)")
557 cog.outl(
" add_new_message(etl::move(rhs.get()));")
560 cog.outl(
" return *this;")
564 cog.outl(
" //********************************************")
565 cog.outl(
" ~message_packet()")
567 cog.outl(
" delete_current_message();")
570 cog.outl(
" //********************************************")
571 cog.outl(
" etl::imessage& get() ETL_NOEXCEPT")
573 cog.outl(
" return *static_cast<etl::imessage*>(data);")
576 cog.outl(
" //********************************************")
577 cog.outl(
" const etl::imessage& get() const ETL_NOEXCEPT")
579 cog.outl(
" return *static_cast<const etl::imessage*>(data);")
582 cog.outl(
" //********************************************")
583 cog.outl(
" bool is_valid() const")
585 cog.outl(
" return valid;")
588 cog.outl(
" //**********************************************")
589 cog.outl(
" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
591 generate_accepts_return(int(Handlers))
594 cog.outl(
" //**********************************************")
595 cog.outl(
" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
597 cog.outl(
" return accepts(msg.get_message_id());")
600 cog.outl(
" //**********************************************")
601 cog.outl(
" template <etl::message_id_t Id>")
602 cog.outl(
" static ETL_CONSTEXPR bool accepts()")
604 generate_accepts_return_compile_time(int(Handlers))
607 cog.outl(
" //**********************************************")
608 cog.outl(
" template <typename TMessage>")
609 cog.outl(
" static ETL_CONSTEXPR")
610 cog.outl(
" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
611 cog.outl(
" accepts()")
613 generate_accepts_return_compile_time_TMessage(int(Handlers))
618 cog.out(
" SIZE = etl::largest<")
619 for n in range(1, int(Handlers)):
621 cog.outl(
"T%s>::size," % int(Handlers))
622 cog.out(
" ALIGNMENT = etl::largest<")
623 for n in range(1, int(Handlers)):
625 cog.outl(
"T%s>::alignment" % int(Handlers))
630 cog.outl(
" //********************************************")
631 cog.outl(
" #include \"etl/private/diagnostic_uninitialized_push.h\"")
632 cog.outl(
" void delete_current_message()")
634 cog.outl(
" if (valid)")
636 cog.outl(
" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
638 cog.outl(
" pmsg->~imessage();")
641 cog.outl(
" #include \"etl/private/diagnostic_pop.h\"")
643 cog.outl(
" //********************************************")
644 cog.outl(
" void add_new_message(const etl::imessage& msg)")
646 cog.outl(
" const size_t id = msg.get_message_id();")
647 cog.outl(
" void* p = data;")
649 cog.outl(
" switch (id)")
651 for n in range(1, int(Handlers) + 1):
652 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(n, n, n))
653 cog.outl(
" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
657 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
658 cog.outl(
" //********************************************")
659 cog.outl(
" void add_new_message(etl::imessage&& msg)")
661 cog.outl(
" const size_t id = msg.get_message_id();")
662 cog.outl(
" void* p = data;")
664 cog.outl(
" switch (id)")
666 for n in range(1, int(Handlers) + 1):
667 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(n, n, n))
668 cog.outl(
" default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;")
673 cog.outl(
" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
674 cog.outl(
" bool valid;")
677 ####################################
678 # All of the other specialisations.
679 ####################################
680 for n in range(int(Handlers) - 1, 0, -1):
682 cog.outl(
"//***************************************************************************")
684 cog.outl(
"// Specialisation for %d message type." % n)
686 cog.outl(
"// Specialisation for %d message types." % n)
687 cog.outl(
"//***************************************************************************")
688 cog.out(
"template <")
689 for t in range(1, n):
690 cog.out(
"typename T%s, " % t)
694 cog.outl(
"typename T%s>" % n)
695 cog.out(
"class message_packet<")
696 for t in range(1, n + 1):
701 for t in range(n + 1, int(Handlers)):
710 cog.outl(
" //********************************************")
711 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
712 cog.outl(
" message_packet()")
713 cog.outl(
" : valid(false)")
716 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
718 cog.outl(
" //********************************************")
719 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
720 cog.outl(
" explicit message_packet(const etl::imessage& msg)")
722 cog.outl(
" if (accepts(msg))")
724 cog.outl(
" add_new_message(msg);")
725 cog.outl(
" valid = true;")
729 cog.outl(
" valid = false;")
732 cog.outl(
" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
734 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
736 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
737 cog.outl(
" //********************************************")
738 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
739 cog.outl(
" explicit message_packet(etl::imessage&& msg)")
741 cog.outl(
" if (accepts(msg))")
743 cog.outl(
" add_new_message(etl::move(msg));")
744 cog.outl(
" valid = true;")
748 cog.outl(
" valid = false;")
751 cog.outl(
" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
753 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
756 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION) && !defined(ETL_COMPILER_GREEN_HILLS)")
757 cog.outl(
" //********************************************")
758 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
759 cog.out(
" template <typename TMessage, typename = typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
760 for t in range(1, n):
762 cog.outl(
"T%s> >::value &&" % n)
763 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
764 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
765 for t in range(1, n):
767 cog.outl(
"T%s>::value, int>::type>" % n)
768 cog.outl(
" explicit message_packet(TMessage&& /*msg*/)")
769 cog.outl(
" : valid(true)")
771 generate_static_assert_cpp11(n)
773 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
775 cog.outl(
" //********************************************")
776 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
777 cog.outl(
" template <typename TMessage>")
778 cog.out(
" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
779 for t in range(1, n):
781 cog.outl(
"T%s> >::value &&" % n)
782 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
783 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
784 for t in range(1, n):
786 cog.outl(
"T%s>::value, int>::type = 0)" % n)
787 cog.outl(
" : valid(true)")
789 generate_static_assert_cpp03(n)
791 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
794 cog.outl(
" //**********************************************")
795 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
796 cog.outl(
" message_packet(const message_packet& other)")
797 cog.outl(
" : valid(other.is_valid())")
799 cog.outl(
" if (valid)")
801 cog.outl(
" add_new_message(other.get());")
804 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
806 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
807 cog.outl(
" //**********************************************")
808 cog.outl(
"#include \"etl/private/diagnostic_uninitialized_push.h\"")
809 cog.outl(
" message_packet(message_packet&& other)")
810 cog.outl(
" : valid(other.is_valid())")
812 cog.outl(
" if (valid)")
814 cog.outl(
" add_new_message(etl::move(other.get()));")
817 cog.outl(
"#include \"etl/private/diagnostic_pop.h\"")
820 cog.outl(
" //**********************************************")
821 cog.outl(
" message_packet& operator =(const message_packet& rhs)")
823 cog.outl(
" delete_current_message();")
824 cog.outl(
" valid = rhs.is_valid();")
825 cog.outl(
" if (valid)")
827 cog.outl(
" add_new_message(rhs.get());")
830 cog.outl(
" return *this;")
833 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
834 cog.outl(
" //**********************************************")
835 cog.outl(
" message_packet& operator =(message_packet&& rhs)")
837 cog.outl(
" delete_current_message();")
838 cog.outl(
" valid = rhs.is_valid();")
839 cog.outl(
" if (valid)")
841 cog.outl(
" add_new_message(etl::move(rhs.get()));")
844 cog.outl(
" return *this;")
848 cog.outl(
" //********************************************")
849 cog.outl(
" ~message_packet()")
851 cog.outl(
" delete_current_message();")
854 cog.outl(
" //********************************************")
855 cog.outl(
" etl::imessage& get() ETL_NOEXCEPT")
857 cog.outl(
" return *static_cast<etl::imessage*>(data);")
860 cog.outl(
" //********************************************")
861 cog.outl(
" const etl::imessage& get() const ETL_NOEXCEPT")
863 cog.outl(
" return *static_cast<const etl::imessage*>(data);")
866 cog.outl(
" //********************************************")
867 cog.outl(
" bool is_valid() const")
869 cog.outl(
" return valid;")
872 cog.outl(
" //**********************************************")
873 cog.outl(
" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
875 generate_accepts_return(n)
878 cog.outl(
" //**********************************************")
879 cog.outl(
" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
881 cog.outl(
" return accepts(msg.get_message_id());")
884 cog.outl(
" //**********************************************")
885 cog.outl(
" template <etl::message_id_t Id>")
886 cog.outl(
" static ETL_CONSTEXPR bool accepts()")
888 generate_accepts_return_compile_time(n)
891 cog.outl(
" //**********************************************")
892 cog.outl(
" template <typename TMessage>")
893 cog.outl(
" static ETL_CONSTEXPR")
894 cog.outl(
" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
895 cog.outl(
" accepts()")
897 generate_accepts_return_compile_time_TMessage(n)
902 cog.out(
" SIZE = etl::largest<")
903 for t in range(1, n):
905 cog.outl(
"T%s>::size," % n)
906 cog.out(
" ALIGNMENT = etl::largest<")
907 for t in range(1, n):
909 cog.outl(
"T%s>::alignment" % n)
914 cog.outl(
" //********************************************")
915 cog.outl(
" #include \"etl/private/diagnostic_uninitialized_push.h\"")
916 cog.outl(
" void delete_current_message()")
918 cog.outl(
" if (valid)")
920 cog.outl(
" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
922 cog.outl(
" pmsg->~imessage();")
925 cog.outl(
" #include \"etl/private/diagnostic_pop.h\"")
927 cog.outl(
" //********************************************")
928 cog.outl(
" void add_new_message(const etl::imessage& msg)")
930 cog.outl(
" const size_t id = msg.get_message_id();")
931 cog.outl(
" void* p = data;")
933 cog.outl(
" switch (id)")
935 for t in range(1, n + 1):
936 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(t, t, t))
937 cog.outl(
" default: break;")
941 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
942 cog.outl(
" //********************************************")
943 cog.outl(
" void add_new_message(etl::imessage&& msg)")
945 cog.outl(
" const size_t id = msg.get_message_id();")
946 cog.outl(
" void* p = data;")
948 cog.outl(
" switch (id)")
950 for t in range(1, n + 1):
951 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(t, t, t))
952 cog.outl(
" default: break;")
957 cog.outl(
" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
958 cog.outl(
" bool valid;")
Definition: message_packet.h:335
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
Definition: largest.h:367
enable_if
Definition: type_traits_generator.h:1191
bitset_ext
Definition: absolute.h:38
uint_least8_t message_id_t
Allow alternative type for message id.
Definition: message_types.h:40
Definition: alignment.h:223