Embedded Template Library  1.0
message_router.h
1 /******************************************************************************
2 The MIT License(MIT)
3 
4 Embedded Template Library.
5 https://github.com/ETLCPP/etl
6 https://www.etlcpp.com
7 
8 Copyright(c) 2017 jwellbelove
9 
10 Permission is hereby granted, free of charge, to any person obtaining a copy
11 of this software and associated documentation files(the "Software"), to deal
12 in the Software without restriction, including without limitation the rights
13 to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
14 copies of the Software, and to permit persons to whom the Software is
15 furnished to do so, subject to the following conditions :
16 
17 The above copyright notice and this permission notice shall be included in all
18 copies or substantial portions of the Software.
19 
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
23 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 SOFTWARE.
27 ******************************************************************************/
28 
29 #if 0
30 #error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
31 #endif
32 
33 //***************************************************************************
34 // THIS FILE HAS BEEN AUTO GENERATED. DO NOT EDIT THIS FILE.
35 //***************************************************************************
36 
37 //***************************************************************************
38 // To generate to header file, run this at the command line.
39 // Note: You will need Python and COG installed.
40 //
41 // python -m cogapp -d -e -omessage_router.h -DHandlers=<n> message_router_generator.h
42 // Where <n> is the number of messages to support.
43 //
44 // e.g.
45 // To generate handlers for up to 16 messages...
46 // python -m cogapp -d -e -omessage_router.h -DHandlers=16 message_router_generator.h
47 //
48 // See generate.bat
49 //***************************************************************************
50 
51 #ifndef ETL_MESSAGE_ROUTER_INCLUDED
52 #define ETL_MESSAGE_ROUTER_INCLUDED
53 
54 #include <stdint.h>
55 
56 #include "platform.h"
57 #include "message.h"
58 #include "message_packet.h"
59 #include "message_types.h"
60 #include "alignment.h"
61 #include "error_handler.h"
62 #include "exception.h"
63 #include "largest.h"
64 #include "nullptr.h"
65 #include "placement_new.h"
66 
67 #undef ETL_FILE
68 #define ETL_FILE "35"
69 
70 namespace etl
71 {
72  //***************************************************************************
74  //***************************************************************************
75  class message_router_exception : public etl::exception
76  {
77  public:
78 
79  message_router_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
80  : etl::exception(reason_, file_name_, line_number_)
81  {
82  }
83  };
84 
85  //***************************************************************************
87  //***************************************************************************
88  class message_router_illegal_id : public etl::message_router_exception
89  {
90  public:
91 
92  message_router_illegal_id(string_type file_name_, numeric_type line_number_)
93  : message_router_exception(ETL_ERROR_TEXT("message router:illegal id", ETL_FILE"A"), file_name_, line_number_)
94  {
95  }
96  };
97 
98  //***************************************************************************
100  //***************************************************************************
101  class imessage_router
102  {
103  public:
104 
105  virtual ~imessage_router() {}
106  virtual void receive(const etl::imessage& message) = 0;
107  virtual void receive(imessage_router& source, const etl::imessage& message) = 0;
108  virtual void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0;
109  virtual bool accepts(etl::message_id_t id) const = 0;
110  virtual bool is_null_router() const = 0;
111  virtual bool is_producer() const = 0;
112  virtual bool is_consumer() const = 0;
113 
114  //********************************************
115  bool accepts(const etl::imessage& msg) const
116  {
117  return accepts(msg.message_id);
118  }
119 
120  //********************************************
121  etl::message_router_id_t get_message_router_id() const
122  {
123  return message_router_id;
124  }
125 
126  //********************************************
127  void set_successor(imessage_router& successor_)
128  {
129  successor = &successor_;
130  }
131 
132  //********************************************
133  imessage_router& get_successor() const
134  {
135  return *successor;
136  }
137 
138  //********************************************
139  bool has_successor() const
140  {
141  return (successor != ETL_NULLPTR);
142  }
143 
144  enum
145  {
146  NULL_MESSAGE_ROUTER = 255,
147  MESSAGE_BUS = 254,
148  ALL_MESSAGE_ROUTERS = 253,
149  MAX_MESSAGE_ROUTER = 249
150  };
151 
152  protected:
153 
154  imessage_router(etl::message_router_id_t id_)
155  : successor(ETL_NULLPTR),
156  message_router_id(id_)
157  {
158  }
159 
160  imessage_router(etl::message_router_id_t id_,
161  imessage_router& successor_)
162  : successor(&successor_),
163  message_router_id(id_)
164  {
165  }
166 
167  private:
168 
169  // Disabled.
170  imessage_router(const imessage_router&);
171  imessage_router& operator =(const imessage_router&);
172 
173  etl::imessage_router* successor;
174 
175  etl::message_router_id_t message_router_id;
176  };
177 
178  //***************************************************************************
180  //***************************************************************************
181  class null_message_router : public imessage_router
182  {
183  public:
184 
185  null_message_router()
186  : imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
187  {
188  }
189 
190  //********************************************
191  void receive(const etl::imessage&) ETL_OVERRIDE
192  {
193  }
194 
195  //********************************************
196  void receive(etl::imessage_router&, const etl::imessage&) ETL_OVERRIDE
197  {
198  }
199 
200  //********************************************
201  void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) ETL_OVERRIDE
202  {
203  }
204 
205  //********************************************
206  bool accepts(etl::message_id_t) const ETL_OVERRIDE
207  {
208  return false;
209  }
210 
211  //********************************************
212  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
213  {
214  return true;
215  }
216 
217  //********************************************
218  bool is_producer() const ETL_OVERRIDE
219  {
220  return false;
221  }
222 
223  //********************************************
224  bool is_consumer() const ETL_OVERRIDE
225  {
226  return false;
227  }
228 
229  //********************************************
230  static null_message_router& instance()
231  {
232  static null_message_router nmr;
233  return nmr;
234  }
235  };
236 
237  //***************************************************************************
239  //***************************************************************************
240  class message_producer : public imessage_router
241  {
242  public:
243 
244  message_producer(etl::message_router_id_t id_)
245  : imessage_router(id_)
246  {
247  }
248 
249  //********************************************
250  void receive(const etl::imessage&) ETL_OVERRIDE
251  {
252  }
253 
254  //********************************************
255  void receive(etl::imessage_router&, const etl::imessage&) ETL_OVERRIDE
256  {
257  }
258 
259  //********************************************
260  void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) ETL_OVERRIDE
261  {
262  }
263 
264  //********************************************
265  bool accepts(etl::message_id_t) const ETL_OVERRIDE
266  {
267  return false;
268  }
269 
270  //********************************************
271  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
272  {
273  return false;
274  }
275 
276  //********************************************
277  bool is_producer() const ETL_OVERRIDE
278  {
279  return true;
280  }
281 
282  //********************************************
283  bool is_consumer() const ETL_OVERRIDE
284  {
285  return false;
286  }
287  };
288  //***************************************************************************
291  //***************************************************************************
292  inline static void send_message(etl::imessage_router& destination,
293  const etl::imessage& message)
294  {
295  destination.receive(message);
296  }
297 
298  //***************************************************************************
300  //***************************************************************************
301  inline static void send_message(etl::imessage_router& source,
302  etl::imessage_router& destination,
303  const etl::imessage& message)
304  {
305  destination.receive(source, message);
306  }
307 
308  //***************************************************************************
309  // The definition for all 16 message types.
310  //***************************************************************************
311  template <typename TDerived,
312  typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
313  typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
314  typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
315  typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
317  {
318  public:
319 
321 
322  //**********************************************
323  message_router(etl::message_router_id_t id_)
324  : imessage_router(id_)
325  {
326  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
327  }
328 
329  //**********************************************
330  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
331  : imessage_router(id_, successor_)
332  {
333  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
334  }
335 
336  //**********************************************
337  void receive(const etl::imessage& msg) ETL_OVERRIDE
338  {
339  receive(etl::null_message_router::instance(), msg);
340  }
341 
342  //**********************************************
343  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
344  {
345  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
346  {
347  receive(source, msg);
348  }
349  }
350 
351  //**********************************************
352  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
353  {
354  const etl::message_id_t id = msg.message_id;
355 
356  switch (id)
357  {
358  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
359  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
360  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
361  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
362  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
363  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
364  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
365  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
366  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
367  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
368  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
369  case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
370  case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
371  case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
372  case T15::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T15&>(msg)); break;
373  case T16::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T16&>(msg)); break;
374  default:
375  {
376  if (has_successor())
377  {
378  get_successor().receive(source, msg);
379  }
380  else
381  {
382  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
383  }
384  break;
385  }
386  }
387  }
388 
389  using imessage_router::accepts;
390 
391  //**********************************************
392  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
393  {
394  switch (id)
395  {
396  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
397  case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID: case T15::ID: case T16::ID:
398  return true;
399  default:
400  return false;
401  }
402  }
403 
404  //********************************************
405  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
406  {
407  return false;
408  }
409 
410  //********************************************
411  bool is_producer() const ETL_OVERRIDE
412  {
413  return true;
414  }
415 
416  //********************************************
417  bool is_consumer() const ETL_OVERRIDE
418  {
419  return true;
420  }
421  };
422 
423  //***************************************************************************
424  // Specialisation for 15 message types.
425  //***************************************************************************
426  template <typename TDerived,
427  typename T1, typename T2, typename T3, typename T4,
428  typename T5, typename T6, typename T7, typename T8,
429  typename T9, typename T10, typename T11, typename T12,
430  typename T13, typename T14, typename T15>
431  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, void>
432  : public imessage_router
433  {
434  public:
435 
437 
438  //**********************************************
439  message_router(etl::message_router_id_t id_)
440  : imessage_router(id_)
441  {
442  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
443  }
444 
445  //**********************************************
446  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
447  : imessage_router(id_, successor_)
448  {
449  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
450  }
451 
452  //**********************************************
453  void receive(const etl::imessage& msg) ETL_OVERRIDE
454  {
455  receive(etl::null_message_router::instance(), msg);
456  }
457 
458  //**********************************************
459  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
460  {
461  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
462  {
463  receive(source, msg);
464  }
465  }
466 
467  //**********************************************
468  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
469  {
470  const size_t id = msg.message_id;
471 
472  switch (id)
473  {
474  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
475  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
476  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
477  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
478  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
479  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
480  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
481  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
482  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
483  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
484  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
485  case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
486  case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
487  case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
488  case T15::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T15&>(msg)); break;
489  default:
490  {
491  if (has_successor())
492  {
493  get_successor().receive(source, msg);
494  }
495  else
496  {
497  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
498  }
499  break;
500  }
501  }
502  }
503 
504  using imessage_router::accepts;
505 
506  //**********************************************
507  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
508  {
509  switch (id)
510  {
511  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
512  case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID: case T15::ID:
513  return true;
514  default:
515  return false;
516  }
517  }
518 
519  //********************************************
520  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
521  {
522  return false;
523  }
524 
525  //********************************************
526  bool is_producer() const ETL_OVERRIDE
527  {
528  return true;
529  }
530 
531  //********************************************
532  bool is_consumer() const ETL_OVERRIDE
533  {
534  return true;
535  }
536  };
537 
538  //***************************************************************************
539  // Specialisation for 14 message types.
540  //***************************************************************************
541  template <typename TDerived,
542  typename T1, typename T2, typename T3, typename T4,
543  typename T5, typename T6, typename T7, typename T8,
544  typename T9, typename T10, typename T11, typename T12,
545  typename T13, typename T14>
546  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, void, void>
547  : public imessage_router
548  {
549  public:
550 
552 
553  //**********************************************
554  message_router(etl::message_router_id_t id_)
555  : imessage_router(id_)
556  {
557  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
558  }
559 
560  //**********************************************
561  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
562  : imessage_router(id_, successor_)
563  {
564  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
565  }
566 
567  //**********************************************
568  void receive(const etl::imessage& msg) ETL_OVERRIDE
569  {
570  receive(etl::null_message_router::instance(), msg);
571  }
572 
573  //**********************************************
574  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
575  {
576  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
577  {
578  receive(source, msg);
579  }
580  }
581 
582  //**********************************************
583  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
584  {
585  const size_t id = msg.message_id;
586 
587  switch (id)
588  {
589  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
590  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
591  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
592  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
593  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
594  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
595  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
596  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
597  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
598  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
599  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
600  case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
601  case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
602  case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
603  default:
604  {
605  if (has_successor())
606  {
607  get_successor().receive(source, msg);
608  }
609  else
610  {
611  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
612  }
613  break;
614  }
615  }
616  }
617 
618  using imessage_router::accepts;
619 
620  //**********************************************
621  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
622  {
623  switch (id)
624  {
625  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
626  case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID:
627  return true;
628  default:
629  return false;
630  }
631  }
632 
633  //********************************************
634  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
635  {
636  return false;
637  }
638 
639  //********************************************
640  bool is_producer() const ETL_OVERRIDE
641  {
642  return true;
643  }
644 
645  //********************************************
646  bool is_consumer() const ETL_OVERRIDE
647  {
648  return true;
649  }
650  };
651 
652  //***************************************************************************
653  // Specialisation for 13 message types.
654  //***************************************************************************
655  template <typename TDerived,
656  typename T1, typename T2, typename T3, typename T4,
657  typename T5, typename T6, typename T7, typename T8,
658  typename T9, typename T10, typename T11, typename T12,
659  typename T13>
660  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, void, void, void>
661  : public imessage_router
662  {
663  public:
664 
666 
667  //**********************************************
668  message_router(etl::message_router_id_t id_)
669  : imessage_router(id_)
670  {
671  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
672  }
673 
674  //**********************************************
675  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
676  : imessage_router(id_, successor_)
677  {
678  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
679  }
680 
681  //**********************************************
682  void receive(const etl::imessage& msg) ETL_OVERRIDE
683  {
684  receive(etl::null_message_router::instance(), msg);
685  }
686 
687  //**********************************************
688  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
689  {
690  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
691  {
692  receive(source, msg);
693  }
694  }
695 
696  //**********************************************
697  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
698  {
699  const size_t id = msg.message_id;
700 
701  switch (id)
702  {
703  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
704  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
705  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
706  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
707  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
708  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
709  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
710  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
711  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
712  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
713  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
714  case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
715  case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
716  default:
717  {
718  if (has_successor())
719  {
720  get_successor().receive(source, msg);
721  }
722  else
723  {
724  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
725  }
726  break;
727  }
728  }
729  }
730 
731  using imessage_router::accepts;
732 
733  //**********************************************
734  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
735  {
736  switch (id)
737  {
738  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
739  case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID:
740  return true;
741  default:
742  return false;
743  }
744  }
745 
746  //********************************************
747  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
748  {
749  return false;
750  }
751 
752  //********************************************
753  bool is_producer() const ETL_OVERRIDE
754  {
755  return true;
756  }
757 
758  //********************************************
759  bool is_consumer() const ETL_OVERRIDE
760  {
761  return true;
762  }
763  };
764 
765  //***************************************************************************
766  // Specialisation for 12 message types.
767  //***************************************************************************
768  template <typename TDerived,
769  typename T1, typename T2, typename T3, typename T4,
770  typename T5, typename T6, typename T7, typename T8,
771  typename T9, typename T10, typename T11, typename T12>
772  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, void, void, void, void>
773  : public imessage_router
774  {
775  public:
776 
778 
779  //**********************************************
780  message_router(etl::message_router_id_t id_)
781  : imessage_router(id_)
782  {
783  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
784  }
785 
786  //**********************************************
787  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
788  : imessage_router(id_, successor_)
789  {
790  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
791  }
792 
793  //**********************************************
794  void receive(const etl::imessage& msg) ETL_OVERRIDE
795  {
796  receive(etl::null_message_router::instance(), msg);
797  }
798 
799  //**********************************************
800  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
801  {
802  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
803  {
804  receive(source, msg);
805  }
806  }
807 
808  //**********************************************
809  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
810  {
811  const size_t id = msg.message_id;
812 
813  switch (id)
814  {
815  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
816  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
817  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
818  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
819  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
820  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
821  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
822  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
823  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
824  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
825  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
826  case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
827  default:
828  {
829  if (has_successor())
830  {
831  get_successor().receive(source, msg);
832  }
833  else
834  {
835  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
836  }
837  break;
838  }
839  }
840  }
841 
842  using imessage_router::accepts;
843 
844  //**********************************************
845  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
846  {
847  switch (id)
848  {
849  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
850  case T9::ID: case T10::ID: case T11::ID: case T12::ID:
851  return true;
852  default:
853  return false;
854  }
855  }
856 
857  //********************************************
858  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
859  {
860  return false;
861  }
862 
863  //********************************************
864  bool is_producer() const ETL_OVERRIDE
865  {
866  return true;
867  }
868 
869  //********************************************
870  bool is_consumer() const ETL_OVERRIDE
871  {
872  return true;
873  }
874  };
875 
876  //***************************************************************************
877  // Specialisation for 11 message types.
878  //***************************************************************************
879  template <typename TDerived,
880  typename T1, typename T2, typename T3, typename T4,
881  typename T5, typename T6, typename T7, typename T8,
882  typename T9, typename T10, typename T11>
883  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, void, void, void, void, void>
884  : public imessage_router
885  {
886  public:
887 
889 
890  //**********************************************
891  message_router(etl::message_router_id_t id_)
892  : imessage_router(id_)
893  {
894  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
895  }
896 
897  //**********************************************
898  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
899  : imessage_router(id_, successor_)
900  {
901  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
902  }
903 
904  //**********************************************
905  void receive(const etl::imessage& msg) ETL_OVERRIDE
906  {
907  receive(etl::null_message_router::instance(), msg);
908  }
909 
910  //**********************************************
911  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
912  {
913  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
914  {
915  receive(source, msg);
916  }
917  }
918 
919  //**********************************************
920  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
921  {
922  const size_t id = msg.message_id;
923 
924  switch (id)
925  {
926  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
927  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
928  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
929  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
930  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
931  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
932  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
933  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
934  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
935  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
936  case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
937  default:
938  {
939  if (has_successor())
940  {
941  get_successor().receive(source, msg);
942  }
943  else
944  {
945  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
946  }
947  break;
948  }
949  }
950  }
951 
952  using imessage_router::accepts;
953 
954  //**********************************************
955  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
956  {
957  switch (id)
958  {
959  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
960  case T9::ID: case T10::ID: case T11::ID:
961  return true;
962  default:
963  return false;
964  }
965  }
966 
967  //********************************************
968  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
969  {
970  return false;
971  }
972 
973  //********************************************
974  bool is_producer() const ETL_OVERRIDE
975  {
976  return true;
977  }
978 
979  //********************************************
980  bool is_consumer() const ETL_OVERRIDE
981  {
982  return true;
983  }
984  };
985 
986  //***************************************************************************
987  // Specialisation for 10 message types.
988  //***************************************************************************
989  template <typename TDerived,
990  typename T1, typename T2, typename T3, typename T4,
991  typename T5, typename T6, typename T7, typename T8,
992  typename T9, typename T10>
993  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, void, void, void, void, void, void>
994  : public imessage_router
995  {
996  public:
997 
999 
1000  //**********************************************
1001  message_router(etl::message_router_id_t id_)
1002  : imessage_router(id_)
1003  {
1004  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1005  }
1006 
1007  //**********************************************
1008  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1009  : imessage_router(id_, successor_)
1010  {
1011  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1012  }
1013 
1014  //**********************************************
1015  void receive(const etl::imessage& msg) ETL_OVERRIDE
1016  {
1017  receive(etl::null_message_router::instance(), msg);
1018  }
1019 
1020  //**********************************************
1021  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1022  {
1023  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1024  {
1025  receive(source, msg);
1026  }
1027  }
1028 
1029  //**********************************************
1030  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1031  {
1032  const size_t id = msg.message_id;
1033 
1034  switch (id)
1035  {
1036  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1037  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1038  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1039  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1040  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1041  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
1042  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
1043  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
1044  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
1045  case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
1046  default:
1047  {
1048  if (has_successor())
1049  {
1050  get_successor().receive(source, msg);
1051  }
1052  else
1053  {
1054  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1055  }
1056  break;
1057  }
1058  }
1059  }
1060 
1061  using imessage_router::accepts;
1062 
1063  //**********************************************
1064  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1065  {
1066  switch (id)
1067  {
1068  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
1069  case T9::ID: case T10::ID:
1070  return true;
1071  default:
1072  return false;
1073  }
1074  }
1075 
1076  //********************************************
1077  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1078  {
1079  return false;
1080  }
1081 
1082  //********************************************
1083  bool is_producer() const ETL_OVERRIDE
1084  {
1085  return true;
1086  }
1087 
1088  //********************************************
1089  bool is_consumer() const ETL_OVERRIDE
1090  {
1091  return true;
1092  }
1093  };
1094 
1095  //***************************************************************************
1096  // Specialisation for 9 message types.
1097  //***************************************************************************
1098  template <typename TDerived,
1099  typename T1, typename T2, typename T3, typename T4,
1100  typename T5, typename T6, typename T7, typename T8,
1101  typename T9>
1102  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, void, void, void, void, void, void, void>
1103  : public imessage_router
1104  {
1105  public:
1106 
1108 
1109  //**********************************************
1110  message_router(etl::message_router_id_t id_)
1111  : imessage_router(id_)
1112  {
1113  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1114  }
1115 
1116  //**********************************************
1117  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1118  : imessage_router(id_, successor_)
1119  {
1120  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1121  }
1122 
1123  //**********************************************
1124  void receive(const etl::imessage& msg) ETL_OVERRIDE
1125  {
1126  receive(etl::null_message_router::instance(), msg);
1127  }
1128 
1129  //**********************************************
1130  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1131  {
1132  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1133  {
1134  receive(source, msg);
1135  }
1136  }
1137 
1138  //**********************************************
1139  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1140  {
1141  const size_t id = msg.message_id;
1142 
1143  switch (id)
1144  {
1145  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1146  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1147  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1148  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1149  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1150  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
1151  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
1152  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
1153  case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
1154  default:
1155  {
1156  if (has_successor())
1157  {
1158  get_successor().receive(source, msg);
1159  }
1160  else
1161  {
1162  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1163  }
1164  break;
1165  }
1166  }
1167  }
1168 
1169  using imessage_router::accepts;
1170 
1171  //**********************************************
1172  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1173  {
1174  switch (id)
1175  {
1176  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
1177  case T9::ID:
1178  return true;
1179  default:
1180  return false;
1181  }
1182  }
1183 
1184  //********************************************
1185  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1186  {
1187  return false;
1188  }
1189 
1190  //********************************************
1191  bool is_producer() const ETL_OVERRIDE
1192  {
1193  return true;
1194  }
1195 
1196  //********************************************
1197  bool is_consumer() const ETL_OVERRIDE
1198  {
1199  return true;
1200  }
1201  };
1202 
1203  //***************************************************************************
1204  // Specialisation for 8 message types.
1205  //***************************************************************************
1206  template <typename TDerived,
1207  typename T1, typename T2, typename T3, typename T4,
1208  typename T5, typename T6, typename T7, typename T8>
1209  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, void, void, void, void, void, void, void, void>
1210  : public imessage_router
1211  {
1212  public:
1213 
1215 
1216  //**********************************************
1217  message_router(etl::message_router_id_t id_)
1218  : imessage_router(id_)
1219  {
1220  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1221  }
1222 
1223  //**********************************************
1224  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1225  : imessage_router(id_, successor_)
1226  {
1227  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1228  }
1229 
1230  //**********************************************
1231  void receive(const etl::imessage& msg) ETL_OVERRIDE
1232  {
1233  receive(etl::null_message_router::instance(), msg);
1234  }
1235 
1236  //**********************************************
1237  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1238  {
1239  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1240  {
1241  receive(source, msg);
1242  }
1243  }
1244 
1245  //**********************************************
1246  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1247  {
1248  const size_t id = msg.message_id;
1249 
1250  switch (id)
1251  {
1252  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1253  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1254  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1255  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1256  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1257  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
1258  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
1259  case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
1260  default:
1261  {
1262  if (has_successor())
1263  {
1264  get_successor().receive(source, msg);
1265  }
1266  else
1267  {
1268  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1269  }
1270  break;
1271  }
1272  }
1273  }
1274 
1275  using imessage_router::accepts;
1276 
1277  //**********************************************
1278  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1279  {
1280  switch (id)
1281  {
1282  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
1283 
1284  return true;
1285  default:
1286  return false;
1287  }
1288  }
1289 
1290  //********************************************
1291  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1292  {
1293  return false;
1294  }
1295 
1296  //********************************************
1297  bool is_producer() const ETL_OVERRIDE
1298  {
1299  return true;
1300  }
1301 
1302  //********************************************
1303  bool is_consumer() const ETL_OVERRIDE
1304  {
1305  return true;
1306  }
1307  };
1308 
1309  //***************************************************************************
1310  // Specialisation for 7 message types.
1311  //***************************************************************************
1312  template <typename TDerived,
1313  typename T1, typename T2, typename T3, typename T4,
1314  typename T5, typename T6, typename T7>
1315  class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, void, void, void, void, void, void, void, void, void>
1316  : public imessage_router
1317  {
1318  public:
1319 
1321 
1322  //**********************************************
1323  message_router(etl::message_router_id_t id_)
1324  : imessage_router(id_)
1325  {
1326  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1327  }
1328 
1329  //**********************************************
1330  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1331  : imessage_router(id_, successor_)
1332  {
1333  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1334  }
1335 
1336  //**********************************************
1337  void receive(const etl::imessage& msg) ETL_OVERRIDE
1338  {
1339  receive(etl::null_message_router::instance(), msg);
1340  }
1341 
1342  //**********************************************
1343  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1344  {
1345  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1346  {
1347  receive(source, msg);
1348  }
1349  }
1350 
1351  //**********************************************
1352  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1353  {
1354  const size_t id = msg.message_id;
1355 
1356  switch (id)
1357  {
1358  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1359  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1360  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1361  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1362  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1363  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
1364  case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
1365  default:
1366  {
1367  if (has_successor())
1368  {
1369  get_successor().receive(source, msg);
1370  }
1371  else
1372  {
1373  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1374  }
1375  break;
1376  }
1377  }
1378  }
1379 
1380  using imessage_router::accepts;
1381 
1382  //**********************************************
1383  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1384  {
1385  switch (id)
1386  {
1387  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID:
1388  return true;
1389  default:
1390  return false;
1391  }
1392  }
1393 
1394  //********************************************
1395  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1396  {
1397  return false;
1398  }
1399 
1400  //********************************************
1401  bool is_producer() const ETL_OVERRIDE
1402  {
1403  return true;
1404  }
1405 
1406  //********************************************
1407  bool is_consumer() const ETL_OVERRIDE
1408  {
1409  return true;
1410  }
1411  };
1412 
1413  //***************************************************************************
1414  // Specialisation for 6 message types.
1415  //***************************************************************************
1416  template <typename TDerived,
1417  typename T1, typename T2, typename T3, typename T4,
1418  typename T5, typename T6>
1419  class message_router<TDerived, T1, T2, T3, T4, T5, T6, void, void, void, void, void, void, void, void, void, void>
1420  : public imessage_router
1421  {
1422  public:
1423 
1425 
1426  //**********************************************
1427  message_router(etl::message_router_id_t id_)
1428  : imessage_router(id_)
1429  {
1430  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1431  }
1432 
1433  //**********************************************
1434  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1435  : imessage_router(id_, successor_)
1436  {
1437  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1438  }
1439 
1440  //**********************************************
1441  void receive(const etl::imessage& msg) ETL_OVERRIDE
1442  {
1443  receive(etl::null_message_router::instance(), msg);
1444  }
1445 
1446  //**********************************************
1447  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1448  {
1449  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1450  {
1451  receive(source, msg);
1452  }
1453  }
1454 
1455  //**********************************************
1456  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1457  {
1458  const size_t id = msg.message_id;
1459 
1460  switch (id)
1461  {
1462  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1463  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1464  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1465  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1466  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1467  case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
1468  default:
1469  {
1470  if (has_successor())
1471  {
1472  get_successor().receive(source, msg);
1473  }
1474  else
1475  {
1476  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1477  }
1478  break;
1479  }
1480  }
1481  }
1482 
1483  using imessage_router::accepts;
1484 
1485  //**********************************************
1486  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1487  {
1488  switch (id)
1489  {
1490  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID:
1491  return true;
1492  default:
1493  return false;
1494  }
1495  }
1496 
1497  //********************************************
1498  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1499  {
1500  return false;
1501  }
1502 
1503  //********************************************
1504  bool is_producer() const ETL_OVERRIDE
1505  {
1506  return true;
1507  }
1508 
1509  //********************************************
1510  bool is_consumer() const ETL_OVERRIDE
1511  {
1512  return true;
1513  }
1514  };
1515 
1516  //***************************************************************************
1517  // Specialisation for 5 message types.
1518  //***************************************************************************
1519  template <typename TDerived,
1520  typename T1, typename T2, typename T3, typename T4,
1521  typename T5>
1522  class message_router<TDerived, T1, T2, T3, T4, T5, void, void, void, void, void, void, void, void, void, void, void>
1523  : public imessage_router
1524  {
1525  public:
1526 
1528 
1529  //**********************************************
1530  message_router(etl::message_router_id_t id_)
1531  : imessage_router(id_)
1532  {
1533  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1534  }
1535 
1536  //**********************************************
1537  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1538  : imessage_router(id_, successor_)
1539  {
1540  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1541  }
1542 
1543  //**********************************************
1544  void receive(const etl::imessage& msg) ETL_OVERRIDE
1545  {
1546  receive(etl::null_message_router::instance(), msg);
1547  }
1548 
1549  //**********************************************
1550  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1551  {
1552  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1553  {
1554  receive(source, msg);
1555  }
1556  }
1557 
1558  //**********************************************
1559  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1560  {
1561  const size_t id = msg.message_id;
1562 
1563  switch (id)
1564  {
1565  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1566  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1567  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1568  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1569  case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
1570  default:
1571  {
1572  if (has_successor())
1573  {
1574  get_successor().receive(source, msg);
1575  }
1576  else
1577  {
1578  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1579  }
1580  break;
1581  }
1582  }
1583  }
1584 
1585  using imessage_router::accepts;
1586 
1587  //**********************************************
1588  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1589  {
1590  switch (id)
1591  {
1592  case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID:
1593  return true;
1594  default:
1595  return false;
1596  }
1597  }
1598 
1599  //********************************************
1600  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1601  {
1602  return false;
1603  }
1604 
1605  //********************************************
1606  bool is_producer() const ETL_OVERRIDE
1607  {
1608  return true;
1609  }
1610 
1611  //********************************************
1612  bool is_consumer() const ETL_OVERRIDE
1613  {
1614  return true;
1615  }
1616  };
1617 
1618  //***************************************************************************
1619  // Specialisation for 4 message types.
1620  //***************************************************************************
1621  template <typename TDerived,
1622  typename T1, typename T2, typename T3, typename T4>
1623  class message_router<TDerived, T1, T2, T3, T4, void, void, void, void, void, void, void, void, void, void, void, void>
1624  : public imessage_router
1625  {
1626  public:
1627 
1629 
1630  //**********************************************
1631  message_router(etl::message_router_id_t id_)
1632  : imessage_router(id_)
1633  {
1634  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1635  }
1636 
1637  //**********************************************
1638  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1639  : imessage_router(id_, successor_)
1640  {
1641  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1642  }
1643 
1644  //**********************************************
1645  void receive(const etl::imessage& msg) ETL_OVERRIDE
1646  {
1647  receive(etl::null_message_router::instance(), msg);
1648  }
1649 
1650  //**********************************************
1651  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1652  {
1653  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1654  {
1655  receive(source, msg);
1656  }
1657  }
1658 
1659  //**********************************************
1660  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1661  {
1662  const size_t id = msg.message_id;
1663 
1664  switch (id)
1665  {
1666  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1667  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1668  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1669  case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
1670  default:
1671  {
1672  if (has_successor())
1673  {
1674  get_successor().receive(source, msg);
1675  }
1676  else
1677  {
1678  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1679  }
1680  break;
1681  }
1682  }
1683  }
1684 
1685  using imessage_router::accepts;
1686 
1687  //**********************************************
1688  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1689  {
1690  switch (id)
1691  {
1692  case T1::ID: case T2::ID: case T3::ID: case T4::ID:
1693  return true;
1694  default:
1695  return false;
1696  }
1697  }
1698 
1699  //********************************************
1700  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1701  {
1702  return false;
1703  }
1704 
1705  //********************************************
1706  bool is_producer() const ETL_OVERRIDE
1707  {
1708  return true;
1709  }
1710 
1711  //********************************************
1712  bool is_consumer() const ETL_OVERRIDE
1713  {
1714  return true;
1715  }
1716  };
1717 
1718  //***************************************************************************
1719  // Specialisation for 3 message types.
1720  //***************************************************************************
1721  template <typename TDerived,
1722  typename T1, typename T2, typename T3>
1723  class message_router<TDerived, T1, T2, T3, void, void, void, void, void, void, void, void, void, void, void, void, void>
1724  : public imessage_router
1725  {
1726  public:
1727 
1729 
1730  //**********************************************
1731  message_router(etl::message_router_id_t id_)
1732  : imessage_router(id_)
1733  {
1734  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1735  }
1736 
1737  //**********************************************
1738  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1739  : imessage_router(id_, successor_)
1740  {
1741  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1742  }
1743 
1744  //**********************************************
1745  void receive(const etl::imessage& msg) ETL_OVERRIDE
1746  {
1747  receive(etl::null_message_router::instance(), msg);
1748  }
1749 
1750  //**********************************************
1751  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1752  {
1753  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1754  {
1755  receive(source, msg);
1756  }
1757  }
1758 
1759  //**********************************************
1760  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1761  {
1762  const size_t id = msg.message_id;
1763 
1764  switch (id)
1765  {
1766  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1767  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1768  case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
1769  default:
1770  {
1771  if (has_successor())
1772  {
1773  get_successor().receive(source, msg);
1774  }
1775  else
1776  {
1777  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1778  }
1779  break;
1780  }
1781  }
1782  }
1783 
1784  using imessage_router::accepts;
1785 
1786  //**********************************************
1787  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1788  {
1789  switch (id)
1790  {
1791  case T1::ID: case T2::ID: case T3::ID:
1792  return true;
1793  default:
1794  return false;
1795  }
1796  }
1797 
1798  //********************************************
1799  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1800  {
1801  return false;
1802  }
1803 
1804  //********************************************
1805  bool is_producer() const ETL_OVERRIDE
1806  {
1807  return true;
1808  }
1809 
1810  //********************************************
1811  bool is_consumer() const ETL_OVERRIDE
1812  {
1813  return true;
1814  }
1815  };
1816 
1817  //***************************************************************************
1818  // Specialisation for 2 message types.
1819  //***************************************************************************
1820  template <typename TDerived,
1821  typename T1, typename T2>
1822  class message_router<TDerived, T1, T2, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
1823  : public imessage_router
1824  {
1825  public:
1826 
1828 
1829  //**********************************************
1830  message_router(etl::message_router_id_t id_)
1831  : imessage_router(id_)
1832  {
1833  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1834  }
1835 
1836  //**********************************************
1837  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1838  : imessage_router(id_, successor_)
1839  {
1840  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1841  }
1842 
1843  //**********************************************
1844  void receive(const etl::imessage& msg) ETL_OVERRIDE
1845  {
1846  receive(etl::null_message_router::instance(), msg);
1847  }
1848 
1849  //**********************************************
1850  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1851  {
1852  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1853  {
1854  receive(source, msg);
1855  }
1856  }
1857 
1858  //**********************************************
1859  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1860  {
1861  const size_t id = msg.message_id;
1862 
1863  switch (id)
1864  {
1865  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1866  case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
1867  default:
1868  {
1869  if (has_successor())
1870  {
1871  get_successor().receive(source, msg);
1872  }
1873  else
1874  {
1875  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1876  }
1877  break;
1878  }
1879  }
1880  }
1881 
1882  using imessage_router::accepts;
1883 
1884  //**********************************************
1885  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1886  {
1887  switch (id)
1888  {
1889  case T1::ID: case T2::ID:
1890  return true;
1891  default:
1892  return false;
1893  }
1894  }
1895 
1896  //********************************************
1897  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1898  {
1899  return false;
1900  }
1901 
1902  //********************************************
1903  bool is_producer() const ETL_OVERRIDE
1904  {
1905  return true;
1906  }
1907 
1908  //********************************************
1909  bool is_consumer() const ETL_OVERRIDE
1910  {
1911  return true;
1912  }
1913  };
1914 
1915  //***************************************************************************
1916  // Specialisation for 1 message type.
1917  //***************************************************************************
1918  template <typename TDerived,
1919  typename T1>
1920  class message_router<TDerived, T1, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
1921  : public imessage_router
1922  {
1923  public:
1924 
1926 
1927  //**********************************************
1928  message_router(etl::message_router_id_t id_)
1929  : imessage_router(id_)
1930  {
1931  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1932  }
1933 
1934  //**********************************************
1935  message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
1936  : imessage_router(id_, successor_)
1937  {
1938  ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
1939  }
1940 
1941  //**********************************************
1942  void receive(const etl::imessage& msg) ETL_OVERRIDE
1943  {
1944  receive(etl::null_message_router::instance(), msg);
1945  }
1946 
1947  //**********************************************
1948  void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE
1949  {
1950  if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
1951  {
1952  receive(source, msg);
1953  }
1954  }
1955 
1956  //**********************************************
1957  void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE
1958  {
1959  const size_t id = msg.message_id;
1960 
1961  switch (id)
1962  {
1963  case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
1964  default:
1965  {
1966  if (has_successor())
1967  {
1968  get_successor().receive(source, msg);
1969  }
1970  else
1971  {
1972  static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
1973  }
1974  break;
1975  }
1976  }
1977  }
1978 
1979  using imessage_router::accepts;
1980 
1981  //**********************************************
1982  bool accepts(etl::message_id_t id) const ETL_OVERRIDE
1983  {
1984  switch (id)
1985  {
1986  case T1::ID:
1987  return true;
1988  default:
1989  return false;
1990  }
1991  }
1992 
1993  //********************************************
1994  ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
1995  {
1996  return false;
1997  }
1998 
1999  //********************************************
2000  bool is_producer() const ETL_OVERRIDE
2001  {
2002  return true;
2003  }
2004 
2005  //********************************************
2006  bool is_consumer() const ETL_OVERRIDE
2007  {
2008  return true;
2009  }
2010  };
2011 }
2012 
2013 #undef ETL_FILE
2014 
2015 #endif
This is the base of all message routers.
Definition: message_router_generator.h:114
Definition: message.h:68
Definition: message_packet.h:76
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_router.h:317
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
exception(string_type reason_, string_type file_, numeric_type line_)
Constructor.
Definition: exception.h:67
Definition: exception.h:47
Definition: absolute.h:37
uint_least8_t message_id_t
Allow alternative type for message id.
Definition: message_types.h:40