Embedded Template Library 1.0
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 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_)
92 : etl::exception(reason_, file_name_, line_number_)
93 {
94 }
95 };
96
97 //***************************************************************************
99 //***************************************************************************
101 {
102 public:
103
104 message_router_illegal_id(string_type file_name_, numeric_type line_number_)
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_)
185 : successor(successor_)
186 , message_router_id(id_)
187 {
188 }
189
190 private:
191
192 // Disabled.
194 imessage_router& operator =(const imessage_router&);
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 {
265 static null_message_router nmr;
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 //********************************************
297 message_producer(etl::message_router_id_t id_)
298 : imessage_router(id_)
299 {
300 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
301 }
302
303 //********************************************
304 message_producer(etl::message_router_id_t id_, etl::imessage_router& successor)
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);
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 static inline void send_message(etl::imessage_router& destination,
359 const etl::imessage& message)
360 {
361 destination.receive(message);
362 }
363
364 //***************************************************************************
366 //***************************************************************************
367 static inline void send_message(etl::imessage_router& destination,
369 {
370 destination.receive(message);
371 }
372
373 //***************************************************************************
375 //***************************************************************************
376 static inline void send_message(etl::imessage_router& destination,
377 etl::message_router_id_t id,
378 const etl::imessage& message)
379 {
380 destination.receive(id, message);
381 }
382
383 //***************************************************************************
385 //***************************************************************************
386 static inline void send_message(etl::imessage_router& destination,
387 etl::message_router_id_t id,
388 etl::shared_message message)
389 {
390 destination.receive(id, message);
391 }
392
393//*************************************************************************************************
394// For C++17 and above.
395//*************************************************************************************************
396#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03_IMPLEMENTATION)
397 //***************************************************************************
398 // The definition for all message types.
399 //***************************************************************************
400 template <typename TDerived, typename... TMessageTypes>
401 class message_router : public imessage_router
402 {
403 public:
404
405 typedef etl::message_packet<TMessageTypes...> message_packet;
406
407 //**********************************************
408 message_router()
409 : imessage_router(etl::imessage_router::MESSAGE_ROUTER)
410 {
411 }
412
413 //**********************************************
414 message_router(etl::imessage_router& successor_)
415 : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)
416 {
417 }
418
419 //**********************************************
420 message_router(etl::message_router_id_t id_)
421 : imessage_router(id_)
422 {
423 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
424 }
425
426 //**********************************************
427 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
428 : imessage_router(id_, successor_)
429 {
430 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
431 }
432
433 //**********************************************
434 using etl::imessage_router::receive;
435
436 void receive(const etl::imessage& msg) ETL_OVERRIDE
437 {
438 const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
439
440 if (!was_handled)
441 {
442 if (has_successor())
443 {
444 get_successor().receive(msg);
445 }
446 else
447 {
448 static_cast<TDerived*>(this)->on_receive_unknown(msg);
449 }
450 }
451 }
452
453 template <typename TMessage, typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value, int>::type = 0>
454 void receive(const TMessage& msg)
455 {
456 if constexpr (etl::is_one_of<TMessage, TMessageTypes...>::value)
457 {
458 static_cast<TDerived*>(this)->on_receive(msg);
459 }
460 else
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 //**********************************************
474 using imessage_router::accepts;
475
476 bool accepts(etl::message_id_t id) const ETL_OVERRIDE
477 {
478 return (accepts_type<TMessageTypes>(id) || ...);
479 }
480
481 //********************************************
482 ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
483 {
484 return false;
485 }
486
487 //********************************************
488 bool is_producer() const ETL_OVERRIDE
489 {
490 return true;
491 }
492
493 //********************************************
494 bool is_consumer() const ETL_OVERRIDE
495 {
496 return true;
497 }
498
499 private:
500
501 //********************************************
502 template <typename TMessage>
503 bool receive_message_type(const etl::imessage& msg)
504 {
505 if (TMessage::ID == msg.get_message_id())
506 {
507 static_cast<TDerived*>(this)->on_receive(static_cast<const TMessage&>(msg));
508 return true;
509 }
510 else
511 {
512 return false;
513 }
514 }
515
516 //********************************************
517 template <typename TMessage>
518 bool accepts_type(etl::message_id_t id) const
519 {
520 if (TMessage::ID == id)
521 {
522 return true;
523 }
524 else
525 {
526 if (has_successor())
527 {
528 return get_successor().accepts(id);
529 }
530 else
531 {
532 return false;
533 }
534 }
535 }
536 };
537#else
538//*************************************************************************************************
539// For C++14 and below.
540//*************************************************************************************************
541 /*[[[cog
542 import cog
543 ################################################
544 # The first definition for all of the messages.
545 ################################################
546 cog.outl("//***************************************************************************")
547 cog.outl("// The definition for all %s message types." % Handlers)
548 cog.outl("//***************************************************************************")
549 cog.outl("template <typename TDerived,")
550 cog.out(" ")
551 cog.out("typename T1, ")
552 for n in range(2, int(Handlers)):
553 cog.out("typename T%s = void, " % n)
554 if n % 4 == 0:
555 cog.outl("")
556 cog.out(" ")
557 cog.outl("typename T%s = void>" % int(Handlers))
558 cog.out("class message_router")
559 cog.outl(" : public imessage_router")
560 cog.outl("{")
561 cog.outl("public:")
562 cog.outl("")
563 cog.out(" typedef etl::message_packet<")
564 for n in range(1, int(Handlers)):
565 cog.out("T%s, " % n)
566 cog.outl(" T%s> message_packet;" % int(Handlers))
567 cog.outl("")
568 cog.outl(" //**********************************************")
569 cog.outl(" message_router(etl::message_router_id_t id_)")
570 cog.outl(" : imessage_router(id_)")
571 cog.outl(" {")
572 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
573 cog.outl(" }")
574 cog.outl("")
575 cog.outl(" //**********************************************")
576 cog.outl(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
577 cog.outl(" : imessage_router(id_, successor_)")
578 cog.outl(" {")
579 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
580 cog.outl(" }")
581 cog.outl("")
582 cog.outl(" //**********************************************")
583 cog.outl(" message_router()")
584 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER)")
585 cog.outl(" {")
586 cog.outl(" }")
587 cog.outl("")
588 cog.outl(" //**********************************************")
589 cog.outl(" message_router(etl::imessage_router& successor_)")
590 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)")
591 cog.outl(" {")
592 cog.outl(" }")
593 cog.outl("")
594 cog.outl(" //**********************************************")
595 cog.outl(" using etl::imessage_router::receive;")
596 cog.outl("")
597 cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
598 cog.outl(" {")
599 cog.outl(" const etl::message_id_t id = msg.get_message_id();")
600 cog.outl("")
601 cog.outl(" switch (id)")
602 cog.outl(" {")
603 for n in range(1, int(Handlers) + 1):
604 cog.out(" case T%d::ID:" % n)
605 cog.out(" static_cast<TDerived*>(this)->on_receive(static_cast<const T%d&>(msg));" % n)
606 cog.outl(" break;")
607 cog.outl(" default:")
608 cog.outl(" {")
609 cog.outl(" if (has_successor())")
610 cog.outl(" {")
611 cog.outl(" get_successor().receive(msg);")
612 cog.outl(" }")
613 cog.outl(" else")
614 cog.outl(" {")
615 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
616 cog.outl(" }")
617 cog.outl(" break;")
618 cog.outl(" }")
619 cog.outl(" }")
620 cog.outl(" }")
621 cog.outl("")
622 cog.outl(" template <typename TMessage>")
623 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && etl::is_one_of<TMessage, ")
624 for n in range(1, int(Handlers)):
625 cog.out("T%s, " % n)
626 cog.outl("T%s>::value, void>::type" % int(Handlers))
627 cog.outl(" receive(const TMessage& msg)")
628 cog.outl(" {")
629 cog.outl(" static_cast<TDerived*>(this)->on_receive(msg);")
630 cog.outl(" }")
631 cog.outl("")
632 cog.outl(" template <typename TMessage>")
633 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !etl::is_one_of<TMessage, ")
634 for n in range(1, int(Handlers)):
635 cog.out("T%s, " % n)
636 cog.outl("T%s>::value, void>::type" % int(Handlers))
637 cog.outl(" receive(const TMessage& msg)")
638 cog.outl(" {")
639 cog.outl(" if (has_successor())")
640 cog.outl(" {")
641 cog.outl(" get_successor().receive(msg);")
642 cog.outl(" }")
643 cog.outl(" else")
644 cog.outl(" {")
645 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
646 cog.outl(" }")
647 cog.outl(" }")
648 cog.outl("")
649 cog.outl(" //**********************************************")
650 cog.outl(" using imessage_router::accepts;")
651 cog.outl("")
652 cog.outl(" bool accepts(etl::message_id_t id) const ETL_OVERRIDE")
653 cog.outl(" {")
654 cog.outl(" switch (id)")
655 cog.outl(" {")
656 cog.out(" ")
657 for n in range(1, int(Handlers) + 1):
658 cog.out("case T%d::ID: " % n)
659 if n % 8 == 0:
660 cog.outl("")
661 cog.out(" ")
662 cog.outl(" return true;")
663 cog.outl(" default:")
664 cog.outl(" {")
665 cog.outl(" if (has_successor())")
666 cog.outl(" {")
667 cog.outl(" return get_successor().accepts(id);")
668 cog.outl(" }")
669 cog.outl(" else")
670 cog.outl(" {")
671 cog.outl(" return false;")
672 cog.outl(" }")
673 cog.outl(" }")
674 cog.outl(" }")
675 cog.outl(" }")
676 cog.outl("")
677 cog.outl(" //********************************************")
678 cog.outl(" ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE")
679 cog.outl(" {")
680 cog.outl(" return false;")
681 cog.outl(" }")
682 cog.outl("")
683 cog.outl(" //********************************************")
684 cog.outl(" bool is_producer() const ETL_OVERRIDE")
685 cog.outl(" {")
686 cog.outl(" return true;")
687 cog.outl(" }")
688 cog.outl("")
689 cog.outl(" //********************************************")
690 cog.outl(" bool is_consumer() const ETL_OVERRIDE")
691 cog.outl(" {")
692 cog.outl(" return true;")
693 cog.outl(" }")
694 cog.outl("};")
695
696 ####################################
697 # All of the other specialisations.
698 ####################################
699 for n in range(int(Handlers) - 1, 0, -1):
700 cog.outl("")
701 cog.outl("//***************************************************************************")
702 if n == 1:
703 cog.outl("// Specialisation for %d message type." % n)
704 else:
705 cog.outl("// Specialisation for %d message types." % n)
706 cog.outl("//***************************************************************************")
707 cog.outl("template <typename TDerived, ")
708 cog.out(" ")
709 for t in range(1, n):
710 cog.out("typename T%d, " % t)
711 if t % 4 == 0:
712 cog.outl("")
713 cog.out(" ")
714 cog.outl("typename T%d>" % n)
715 cog.out("class message_router<TDerived, ")
716 for t in range(1, n + 1):
717 cog.out("T%d, " % t)
718 if t % 16 == 0:
719 cog.outl("")
720 cog.out(" ")
721 for t in range(n + 1, int(Handlers)):
722 cog.out("void, ")
723 if t % 16 == 0:
724 cog.outl("")
725 cog.out(" ")
726 cog.outl("void>")
727 cog.outl(" : public imessage_router")
728 cog.outl("{")
729 cog.outl("public:")
730 cog.outl("")
731 cog.out(" typedef etl::message_packet<")
732 for t in range(1, n):
733 cog.out("T%s, " % t)
734 cog.outl(" T%s> message_packet;" % n)
735 cog.outl("")
736 cog.outl(" //**********************************************")
737 cog.outl(" message_router(etl::message_router_id_t id_)")
738 cog.outl(" : imessage_router(id_)")
739 cog.outl(" {")
740 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
741 cog.outl(" }")
742 cog.outl("")
743 cog.outl(" //**********************************************")
744 cog.outl(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
745 cog.outl(" : imessage_router(id_, successor_)")
746 cog.outl(" {")
747 cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
748 cog.outl(" }")
749 cog.outl("")
750 cog.outl(" //**********************************************")
751 cog.outl(" message_router()")
752 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER)")
753 cog.outl(" {")
754 cog.outl(" }")
755 cog.outl("")
756 cog.outl(" //**********************************************")
757 cog.outl(" message_router(etl::imessage_router& successor_)")
758 cog.outl(" : imessage_router(etl::imessage_router::MESSAGE_ROUTER, successor_)")
759 cog.outl(" {")
760 cog.outl(" }")
761 cog.outl("")
762 cog.outl(" //**********************************************")
763 cog.outl(" using etl::imessage_router::receive;")
764 cog.outl("")
765 cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
766 cog.outl(" {")
767 cog.outl(" const size_t id = msg.get_message_id();")
768 cog.outl("")
769 cog.outl(" switch (id)")
770 cog.outl(" {")
771 for t in range(1, n + 1):
772 cog.out(" case T%d::ID:" % t)
773 cog.out(" static_cast<TDerived*>(this)->on_receive(static_cast<const T%d&>(msg));" % t)
774 cog.outl(" break;")
775 cog.outl(" default:")
776 cog.outl(" {")
777 cog.outl(" if (has_successor())")
778 cog.outl(" {")
779 cog.outl(" get_successor().receive(msg);")
780 cog.outl(" }")
781 cog.outl(" else")
782 cog.outl(" {")
783 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
784 cog.outl(" }")
785 cog.outl(" break;")
786 cog.outl(" }")
787 cog.outl(" }")
788 cog.outl(" }")
789 cog.outl("")
790 cog.outl(" template <typename TMessage>")
791 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && etl::is_one_of<TMessage, ")
792 for t in range(1, n):
793 cog.out("T%s, " % t)
794 cog.outl("T%s>::value, void>::type" % n)
795 cog.outl(" receive(const TMessage& msg)")
796 cog.outl(" {")
797 cog.outl(" static_cast<TDerived*>(this)->on_receive(msg);")
798 cog.outl(" }")
799 cog.outl("")
800 cog.outl(" template <typename TMessage>")
801 cog.out(" typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !etl::is_one_of<TMessage, ")
802 for t in range(1, n):
803 cog.out("T%s, " % t)
804 cog.outl("T%s>::value, void>::type" % n)
805 cog.outl(" receive(const TMessage& msg)")
806 cog.outl(" {")
807 cog.outl(" if (has_successor())")
808 cog.outl(" {")
809 cog.outl(" get_successor().receive(msg);")
810 cog.outl(" }")
811 cog.outl(" else")
812 cog.outl(" {")
813 cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(msg);")
814 cog.outl(" }")
815 cog.outl(" }")
816 cog.outl("")
817 cog.outl("")
818 cog.outl(" //**********************************************")
819 cog.outl(" using imessage_router::accepts;")
820 cog.outl("")
821 cog.outl(" bool accepts(etl::message_id_t id) const ETL_OVERRIDE")
822 cog.outl(" {")
823 cog.outl(" switch (id)")
824 cog.outl(" {")
825 cog.out(" ")
826 for t in range(1, n + 1):
827 cog.out("case T%d::ID: " % t)
828 if t % 8 == 0:
829 cog.outl("")
830 cog.out(" ")
831 cog.outl("")
832 cog.outl(" return true;")
833 cog.outl(" default:")
834 cog.outl(" {")
835 cog.outl(" if (has_successor())")
836 cog.outl(" {")
837 cog.outl(" return get_successor().accepts(id);")
838 cog.outl(" }")
839 cog.outl(" else")
840 cog.outl(" {")
841 cog.outl(" return false;")
842 cog.outl(" }")
843 cog.outl(" }")
844 cog.outl(" }")
845 cog.outl(" }")
846 cog.outl("")
847 cog.outl(" //********************************************")
848 cog.outl(" ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE")
849 cog.outl(" {")
850 cog.outl(" return false;")
851 cog.outl(" }")
852 cog.outl("")
853 cog.outl(" //********************************************")
854 cog.outl(" bool is_producer() const ETL_OVERRIDE")
855 cog.outl(" {")
856 cog.outl(" return true;")
857 cog.outl(" }")
858 cog.outl("")
859 cog.outl(" //********************************************")
860 cog.outl(" bool is_consumer() const ETL_OVERRIDE")
861 cog.outl(" {")
862 cog.outl(" return true;")
863 cog.outl(" }")
864 cog.outl("};")
865 ]]]*/
866 /*[[[end]]]*/
867#endif
868}
869
870#endif
This is the base of all message routers.
Definition: message_router_generator.h:121
Definition: message.h:69
Definition: message_packet.h:335
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:84
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
ETL_NODISCARD etl::imessage & get_message()
Get a reference to the contained message.
Definition: shared_message.h:159
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:316
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.h:1376