187 cog.outl(" : valid(true)
")
189 generate_static_assert_cpp11(int(Handlers))
191 cog.outl("#include \
"diagnostic_pop.h\"")
193 cog.outl(
" //********************************************")
194 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
195 cog.outl(
" template <typename TMessage>")
196 cog.out(
" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
197 for n in range(1,
int(Handlers)):
199 cog.outl(
"T%s> >::value &&" % int(Handlers))
200 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
201 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
202 for n in range(1, int(Handlers)):
204 cog.outl(
"T%s>::value, int>::type = 0)" % int(Handlers))
205 cog.outl(
" : valid(true)")
207 generate_static_assert_cpp03(int(Handlers))
209 cog.outl(
"#include \"diagnostic_pop.h\"")
212 cog.outl(
" //**********************************************")
213 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
214 cog.outl(
" message_packet(const message_packet& other)")
215 cog.outl(
" : valid(other.is_valid())")
217 cog.outl(
" if (valid)")
219 cog.outl(
" add_new_message(other.get());")
222 cog.outl(
"#include \"diagnostic_pop.h\"")
224 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
225 cog.outl(
" //**********************************************")
226 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
227 cog.outl(
" message_packet(message_packet&& other)")
228 cog.outl(
" : valid(other.is_valid())")
230 cog.outl(
" if (valid)")
232 cog.outl(
" add_new_message(etl::move(other.get()));")
235 cog.outl(
"#include \"diagnostic_pop.h\"")
238 cog.outl(
" //**********************************************")
239 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
240 cog.outl(
" message_packet& operator =(const message_packet& rhs)")
242 cog.outl(
" delete_current_message();")
243 cog.outl(
" valid = rhs.is_valid();")
244 cog.outl(
" if (valid)")
246 cog.outl(
" add_new_message(rhs.get());")
249 cog.outl(
" return *this;")
251 cog.outl(
"#include \"diagnostic_pop.h\"")
253 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
254 cog.outl(
" //**********************************************")
255 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
256 cog.outl(
" message_packet& operator =(message_packet&& rhs)")
258 cog.outl(
" delete_current_message();")
259 cog.outl(
" valid = rhs.is_valid();")
260 cog.outl(
" if (valid)")
262 cog.outl(
" add_new_message(etl::move(rhs.get()));")
265 cog.outl(
" return *this;")
267 cog.outl(
"#include \"diagnostic_pop.h\"")
270 cog.outl(
" //********************************************")
271 cog.outl(
" ~message_packet()")
273 cog.outl(
" delete_current_message();")
276 cog.outl(
" //********************************************")
277 cog.outl(
" etl::imessage& get() ETL_NOEXCEPT")
279 cog.outl(
" return *static_cast<etl::imessage*>(data);")
282 cog.outl(
" //********************************************")
283 cog.outl(
" const etl::imessage& get() const ETL_NOEXCEPT")
285 cog.outl(
" return *static_cast<const etl::imessage*>(data);")
288 cog.outl(
" //********************************************")
289 cog.outl(
" bool is_valid() const")
291 cog.outl(
" return valid;")
294 cog.outl(
" //**********************************************")
295 cog.outl(
" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
297 generate_accepts_return(int(Handlers))
300 cog.outl(
" //**********************************************")
301 cog.outl(
" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
303 cog.outl(
" return accepts(msg.get_message_id());")
306 cog.outl(
" //**********************************************")
307 cog.outl(
" template <etl::message_id_t Id>")
308 cog.outl(
" static ETL_CONSTEXPR bool accepts()")
310 generate_accepts_return_compile_time(int(Handlers))
313 cog.outl(
" //**********************************************")
314 cog.outl(
" template <typename TMessage>")
315 cog.outl(
" static ETL_CONSTEXPR")
316 cog.outl(
" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
317 cog.outl(
" accepts()")
319 generate_accepts_return_compile_time_TMessage(int(Handlers))
324 cog.out(
" SIZE = etl::largest<")
325 for n in range(1, int(Handlers)):
327 cog.outl(
"T%s>::size," % int(Handlers))
328 cog.out(
" ALIGNMENT = etl::largest<")
329 for n in range(1, int(Handlers)):
331 cog.outl(
"T%s>::alignment" % int(Handlers))
336 cog.outl(
" //********************************************")
337 cog.outl(
" #include \"diagnostic_uninitialized_push.h\"")
338 cog.outl(
" void delete_current_message()")
340 cog.outl(
" if (valid)")
342 cog.outl(
" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
344 cog.outl(
"#if ETL_HAS_VIRTUAL_MESSAGES")
345 cog.outl(
" pmsg->~imessage();")
347 cog.outl(
" delete_message(pmsg);")
351 cog.outl(
" #include \"diagnostic_pop.h\"")
353 cog.outl(
" //********************************************")
354 cog.outl(
" void delete_message(etl::imessage* pmsg)")
356 cog.outl(
" switch (pmsg->get_message_id())")
358 for n in range(1, int(Handlers) + 1):
359 cog.out(
" case T%d::ID: static_cast<const T%d" %(n, n))
360 cog.outl(
"*>(pmsg)->~T%d(); break;" % n)
361 cog.outl(
" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
365 cog.outl(
" //********************************************")
366 cog.outl(
" void add_new_message(const etl::imessage& msg)")
368 cog.outl(
" const size_t id = msg.get_message_id();")
369 cog.outl(
" void* p = data;")
371 cog.outl(
" switch (id)")
373 for n in range(1, int(Handlers) + 1):
374 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(n, n, n))
375 cog.outl(
" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
379 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
380 cog.outl(
" //********************************************")
381 cog.outl(
" void add_new_message(etl::imessage&& msg)")
383 cog.outl(
" const size_t id = msg.get_message_id();")
384 cog.outl(
" void* p = data;")
386 cog.outl(
" switch (id)")
388 for n in range(1, int(Handlers) + 1):
389 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(n, n, n))
390 cog.outl(
" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
395 cog.outl(
" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
396 cog.outl(
" bool valid;")
399 ####################################
400 # All of the other specialisations.
401 ####################################
402 for n in range(int(Handlers) - 1, 0, -1):
404 cog.outl(
"//***************************************************************************")
406 cog.outl(
"// Specialisation for %d message type." % n)
408 cog.outl(
"// Specialisation for %d message types." % n)
409 cog.outl(
"//***************************************************************************")
410 cog.out(
"template <")
411 for t in range(1, n):
412 cog.out(
"typename T%s, " % t)
416 cog.outl(
"typename T%s>" % n)
417 cog.out(
"class message_packet<")
418 for t in range(1, n + 1):
423 for t in range(n + 1, int(Handlers)):
433 cog.out(
"#if ETL_USING_CPP11")
435 cog.out(
" using message_types = etl::type_list<")
436 for t in range(1, int(n)):
438 cog.outl(
"T%s>;" % int(n))
442 cog.outl(
" //********************************************")
443 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
444 cog.outl(
" ETL_CONSTEXPR message_packet() ETL_NOEXCEPT")
445 cog.outl(
" : valid(false)")
448 cog.outl(
"#include \"diagnostic_pop.h\"")
450 cog.outl(
" //********************************************")
451 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
452 cog.outl(
" explicit message_packet(const etl::imessage& msg)")
454 cog.outl(
" if (accepts(msg))")
456 cog.outl(
" add_new_message(msg);")
457 cog.outl(
" valid = true;")
461 cog.outl(
" valid = false;")
464 cog.outl(
" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
466 cog.outl(
"#include \"diagnostic_pop.h\"")
468 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
469 cog.outl(
" //********************************************")
470 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
471 cog.outl(
" explicit message_packet(etl::imessage&& msg)")
473 cog.outl(
" if (accepts(msg))")
475 cog.outl(
" add_new_message(etl::move(msg));")
476 cog.outl(
" valid = true;")
480 cog.outl(
" valid = false;")
483 cog.outl(
" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
485 cog.outl(
"#include \"diagnostic_pop.h\"")
488 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION) && !defined(ETL_COMPILER_GREEN_HILLS)")
489 cog.outl(
" //********************************************")
490 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
491 cog.out(
" template <typename TMessage, typename = typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
492 for t in range(1, n):
494 cog.outl(
"T%s> >::value &&" % n)
495 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
496 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
497 for t in range(1, n):
499 cog.outl(
"T%s>::value, int>::type>" % n)
500 cog.outl(
" explicit message_packet(TMessage&& /*msg*/)")
501 cog.outl(
" : valid(true)")
503 generate_static_assert_cpp11(n)
505 cog.outl(
"#include \"diagnostic_pop.h\"")
507 cog.outl(
" //********************************************")
508 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
509 cog.outl(
" template <typename TMessage>")
510 cog.out(
" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
511 for t in range(1, n):
513 cog.outl(
"T%s> >::value &&" % n)
514 cog.outl(
" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
515 cog.out(
" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
516 for t in range(1, n):
518 cog.outl(
"T%s>::value, int>::type = 0)" % n)
519 cog.outl(
" : valid(true)")
521 generate_static_assert_cpp03(n)
523 cog.outl(
"#include \"diagnostic_pop.h\"")
526 cog.outl(
" //**********************************************")
527 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
528 cog.outl(
" message_packet(const message_packet& other)")
529 cog.outl(
" : valid(other.is_valid())")
531 cog.outl(
" if (valid)")
533 cog.outl(
" add_new_message(other.get());")
536 cog.outl(
"#include \"diagnostic_pop.h\"")
538 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
539 cog.outl(
" //**********************************************")
540 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
541 cog.outl(
" message_packet(message_packet&& other)")
542 cog.outl(
" : valid(other.is_valid())")
544 cog.outl(
" if (valid)")
546 cog.outl(
" add_new_message(etl::move(other.get()));")
549 cog.outl(
"#include \"diagnostic_pop.h\"")
552 cog.outl(
" //**********************************************")
553 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
554 cog.outl(
" message_packet& operator =(const message_packet& rhs)")
556 cog.outl(
" delete_current_message();")
557 cog.outl(
" valid = rhs.is_valid();")
558 cog.outl(
" if (valid)")
560 cog.outl(
" add_new_message(rhs.get());")
563 cog.outl(
" return *this;")
565 cog.outl(
"#include \"diagnostic_pop.h\"")
567 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
568 cog.outl(
" //**********************************************")
569 cog.outl(
"#include \"diagnostic_uninitialized_push.h\"")
570 cog.outl(
" message_packet& operator =(message_packet&& rhs)")
572 cog.outl(
" delete_current_message();")
573 cog.outl(
" valid = rhs.is_valid();")
574 cog.outl(
" if (valid)")
576 cog.outl(
" add_new_message(etl::move(rhs.get()));")
579 cog.outl(
" return *this;")
581 cog.outl(
"#include \"diagnostic_pop.h\"")
584 cog.outl(
" //********************************************")
585 cog.outl(
" ~message_packet()")
587 cog.outl(
" delete_current_message();")
590 cog.outl(
" //********************************************")
591 cog.outl(
" etl::imessage& get() ETL_NOEXCEPT")
593 cog.outl(
" return *static_cast<etl::imessage*>(data);")
596 cog.outl(
" //********************************************")
597 cog.outl(
" const etl::imessage& get() const ETL_NOEXCEPT")
599 cog.outl(
" return *static_cast<const etl::imessage*>(data);")
602 cog.outl(
" //********************************************")
603 cog.outl(
" bool is_valid() const")
605 cog.outl(
" return valid;")
608 cog.outl(
" //**********************************************")
609 cog.outl(
" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
611 generate_accepts_return(n)
614 cog.outl(
" //**********************************************")
615 cog.outl(
" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
617 cog.outl(
" return accepts(msg.get_message_id());")
620 cog.outl(
" //**********************************************")
621 cog.outl(
" template <etl::message_id_t Id>")
622 cog.outl(
" static ETL_CONSTEXPR bool accepts()")
624 generate_accepts_return_compile_time(n)
627 cog.outl(
" //**********************************************")
628 cog.outl(
" template <typename TMessage>")
629 cog.outl(
" static ETL_CONSTEXPR")
630 cog.outl(
" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
631 cog.outl(
" accepts()")
633 generate_accepts_return_compile_time_TMessage(n)
638 cog.out(
" SIZE = etl::largest<")
639 for t in range(1, n):
641 cog.outl(
"T%s>::size," % n)
642 cog.out(
" ALIGNMENT = etl::largest<")
643 for t in range(1, n):
645 cog.outl(
"T%s>::alignment" % n)
650 cog.outl(
" //********************************************")
651 cog.outl(
" #include \"diagnostic_uninitialized_push.h\"")
652 cog.outl(
" void delete_current_message()")
654 cog.outl(
" if (valid)")
656 cog.outl(
" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
659 cog.outl(
"#if ETL_HAS_VIRTUAL_MESSAGES")
660 cog.outl(
" pmsg->~imessage();")
662 cog.outl(
" delete_message(pmsg);")
666 cog.outl(
" #include \"diagnostic_pop.h\"")
668 cog.outl(
" //********************************************")
669 cog.outl(
" void delete_message(etl::imessage* pmsg)")
671 cog.outl(
" switch (pmsg->get_message_id())")
673 for t in range(1, n + 1):
674 cog.out(
" case T%d::ID: static_cast<const T%d" %(t, t))
675 cog.outl(
"*>(pmsg)->~T%d(); break;" % t)
676 cog.outl(
" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
680 cog.outl(
" //********************************************")
681 cog.outl(
" void add_new_message(const etl::imessage& msg)")
683 cog.outl(
" const size_t id = msg.get_message_id();")
684 cog.outl(
" void* p = data;")
686 cog.outl(
" switch (id)")
688 for t in range(1, n + 1):
689 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(t, t, t))
690 cog.outl(
" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
694 cog.outl(
"#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
695 cog.outl(
" //********************************************")
696 cog.outl(
" void add_new_message(etl::imessage&& msg)")
698 cog.outl(
" const size_t id = msg.get_message_id();")
699 cog.outl(
" void* p = data;")
701 cog.outl(
" switch (id)")
703 for t in range(1, n + 1):
704 cog.outl(
" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(t, t, t))
705 cog.outl(
" default: break;")
710 cog.outl(
" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
711 cog.outl(
" bool valid;")
720 class
message_packet<void, void, void, void, void, void, void, void,
721 void, void, void, void, void, void, void, void>
726 using message_types = etl::type_list<>;
744 template <etl::message_
id_t Id>
745 static ETL_CONSTEXPR
bool accepts()
750 template <
typename TMessage>
751 static ETL_CONSTEXPR
typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value,
bool>
::type accepts()
756 bool is_valid()
const
Definition message_packet_cpp03.h:41
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40