Embedded Template Library 1.0
Loading...
Searching...
No Matches
message_router_generator.h
1/******************************************************************************
2The MIT License(MIT)
3
4Embedded Template Library.
5https://github.com/ETLCPP/etl
6https://www.etlcpp.com
7
8Copyright(c) 2017 John Wellbelove
9
10Permission is hereby granted, free of charge, to any person obtaining a copy
11of this software and associated documentation files(the "Software"), to deal
12in the Software without restriction, including without limitation the rights
13to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
14copies of the Software, and to permit persons to whom the Software is
15furnished to do so, subject to the following conditions :
16
17The above copyright notice and this permission notice shall be included in all
18copies or substantial portions of the Software.
19
20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
23AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26SOFTWARE.
27******************************************************************************/
28
29/*[[[cog
30import cog
31cog.outl("#if 0")
32]]]*/
33/*[[[end]]]*/
34#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
35/*[[[cog
36import cog
37cog.outl("#endif")
38]]]*/
39/*[[[end]]]*/
40
41/*[[[cog
42import cog
43cog.outl("//***************************************************************************")
44cog.outl("// THIS FILE HAS BEEN AUTO GENERATED. DO NOT EDIT THIS FILE.")
45cog.outl("//***************************************************************************")
46]]]*/
47/*[[[end]]]*/
48
49//***************************************************************************
50// To generate to header file, run this at the command line.
51// Note: You will need Python and COG installed.
52//
53// python -m cogapp -d -e -omessage_router.h -DHandlers=<n> message_router_generator.h
54// Where <n> is the maximum number of messages to support.
55//
56// e.g.
57// To generate handlers for up to 16 messages...
58// python -m cogapp -d -e -omessage_router.h -DHandlers=16 message_router_generator.h
59//
60// See generate.bat
61//***************************************************************************
62
63#ifndef ETL_MESSAGE_ROUTER_INCLUDED
64#define ETL_MESSAGE_ROUTER_INCLUDED
65
66#include "platform.h"
67#include "message.h"
68#include "shared_message.h"
69#include "message_packet.h"
70#include "message_types.h"
71#include "alignment.h"
72#include "error_handler.h"
73#include "exception.h"
74#include "largest.h"
75#include "nullptr.h"
76#include "placement_new.h"
77#include "successor.h"
78#include "type_traits.h"
79
80#include <stdint.h>
81
82namespace etl
83{
84 //***************************************************************************
86 //***************************************************************************
88 {
89 public:
90
91 message_router_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
93 {
94 }
95 };
96
97 //***************************************************************************
99 //***************************************************************************
101 {
102 public:
103
105 : message_router_exception(ETL_ERROR_TEXT("message router:illegal id", ETL_MESSAGE_ROUTER_FILE_ID"A"), file_name_, line_number_)
106 {
107 }
108 };
109
110 //***************************************************************************
112 //***************************************************************************
113 class imessage_router;
114
116
117 //***************************************************************************
119 //***************************************************************************
120 class imessage_router : public etl::successor<imessage_router>
121 {
122 public:
123
124 virtual ~imessage_router() {}
125 virtual void receive(const etl::imessage&) = 0;
126 virtual bool accepts(etl::message_id_t) const = 0;
127 virtual bool is_null_router() const = 0;
128 virtual bool is_producer() const = 0;
129 virtual bool is_consumer() const = 0;
130
131 //********************************************
132 virtual void receive(etl::message_router_id_t destination_router_id, const etl::imessage& message)
133 {
134 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
135 {
136 receive(message);
137 }
138 }
139
140 //********************************************
141 virtual void receive(etl::shared_message shared_msg)
142 {
143 receive(shared_msg.get_message());
144 }
145
146 //********************************************
147 virtual void receive(etl::message_router_id_t destination_router_id, etl::shared_message shared_msg)
148 {
149 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
150 {
151 receive(shared_msg);
152 }
153 }
154
155 //********************************************
156 bool accepts(const etl::imessage& msg) const
157 {
158 return accepts(msg.get_message_id());
159 }
160
161 //********************************************
162 etl::message_router_id_t get_message_router_id() const
163 {
164 return message_router_id;
165 }
166
167 enum
168 {
169 NULL_MESSAGE_ROUTER = 255,
170 MESSAGE_BUS = 254,
171 ALL_MESSAGE_ROUTERS = 253,
172 MESSAGE_BROKER = 252,
173 MESSAGE_ROUTER = 251,
174 MAX_MESSAGE_ROUTER = 249
175 };
176
177 protected:
178
179 imessage_router(etl::message_router_id_t id_)
180 : message_router_id(id_)
181 {
182 }
183
184 imessage_router(etl::message_router_id_t id_, imessage_router& successor_)
186 , message_router_id(id_)
187 {
188 }
189
190 private:
191
192 // Disabled.
195
196 etl::message_router_id_t message_router_id;
197 };
198
199 //***************************************************************************
201 //***************************************************************************
203 {
204 public:
205
206 //********************************************
208 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
209 {
210 }
211
212 //********************************************
214 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
215 {
216 }
217
218 //********************************************
219 using etl::imessage_router::receive;
220
221 void receive(const etl::imessage& msg) ETL_OVERRIDE
222 {
223 if (has_successor())
224 {
225 get_successor().receive(msg);
226 }
227 }
228
229 //********************************************
230 using etl::imessage_router::accepts;
231
232 bool accepts(etl::message_id_t id) const ETL_OVERRIDE
233 {
234 if (has_successor())
235 {
236 return get_successor().accepts(id);
237 }
238 else
239 {
240 return false;
241 }
242 }
243
244 //********************************************
245 ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
246 {
247 return true;
248 }
249
250 //********************************************
251 bool is_producer() const ETL_OVERRIDE
252 {
253 return false;
254 }
255
256 //********************************************
257 bool is_consumer() const ETL_OVERRIDE
258 {
259 return false;
260 }
261
262 //********************************************
263 static null_message_router& instance()
264 {
266 return nmr;
267 }
268 };
269
270 //***********************************************
273 {
274 return etl::null_message_router::instance();
275 }
276
277 //***************************************************************************
279 //***************************************************************************
281 {
282 public:
283
284 //********************************************
286 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
287 {
288 }
289
290 //********************************************
292 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
293 {
294 }
295
296 //********************************************
299 {
300 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
301 }
302
303 //********************************************
306 {
307 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
308 }
309
310 //********************************************
311 using etl::imessage_router::receive;
312
313 void receive(const etl::imessage& msg) ETL_OVERRIDE
314 {
315 if (has_successor())
316 {
317 get_successor().receive(msg);
318 }
319 }
320
321 //********************************************
322 using etl::imessage_router::accepts;
323
324 bool accepts(etl::message_id_t id) const ETL_OVERRIDE
325 {
326 if (has_successor())
327 {
328 return get_successor().accepts(id);
329 }
330 else
331 {
332 return false;
333 }
334 }
335
336 //********************************************
337 ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
338 {
339 return false;
340 }
341
342 //********************************************
343 bool is_producer() const ETL_OVERRIDE
344 {
345 return true;
346 }
347
348 //********************************************
349 bool is_consumer() const ETL_OVERRIDE
350 {
351 return false;
352 }
353 };
354
355 //***************************************************************************
357 //***************************************************************************
358 template <typename T>
359 struct is_message_router : public etl::bool_constant<etl::is_base_of<etl::imessage_router, typename etl::remove_cvref<T>::type>::value>
360 {
361 };
362
363 //***************************************************************************
365 //***************************************************************************
366 template <typename TRouter, typename TMessage>
367 static
369 send_message(TRouter& destination,
370 const TMessage& message)
371 {
372 destination.receive(message);
373 }
375 //***************************************************************************
377 //***************************************************************************
378 template <typename TRouter>
379 static
381 send_message(TRouter& destination,
383 {
384 destination.receive(message);
385 }
386
387 //***************************************************************************
389 //***************************************************************************
390 template <typename TRouter, typename TMessage>
391 static
393 send_message(TRouter& destination,
394 etl::message_router_id_t id,
395 const TMessage& message)
396 {
397 destination.receive(id, message);
398 }
399
400 //***************************************************************************
402 //***************************************************************************
403 template <typename TRouter>
404 static
406 send_message(TRouter& destination,
408 etl::shared_message message)
409 {
410 destination.receive(id, message);
411 }
412
413//*************************************************************************************************
414// For C++17 and above.
415//*************************************************************************************************
416#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03_IMPLEMENTATION)
417 //***************************************************************************
418 // The definition for all message types.
419 //***************************************************************************
420 template <typename TDerived, typename... TMessageTypes>
421 class message_router : public imessage_router
422 {
423 public:
424
425 typedef etl::message_packet<TMessageTypes...> message_packet;
426
427 //**********************************************
428 message_router()
429 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
430 {
431 }
432
433 //**********************************************
434 message_router(etl::imessage_router& successor_)
435 : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)
436 {
437 }
438
439 //**********************************************
440 message_router(etl::message_router_id_t id_)
441 : imessage_router(id_)
442 {
443 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
444 }
445
446 //**********************************************
447 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
448 : imessage_router(id_, successor_)
449 {
450 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
451 }
452
453 //**********************************************
454 using etl::imessage_router::receive;
455
456 void receive(const etl::imessage& msg) ETL_OVERRIDE
457 {
458 const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
459
460 if (!was_handled)
461 {
462 if (has_successor())
463 {
464 get_successor().receive(msg);
465 }
466 else
467 {
468 static_cast<TDerived*>(this)->on_receive_unknown(msg);
469 }
470 }
471 }
472
473 template <typename TMessage, typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value, int>::type = 0>
474 void receive(const TMessage& msg)
475 {
476 if constexpr (etl::is_one_of<TMessage, TMessageTypes...>::value)
477 {
478 static_cast<TDerived*>(this)->on_receive(msg);
479 }
480 else
481 {
482 if (has_successor())
483 {
484 get_successor().receive(msg);
485 }
486 else
487 {
488 static_cast<TDerived*>(this)->on_receive_unknown(msg);
489 }
490 }
491 }
492
493 //**********************************************
494 using imessage_router::accepts;
495
496 bool accepts(etl::message_id_t id) const ETL_OVERRIDE
497 {
498 return (accepts_type<TMessageTypes>(id) || ...);
499 }
500
501 //********************************************
502 ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
503 {
504 return false;
505 }
506
507 //********************************************
508 bool is_producer() const ETL_OVERRIDE
509 {
510 return true;
511 }
512
513 //********************************************
514 bool is_consumer() const ETL_OVERRIDE
515 {
516 return true;
517 }
518
519 private:
520
521 //********************************************
522 template <typename TMessage>
523 bool receive_message_type(const etl::imessage& msg)
524 {
525 if (TMessage::ID == msg.get_message_id())
526 {
527 static_cast<TDerived*>(this)->on_receive(static_cast<const TMessage&>(msg));
528 return true;
529 }
530 else
531 {
532 return false;
533 }
534 }
535
536 //********************************************
537 template <typename TMessage>
538 bool accepts_type(etl::message_id_t id) const
539 {
540 if (TMessage::ID == id)
541 {
542 return true;
543 }
544 else
545 {
546 if (has_successor())
547 {
548 return get_successor().accepts(id);
549 }
550 else
551 {
552 return false;
553 }
554 }
555 }
556 };
557#else
558//*************************************************************************************************
559// For C++14 and below.
560//*************************************************************************************************
561 /*[[[cog
562 import cog
563 ################################################
564 # The first definition for all of the messages.
565 ################################################
566 cog.outl("//***************************************************************************")
567 cog.outl("// The definition for all %s message types." % Handlers)
568 cog.outl("//***************************************************************************")
569 cog.outl("template <typename TDerived,")
570 cog.out(" ")
571 cog.out("typename T1, ")
572 for n in range(2, int(Handlers)):
573 cog.out("typename T%s = void, " % n)
574 if n % 4 == 0:
575 cog.outl("")
576 cog.out(" ")
577 cog.outl("typename T%s = void>" % int(Handlers))
578 cog.out("class message_router")
579 cog.outl(" : public imessage_router")
580 cog.outl("{")
581 cog.outl("public:")
582 cog.outl("")
583 cog.out(" typedef etl::message_packet<")
584 for n in range(1, int(Handlers)):
585 cog.out("T%s, " % n)
586 cog.outl(" T%s> message_packet;" % int(Handlers))
587 cog.outl("")
588 cog.outl(" //**********************************************")
589 cog.outl(" message_router(etl::message_router_id_t id_)")
590 cog.outl(" : imessage_router(id_)")
591 cog.outl(" {")
592 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
593 cog.outl(" }")
594 cog.outl("")
595 cog.outl(" //**********************************************")
596 cog.outl(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
597 cog.outl(" : imessage_router(id_, successor_)")
598 cog.outl(" {")
599 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
600 cog.outl(" }")
601 cog.outl("")
602 cog.outl(" //**********************************************")
603 cog.outl(" message_router()")
604 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER)")
605 cog.outl(" {")
606 cog.outl(" }")
607 cog.outl("")
608 cog.outl(" //**********************************************")
609 cog.outl(" message_router(etl::imessage_router& successor_)")
610 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)")
611 cog.outl(" {")
612 cog.outl(" }")
613 cog.outl("")
614 cog.outl(" //**********************************************")
615 cog.outl(" using etl::imessage_router::receive;")
616 cog.outl("")
617 cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
618 cog.outl(" {")
619 cog.outl(" const etl::message_id_t id = msg.get_message_id();")
620 cog.outl("")
621 cog.outl(" switch (id)")
622 cog.outl(" {")
623 for n in range(1, int(Handlers) + 1):
624 cog.out(" case T%d::ID:" % n)
625 cog.out(" static_cast<TDerived*>(this)->on_receive(static_cast<const T%d&>(msg));" % n)
626 cog.outl(" break;")
627 cog.outl(" default:")
628 cog.outl(" {")
629 cog.outl(" if (has_successor())")
630 cog.outl(" {")
631 cog.outl(" get_successor().receive(msg);")
632 cog.outl(" }")
633 cog.outl(" else")
634 cog.outl(" {")
635 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
636 cog.outl(" }")
637 cog.outl(" break;")
638 cog.outl(" }")
639 cog.outl(" }")
640 cog.outl(" }")
641 cog.outl("")
642 cog.outl(" template <typename TMessage>")
643 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && etl::is_one_of<TMessage, ")
644 for n in range(1, int(Handlers)):
645 cog.out("T%s, " % n)
646 cog.outl("T%s>::value, void>::type" % int(Handlers))
647 cog.outl(" receive(const TMessage& msg)")
648 cog.outl(" {")
649 cog.outl(" static_cast<TDerived*>(this)->on_receive(msg);")
650 cog.outl(" }")
651 cog.outl("")
652 cog.outl(" template <typename TMessage>")
653 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !etl::is_one_of<TMessage, ")
654 for n in range(1, int(Handlers)):
655 cog.out("T%s, " % n)
656 cog.outl("T%s>::value, void>::type" % int(Handlers))
657 cog.outl(" receive(const TMessage& msg)")
658 cog.outl(" {")
659 cog.outl(" if (has_successor())")
660 cog.outl(" {")
661 cog.outl(" get_successor().receive(msg);")
662 cog.outl(" }")
663 cog.outl(" else")
664 cog.outl(" {")
665 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
666 cog.outl(" }")
667 cog.outl(" }")
668 cog.outl("")
669 cog.outl(" //**********************************************")
670 cog.outl(" using imessage_router::accepts;")
671 cog.outl("")
672 cog.outl(" bool accepts(etl::message_id_t id) const ETL_OVERRIDE")
673 cog.outl(" {")
674 cog.outl(" switch (id)")
675 cog.outl(" {")
676 cog.out(" ")
677 for n in range(1, int(Handlers) + 1):
678 cog.out("case T%d::ID: " % n)
679 if n % 8 == 0:
680 cog.outl("")
681 cog.out(" ")
682 cog.outl(" return true;")
683 cog.outl(" default:")
684 cog.outl(" {")
685 cog.outl(" if (has_successor())")
686 cog.outl(" {")
687 cog.outl(" return get_successor().accepts(id);")
688 cog.outl(" }")
689 cog.outl(" else")
690 cog.outl(" {")
691 cog.outl(" return false;")
692 cog.outl(" }")
693 cog.outl(" }")
694 cog.outl(" }")
695 cog.outl(" }")
696 cog.outl("")
697 cog.outl(" //********************************************")
698 cog.outl(" ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE")
699 cog.outl(" {")
700 cog.outl(" return false;")
701 cog.outl(" }")
702 cog.outl("")
703 cog.outl(" //********************************************")
704 cog.outl(" bool is_producer() const ETL_OVERRIDE")
705 cog.outl(" {")
706 cog.outl(" return true;")
707 cog.outl(" }")
708 cog.outl("")
709 cog.outl(" //********************************************")
710 cog.outl(" bool is_consumer() const ETL_OVERRIDE")
711 cog.outl(" {")
712 cog.outl(" return true;")
713 cog.outl(" }")
714 cog.outl("};")
715
716 ####################################
717 # All of the other specialisations.
718 ####################################
719 for n in range(int(Handlers) - 1, 0, -1):
720 cog.outl("")
721 cog.outl("//***************************************************************************")
722 if n == 1:
723 cog.outl("// Specialisation for %d message type." % n)
724 else:
725 cog.outl("// Specialisation for %d message types." % n)
726 cog.outl("//***************************************************************************")
727 cog.outl("template <typename TDerived, ")
728 cog.out(" ")
729 for t in range(1, n):
730 cog.out("typename T%d, " % t)
731 if t % 4 == 0:
732 cog.outl("")
733 cog.out(" ")
734 cog.outl("typename T%d>" % n)
735 cog.out("class message_router<TDerived, ")
736 for t in range(1, n + 1):
737 cog.out("T%d, " % t)
738 if t % 16 == 0:
739 cog.outl("")
740 cog.out(" ")
741 for t in range(n + 1, int(Handlers)):
742 cog.out("void, ")
743 if t % 16 == 0:
744 cog.outl("")
745 cog.out(" ")
746 cog.outl("void>")
747 cog.outl(" : public imessage_router")
748 cog.outl("{")
749 cog.outl("public:")
750 cog.outl("")
751 cog.out(" typedef etl::message_packet<")
752 for t in range(1, n):
753 cog.out("T%s, " % t)
754 cog.outl(" T%s> message_packet;" % n)
755 cog.outl("")
756 cog.outl(" //**********************************************")
757 cog.outl(" message_router(etl::message_router_id_t id_)")
758 cog.outl(" : imessage_router(id_)")
759 cog.outl(" {")
760 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
761 cog.outl(" }")
762 cog.outl("")
763 cog.outl(" //**********************************************")
764 cog.outl(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
765 cog.outl(" : imessage_router(id_, successor_)")
766 cog.outl(" {")
767 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
768 cog.outl(" }")
769 cog.outl("")
770 cog.outl(" //**********************************************")
771 cog.outl(" message_router()")
772 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER)")
773 cog.outl(" {")
774 cog.outl(" }")
775 cog.outl("")
776 cog.outl(" //**********************************************")
777 cog.outl(" message_router(etl::imessage_router& successor_)")
778 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)")
779 cog.outl(" {")
780 cog.outl(" }")
781 cog.outl("")
782 cog.outl(" //**********************************************")
783 cog.outl(" using etl::imessage_router::receive;")
784 cog.outl("")
785 cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
786 cog.outl(" {")
787 cog.outl(" const size_t id = msg.get_message_id();")
788 cog.outl("")
789 cog.outl(" switch (id)")
790 cog.outl(" {")
791 for t in range(1, n + 1):
792 cog.out(" case T%d::ID:" % t)
793 cog.out(" static_cast<TDerived*>(this)->on_receive(static_cast<const T%d&>(msg));" % t)
794 cog.outl(" break;")
795 cog.outl(" default:")
796 cog.outl(" {")
797 cog.outl(" if (has_successor())")
798 cog.outl(" {")
799 cog.outl(" get_successor().receive(msg);")
800 cog.outl(" }")
801 cog.outl(" else")
802 cog.outl(" {")
803 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
804 cog.outl(" }")
805 cog.outl(" break;")
806 cog.outl(" }")
807 cog.outl(" }")
808 cog.outl(" }")
809 cog.outl("")
810 cog.outl(" template <typename TMessage>")
811 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && etl::is_one_of<TMessage, ")
812 for t in range(1, n):
813 cog.out("T%s, " % t)
814 cog.outl("T%s>::value, void>::type" % n)
815 cog.outl(" receive(const TMessage& msg)")
816 cog.outl(" {")
817 cog.outl(" static_cast<TDerived*>(this)->on_receive(msg);")
818 cog.outl(" }")
819 cog.outl("")
820 cog.outl(" template <typename TMessage>")
821 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !etl::is_one_of<TMessage, ")
822 for t in range(1, n):
823 cog.out("T%s, " % t)
824 cog.outl("T%s>::value, void>::type" % n)
825 cog.outl(" receive(const TMessage& msg)")
826 cog.outl(" {")
827 cog.outl(" if (has_successor())")
828 cog.outl(" {")
829 cog.outl(" get_successor().receive(msg);")
830 cog.outl(" }")
831 cog.outl(" else")
832 cog.outl(" {")
833 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
834 cog.outl(" }")
835 cog.outl(" }")
836 cog.outl("")
837 cog.outl("")
838 cog.outl(" //**********************************************")
839 cog.outl(" using imessage_router::accepts;")
840 cog.outl("")
841 cog.outl(" bool accepts(etl::message_id_t id) const ETL_OVERRIDE")
842 cog.outl(" {")
843 cog.outl(" switch (id)")
844 cog.outl(" {")
845 cog.out(" ")
846 for t in range(1, n + 1):
847 cog.out("case T%d::ID: " % t)
848 if t % 8 == 0:
849 cog.outl("")
850 cog.out(" ")
851 cog.outl("")
852 cog.outl(" return true;")
853 cog.outl(" default:")
854 cog.outl(" {")
855 cog.outl(" if (has_successor())")
856 cog.outl(" {")
857 cog.outl(" return get_successor().accepts(id);")
858 cog.outl(" }")
859 cog.outl(" else")
860 cog.outl(" {")
861 cog.outl(" return false;")
862 cog.outl(" }")
863 cog.outl(" }")
864 cog.outl(" }")
865 cog.outl(" }")
866 cog.outl("")
867 cog.outl(" //********************************************")
868 cog.outl(" ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE")
869 cog.outl(" {")
870 cog.outl(" return false;")
871 cog.outl(" }")
872 cog.outl("")
873 cog.outl(" //********************************************")
874 cog.outl(" bool is_producer() const ETL_OVERRIDE")
875 cog.outl(" {")
876 cog.outl(" return true;")
877 cog.outl(" }")
878 cog.outl("")
879 cog.outl(" //********************************************")
880 cog.outl(" bool is_consumer() const ETL_OVERRIDE")
881 cog.outl(" {")
882 cog.outl(" return true;")
883 cog.outl(" }")
884 cog.outl("};")
885 ]]]*/
886 /*[[[end]]]*/
887#endif
888}
889
890#endif
This is the base of all message routers.
Definition message_router_generator.h:121
Definition message.h:73
Definition message_packet.h:393
This router can be used as a producer-only of messages, such an interrupt routine.
Definition message_router_generator.h:281
Base exception class for message router.
Definition message_router_generator.h:88
Router id is out of the legal range.
Definition message_router_generator.h:101
Definition message.h:91
This router can be used as a sink for messages or a 'null source' router.
Definition message_router_generator.h:203
Definition shared_message.h:49
Adds successor traits to a class.
Definition successor.h:73
bool has_successor() const
Does this have a successor?
Definition successor.h:184
successor_type & get_successor() const
Definition successor.h:174
successor()
Default constructor.
Definition successor.h:81
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
bitset_ext
Definition absolute.h:38
etl::imessage_router & get_null_message_router()
null message router functionality.
Definition message_router_generator.h:272
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40
Definition type_traits_generator.h:844
Is T ultimately derived from etl::imessage_router?
Definition message_router_generator.h:360
Is T ultimately derived from etl::imessage?
Definition message.h:208
pair holds two objects of arbitrary type
Definition utility.h:164