Embedded Template Library 1.0
Loading...
Searching...
No Matches
message_packet_cpp03_generator.h
1/******************************************************************************
2The MIT License(MIT)
3
4Embedded Template Library.
5https://github.com/ETLCPP/etl
6https://www.etlcpp.com
7
8Copyright(c) 2026 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//***************************************************************************
30// THIS FILE HAS BEEN AUTO GENERATED. DO NOT EDIT THIS FILE.
31//***************************************************************************
32
33 /*[[[cog
34 import cog
35
36 ################################################
37 def generate_accepts_return(n):
38 cog.out(" return")
39 for i in range(1, n + 1):
40 cog.out(" T%d::ID == id" % i)
41 if i < n:
42 cog.out(" ||")
43 if i % 4 == 0:
44 cog.outl("")
45 cog.out(" ")
46 cog.outl(";")
47
48 ################################################
49 def generate_accepts_return_compile_time(n):
50 cog.out(" return")
51 for i in range(1, n + 1):
52 cog.out(" T%d::ID == Id" % i)
53 if i < n:
54 cog.out(" ||")
55 if i % 4 == 0:
56 cog.outl("")
57 cog.out(" ")
58 cog.outl(";")
59
60 ################################################
61 def generate_accepts_return_compile_time_TMessage(n):
62 cog.out(" return")
63 for i in range(1, n + 1):
64 cog.out(" T%d::ID == TMessage::ID" % i)
65 if i < n:
66 cog.out(" ||")
67 if i % 4 == 0:
68 cog.outl("")
69 cog.out(" ")
70 cog.outl(";")
71
72 ################################################
73 def generate_static_assert_cpp03(n):
74 cog.outl(" // Not etl::message_packet, not etl::imessage and in typelist.")
75 cog.out(" static const bool Enabled = (!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
76 for i in range(1, n):
77 cog.out("T%d, " % i)
78 cog.outl("T%s> >::value &&" % n)
79 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
80 cog.out(" etl::is_one_of<typename etl::remove_cvref<TMessage>::type,")
81 for i in range(1, n):
82 cog.out("T%d, " % i)
83 cog.outl("T%s>::value);" % n)
84 cog.outl("")
85 cog.outl(" ETL_STATIC_ASSERT(Enabled, \"Message not in packet type list\");")
86
87 ################################################
88 def generate_static_assert_cpp11(n):
89 cog.outl(" // Not etl::message_packet, not etl::imessage and in typelist.")
90 cog.out(" static constexpr bool Enabled = (!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
91 for i in range(1, n):
92 cog.out("T%d, " % i)
93 cog.outl("T%s> >::value &&" % n)
94 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
95 cog.out(" etl::is_one_of<typename etl::remove_cvref<TMessage>::type,")
96 for i in range(1, n):
97 cog.out("T%d, " % i)
98 cog.outl("T%s>::value);" % n)
99 cog.outl("")
100 cog.outl(" ETL_STATIC_ASSERT(Enabled, \"Message not in packet type list\");")
101
102 ################################################
103 # The first definition for all of the messages.
104 ################################################
105 cog.outl("//***************************************************************************")
106 cog.outl("// The definition for all %s message types." % Handlers)
107 cog.outl("//***************************************************************************")
108 cog.out("template <")
109 for n in range(1, int(Handlers)):
110 cog.out("typename T%s = void, " % n)
111 if n % 4 == 0:
112 cog.outl("")
113 cog.out(" ")
114 cog.outl("typename T%s = void>" % int(Handlers))
115 cog.outl("class message_packet")
116 cog.outl("{")
117 cog.outl("public:")
118 cog.outl("")
119
120 cog.outl("#if ETL_USING_CPP11")
121 cog.out(" using message_types = etl::type_list<")
122 for n in range(1, int(Handlers)):
123 cog.out("T%s, " % n)
124 cog.outl("T%s>;" % int(Handlers))
125 cog.outl("#endif")
126 cog.outl("")
127
128 cog.outl(" //********************************************")
129 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
130 cog.outl(" ETL_CONSTEXPR message_packet() ETL_NOEXCEPT")
131 cog.outl(" : valid(false)")
132 cog.outl(" {")
133 cog.outl(" }")
134 cog.outl("#include \"diagnostic_pop.h\"")
135 cog.outl("")
136 cog.outl(" //********************************************")
137 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
138 cog.outl(" explicit message_packet(const etl::imessage& msg)")
139 cog.outl(" {")
140 cog.outl(" if (accepts(msg))")
141 cog.outl(" {")
142 cog.outl(" add_new_message(msg);")
143 cog.outl(" valid = true;")
144 cog.outl(" }")
145 cog.outl(" else")
146 cog.outl(" {")
147 cog.outl(" valid = false;")
148 cog.outl(" }")
149 cog.outl("")
150 cog.outl(" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
151 cog.outl(" }")
152 cog.outl("#include \"diagnostic_pop.h\"")
153 cog.outl("")
154 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
155 cog.outl(" //********************************************")
156 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
157 cog.outl(" explicit message_packet(etl::imessage&& msg)")
158 cog.outl(" {")
159 cog.outl(" if (accepts(msg))")
160 cog.outl(" {")
161 cog.outl(" add_new_message(etl::move(msg));")
162 cog.outl(" valid = true;")
163 cog.outl(" }")
164 cog.outl(" else")
165 cog.outl(" {")
166 cog.outl(" valid = false;")
167 cog.outl(" }")
168 cog.outl("")
169 cog.outl(" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
170 cog.outl(" }")
171 cog.outl("#include \"diagnostic_pop.h\"")
172 cog.outl("#endif")
173 cog.outl("")
174 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION) && !defined(ETL_COMPILER_GREEN_HILLS)")
175 cog.outl(" //********************************************")
176 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
177 cog.out(" template <typename TMessage, typename = typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
178 for n in range(1, int(Handlers)):
179 cog.out("T%s, " % n)
180 cog.outl("T%s> >::value &&" % int(Handlers))
181 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
182 cog.out(" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
183 for n in range(1, int(Handlers)):
184 cog.out("T%s, " % n)
185 cog.outl("T%s>::value, int>::type>" % int(Handlers))
186 cog.outl(" explicit message_packet(TMessage&& /*msg*/)")
187 cog.outl(" : valid(true)")
188 cog.outl(" {")
189 generate_static_assert_cpp11(int(Handlers))
190 cog.outl(" }")
191 cog.outl("#include \"diagnostic_pop.h\"")
192 cog.outl("#else")
193 cog.outl(" //********************************************")
194 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
195 cog.outl(" template <typename TMessage>")
196 cog.out(" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
197 for n in range(1, int(Handlers)):
198 cog.out("T%s, " % n)
199 cog.outl("T%s> >::value &&" % int(Handlers))
200 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
201 cog.out(" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
202 for n in range(1, int(Handlers)):
203 cog.out("T%s, " % n)
204 cog.outl("T%s>::value, int>::type = 0)" % int(Handlers))
205 cog.outl(" : valid(true)")
206 cog.outl(" {")
207 generate_static_assert_cpp03(int(Handlers))
208 cog.outl(" }")
209 cog.outl("#include \"diagnostic_pop.h\"")
210 cog.outl("#endif")
211 cog.outl("")
212 cog.outl(" //**********************************************")
213 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
214 cog.outl(" message_packet(const message_packet& other)")
215 cog.outl(" : valid(other.is_valid())")
216 cog.outl(" {")
217 cog.outl(" if (valid)")
218 cog.outl(" {")
219 cog.outl(" add_new_message(other.get());")
220 cog.outl(" }")
221 cog.outl(" }")
222 cog.outl("#include \"diagnostic_pop.h\"")
223 cog.outl("")
224 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
225 cog.outl(" //**********************************************")
226 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
227 cog.outl(" message_packet(message_packet&& other)")
228 cog.outl(" : valid(other.is_valid())")
229 cog.outl(" {")
230 cog.outl(" if (valid)")
231 cog.outl(" {")
232 cog.outl(" add_new_message(etl::move(other.get()));")
233 cog.outl(" }")
234 cog.outl(" }")
235 cog.outl("#include \"diagnostic_pop.h\"")
236 cog.outl("#endif")
237 cog.outl("")
238 cog.outl(" //**********************************************")
239 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
240 cog.outl(" message_packet& operator =(const message_packet& rhs)")
241 cog.outl(" {")
242 cog.outl(" delete_current_message();")
243 cog.outl(" valid = rhs.is_valid();")
244 cog.outl(" if (valid)")
245 cog.outl(" {")
246 cog.outl(" add_new_message(rhs.get());")
247 cog.outl(" }")
248 cog.outl("")
249 cog.outl(" return *this;")
250 cog.outl(" }")
251 cog.outl("#include \"diagnostic_pop.h\"")
252 cog.outl("")
253 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
254 cog.outl(" //**********************************************")
255 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
256 cog.outl(" message_packet& operator =(message_packet&& rhs)")
257 cog.outl(" {")
258 cog.outl(" delete_current_message();")
259 cog.outl(" valid = rhs.is_valid();")
260 cog.outl(" if (valid)")
261 cog.outl(" {")
262 cog.outl(" add_new_message(etl::move(rhs.get()));")
263 cog.outl(" }")
264 cog.outl("")
265 cog.outl(" return *this;")
266 cog.outl(" }")
267 cog.outl("#include \"diagnostic_pop.h\"")
268 cog.outl("#endif")
269 cog.outl("")
270 cog.outl(" //********************************************")
271 cog.outl(" ~message_packet()")
272 cog.outl(" {")
273 cog.outl(" delete_current_message();")
274 cog.outl(" }")
275 cog.outl("")
276 cog.outl(" //********************************************")
277 cog.outl(" etl::imessage& get() ETL_NOEXCEPT")
278 cog.outl(" {")
279 cog.outl(" return *static_cast<etl::imessage*>(data);")
280 cog.outl(" }")
281 cog.outl("")
282 cog.outl(" //********************************************")
283 cog.outl(" const etl::imessage& get() const ETL_NOEXCEPT")
284 cog.outl(" {")
285 cog.outl(" return *static_cast<const etl::imessage*>(data);")
286 cog.outl(" }")
287 cog.outl("")
288 cog.outl(" //********************************************")
289 cog.outl(" bool is_valid() const")
290 cog.outl(" {")
291 cog.outl(" return valid;")
292 cog.outl(" }")
293 cog.outl("")
294 cog.outl(" //**********************************************")
295 cog.outl(" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
296 cog.outl(" {")
297 generate_accepts_return(int(Handlers))
298 cog.outl(" }")
299 cog.outl("")
300 cog.outl(" //**********************************************")
301 cog.outl(" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
302 cog.outl(" {")
303 cog.outl(" return accepts(msg.get_message_id());")
304 cog.outl(" }")
305 cog.outl("")
306 cog.outl(" //**********************************************")
307 cog.outl(" template <etl::message_id_t Id>")
308 cog.outl(" static ETL_CONSTEXPR bool accepts()")
309 cog.outl(" {")
310 generate_accepts_return_compile_time(int(Handlers))
311 cog.outl(" }")
312 cog.outl("")
313 cog.outl(" //**********************************************")
314 cog.outl(" template <typename TMessage>")
315 cog.outl(" static ETL_CONSTEXPR")
316 cog.outl(" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
317 cog.outl(" accepts()")
318 cog.outl(" {")
319 generate_accepts_return_compile_time_TMessage(int(Handlers))
320 cog.outl(" }")
321 cog.outl("")
322 cog.outl(" enum")
323 cog.outl(" {")
324 cog.out(" SIZE = etl::largest<")
325 for n in range(1, int(Handlers)):
326 cog.out("T%d, " % n)
327 cog.outl("T%s>::size," % int(Handlers))
328 cog.out(" ALIGNMENT = etl::largest<")
329 for n in range(1, int(Handlers)):
330 cog.out("T%d, " % n)
331 cog.outl("T%s>::alignment" % int(Handlers))
332 cog.outl(" };")
333 cog.outl("")
334 cog.outl("private:")
335 cog.outl("")
336 cog.outl(" //********************************************")
337 cog.outl(" #include \"diagnostic_uninitialized_push.h\"")
338 cog.outl(" void delete_current_message()")
339 cog.outl(" {")
340 cog.outl(" if (valid)")
341 cog.outl(" {")
342 cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
343 cog.outl("")
344 cog.outl("#if ETL_HAS_VIRTUAL_MESSAGES")
345 cog.outl(" pmsg->~imessage();")
346 cog.outl("#else")
347 cog.outl(" delete_message(pmsg);")
348 cog.outl("#endif")
349 cog.outl(" }")
350 cog.outl(" }")
351 cog.outl(" #include \"diagnostic_pop.h\"")
352 cog.outl("")
353 cog.outl(" //********************************************")
354 cog.outl(" void delete_message(etl::imessage* pmsg)")
355 cog.outl(" {")
356 cog.outl(" switch (pmsg->get_message_id())")
357 cog.outl(" {")
358 for n in range(1, int(Handlers) + 1):
359 cog.out(" case T%d::ID: static_cast<const T%d" %(n, n))
360 cog.outl("*>(pmsg)->~T%d(); break;" % n)
361 cog.outl(" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
362 cog.outl(" }")
363 cog.outl(" }")
364 cog.outl("")
365 cog.outl(" //********************************************")
366 cog.outl(" void add_new_message(const etl::imessage& msg)")
367 cog.outl(" {")
368 cog.outl(" const size_t id = msg.get_message_id();")
369 cog.outl(" void* p = data;")
370 cog.outl("")
371 cog.outl(" switch (id)")
372 cog.outl(" {")
373 for n in range(1, int(Handlers) + 1):
374 cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(n, n, n))
375 cog.outl(" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
376 cog.outl(" }")
377 cog.outl(" }")
378 cog.outl("")
379 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
380 cog.outl(" //********************************************")
381 cog.outl(" void add_new_message(etl::imessage&& msg)")
382 cog.outl(" {")
383 cog.outl(" const size_t id = msg.get_message_id();")
384 cog.outl(" void* p = data;")
385 cog.outl("")
386 cog.outl(" switch (id)")
387 cog.outl(" {")
388 for n in range(1, int(Handlers) + 1):
389 cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(n, n, n))
390 cog.outl(" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
391 cog.outl(" }")
392 cog.outl(" }")
393 cog.outl("#endif")
394 cog.outl("")
395 cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
396 cog.outl(" bool valid;")
397 cog.outl("};")
398
399 ####################################
400 # All of the other specialisations.
401 ####################################
402 for n in range(int(Handlers) - 1, 0, -1):
403 cog.outl("")
404 cog.outl("//***************************************************************************")
405 if n == 1:
406 cog.outl("// Specialisation for %d message type." % n)
407 else:
408 cog.outl("// Specialisation for %d message types." % n)
409 cog.outl("//***************************************************************************")
410 cog.out("template <")
411 for t in range(1, n):
412 cog.out("typename T%s, " % t)
413 if t % 4 == 0:
414 cog.outl("")
415 cog.out(" ")
416 cog.outl("typename T%s>" % n)
417 cog.out("class message_packet<")
418 for t in range(1, n + 1):
419 cog.out("T%d, " % t)
420 if t % 16 == 0:
421 cog.outl("")
422 cog.out(" ")
423 for t in range(n + 1, int(Handlers)):
424 cog.out("void, ")
425 if t % 16 == 0:
426 cog.outl("")
427 cog.out(" ")
428 cog.outl("void>")
429 cog.outl("{")
430 cog.outl("public:")
431 cog.outl("")
432
433 cog.out("#if ETL_USING_CPP11")
434 cog.outl("")
435 cog.out(" using message_types = etl::type_list<")
436 for t in range(1, int(n)):
437 cog.out("T%s, " % t)
438 cog.outl("T%s>;" % int(n))
439 cog.outl("#endif")
440 cog.outl("")
441
442 cog.outl(" //********************************************")
443 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
444 cog.outl(" ETL_CONSTEXPR message_packet() ETL_NOEXCEPT")
445 cog.outl(" : valid(false)")
446 cog.outl(" {")
447 cog.outl(" }")
448 cog.outl("#include \"diagnostic_pop.h\"")
449 cog.outl("")
450 cog.outl(" //********************************************")
451 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
452 cog.outl(" explicit message_packet(const etl::imessage& msg)")
453 cog.outl(" {")
454 cog.outl(" if (accepts(msg))")
455 cog.outl(" {")
456 cog.outl(" add_new_message(msg);")
457 cog.outl(" valid = true;")
458 cog.outl(" }")
459 cog.outl(" else")
460 cog.outl(" {")
461 cog.outl(" valid = false;")
462 cog.outl(" }")
463 cog.outl("")
464 cog.outl(" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
465 cog.outl(" }")
466 cog.outl("#include \"diagnostic_pop.h\"")
467 cog.outl("")
468 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
469 cog.outl(" //********************************************")
470 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
471 cog.outl(" explicit message_packet(etl::imessage&& msg)")
472 cog.outl(" {")
473 cog.outl(" if (accepts(msg))")
474 cog.outl(" {")
475 cog.outl(" add_new_message(etl::move(msg));")
476 cog.outl(" valid = true;")
477 cog.outl(" }")
478 cog.outl(" else")
479 cog.outl(" {")
480 cog.outl(" valid = false;")
481 cog.outl(" }")
482 cog.outl("")
483 cog.outl(" ETL_ASSERT(valid, ETL_ERROR(unhandled_message_exception));")
484 cog.outl(" }")
485 cog.outl("#include \"diagnostic_pop.h\"")
486 cog.outl("#endif")
487 cog.outl("")
488 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION) && !defined(ETL_COMPILER_GREEN_HILLS)")
489 cog.outl(" //********************************************")
490 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
491 cog.out(" template <typename TMessage, typename = typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
492 for t in range(1, n):
493 cog.out("T%s, " % t)
494 cog.outl("T%s> >::value &&" % n)
495 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
496 cog.out(" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
497 for t in range(1, n):
498 cog.out("T%s, " % t)
499 cog.outl("T%s>::value, int>::type>" % n)
500 cog.outl(" explicit message_packet(TMessage&& /*msg*/)")
501 cog.outl(" : valid(true)")
502 cog.outl(" {")
503 generate_static_assert_cpp11(n)
504 cog.outl(" }")
505 cog.outl("#include \"diagnostic_pop.h\"")
506 cog.outl("#else")
507 cog.outl(" //********************************************")
508 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
509 cog.outl(" template <typename TMessage>")
510 cog.out(" explicit message_packet(const TMessage& /*msg*/, typename etl::enable_if<!etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::message_packet<")
511 for t in range(1, n):
512 cog.out("T%s, " % t)
513 cog.outl("T%s> >::value &&" % n)
514 cog.outl(" !etl::is_same<typename etl::remove_cvref<TMessage>::type, etl::imessage>::value &&")
515 cog.out(" !etl::is_one_of<typename etl::remove_cvref<TMessage>::type, ")
516 for t in range(1, n):
517 cog.out("T%s, " % t)
518 cog.outl("T%s>::value, int>::type = 0)" % n)
519 cog.outl(" : valid(true)")
520 cog.outl(" {")
521 generate_static_assert_cpp03(n)
522 cog.outl(" }")
523 cog.outl("#include \"diagnostic_pop.h\"")
524 cog.outl("#endif")
525 cog.outl("")
526 cog.outl(" //**********************************************")
527 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
528 cog.outl(" message_packet(const message_packet& other)")
529 cog.outl(" : valid(other.is_valid())")
530 cog.outl(" {")
531 cog.outl(" if (valid)")
532 cog.outl(" {")
533 cog.outl(" add_new_message(other.get());")
534 cog.outl(" }")
535 cog.outl(" }")
536 cog.outl("#include \"diagnostic_pop.h\"")
537 cog.outl("")
538 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
539 cog.outl(" //**********************************************")
540 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
541 cog.outl(" message_packet(message_packet&& other)")
542 cog.outl(" : valid(other.is_valid())")
543 cog.outl(" {")
544 cog.outl(" if (valid)")
545 cog.outl(" {")
546 cog.outl(" add_new_message(etl::move(other.get()));")
547 cog.outl(" }")
548 cog.outl(" }")
549 cog.outl("#include \"diagnostic_pop.h\"")
550 cog.outl("#endif")
551 cog.outl("")
552 cog.outl(" //**********************************************")
553 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
554 cog.outl(" message_packet& operator =(const message_packet& rhs)")
555 cog.outl(" {")
556 cog.outl(" delete_current_message();")
557 cog.outl(" valid = rhs.is_valid();")
558 cog.outl(" if (valid)")
559 cog.outl(" {")
560 cog.outl(" add_new_message(rhs.get());")
561 cog.outl(" }")
562 cog.outl("")
563 cog.outl(" return *this;")
564 cog.outl(" }")
565 cog.outl("#include \"diagnostic_pop.h\"")
566 cog.outl("")
567 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
568 cog.outl(" //**********************************************")
569 cog.outl("#include \"diagnostic_uninitialized_push.h\"")
570 cog.outl(" message_packet& operator =(message_packet&& rhs)")
571 cog.outl(" {")
572 cog.outl(" delete_current_message();")
573 cog.outl(" valid = rhs.is_valid();")
574 cog.outl(" if (valid)")
575 cog.outl(" {")
576 cog.outl(" add_new_message(etl::move(rhs.get()));")
577 cog.outl(" }")
578 cog.outl("")
579 cog.outl(" return *this;")
580 cog.outl(" }")
581 cog.outl("#include \"diagnostic_pop.h\"")
582 cog.outl("#endif")
583 cog.outl("")
584 cog.outl(" //********************************************")
585 cog.outl(" ~message_packet()")
586 cog.outl(" {")
587 cog.outl(" delete_current_message();")
588 cog.outl(" }")
589 cog.outl("")
590 cog.outl(" //********************************************")
591 cog.outl(" etl::imessage& get() ETL_NOEXCEPT")
592 cog.outl(" {")
593 cog.outl(" return *static_cast<etl::imessage*>(data);")
594 cog.outl(" }")
595 cog.outl("")
596 cog.outl(" //********************************************")
597 cog.outl(" const etl::imessage& get() const ETL_NOEXCEPT")
598 cog.outl(" {")
599 cog.outl(" return *static_cast<const etl::imessage*>(data);")
600 cog.outl(" }")
601 cog.outl("")
602 cog.outl(" //********************************************")
603 cog.outl(" bool is_valid() const")
604 cog.outl(" {")
605 cog.outl(" return valid;")
606 cog.outl(" }")
607 cog.outl("")
608 cog.outl(" //**********************************************")
609 cog.outl(" static ETL_CONSTEXPR bool accepts(etl::message_id_t id)")
610 cog.outl(" {")
611 generate_accepts_return(n)
612 cog.outl(" }")
613 cog.outl("")
614 cog.outl(" //**********************************************")
615 cog.outl(" static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)")
616 cog.outl(" {")
617 cog.outl(" return accepts(msg.get_message_id());")
618 cog.outl(" }")
619 cog.outl("")
620 cog.outl(" //**********************************************")
621 cog.outl(" template <etl::message_id_t Id>")
622 cog.outl(" static ETL_CONSTEXPR bool accepts()")
623 cog.outl(" {")
624 generate_accepts_return_compile_time(n)
625 cog.outl(" }")
626 cog.outl("")
627 cog.outl(" //**********************************************")
628 cog.outl(" template <typename TMessage>")
629 cog.outl(" static ETL_CONSTEXPR")
630 cog.outl(" typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type")
631 cog.outl(" accepts()")
632 cog.outl(" {")
633 generate_accepts_return_compile_time_TMessage(n)
634 cog.outl(" }")
635 cog.outl("")
636 cog.outl(" enum")
637 cog.outl(" {")
638 cog.out(" SIZE = etl::largest<")
639 for t in range(1, n):
640 cog.out("T%d, " % t)
641 cog.outl("T%s>::size," % n)
642 cog.out(" ALIGNMENT = etl::largest<")
643 for t in range(1, n):
644 cog.out("T%d, " % t)
645 cog.outl("T%s>::alignment" % n)
646 cog.outl(" };")
647 cog.outl("")
648 cog.outl("private:")
649 cog.outl("")
650 cog.outl(" //********************************************")
651 cog.outl(" #include \"diagnostic_uninitialized_push.h\"")
652 cog.outl(" void delete_current_message()")
653 cog.outl(" {")
654 cog.outl(" if (valid)")
655 cog.outl(" {")
656 cog.outl(" etl::imessage* pmsg = static_cast<etl::imessage*>(data);")
657 cog.outl("")
658 cog.outl("")
659 cog.outl("#if ETL_HAS_VIRTUAL_MESSAGES")
660 cog.outl(" pmsg->~imessage();")
661 cog.outl("#else")
662 cog.outl(" delete_message(pmsg);")
663 cog.outl("#endif")
664 cog.outl(" }")
665 cog.outl(" }")
666 cog.outl(" #include \"diagnostic_pop.h\"")
667 cog.outl("")
668 cog.outl(" //********************************************")
669 cog.outl(" void delete_message(etl::imessage* pmsg)")
670 cog.outl(" {")
671 cog.outl(" switch (pmsg->get_message_id())")
672 cog.outl(" {")
673 for t in range(1, n + 1):
674 cog.out(" case T%d::ID: static_cast<const T%d" %(t, t))
675 cog.outl("*>(pmsg)->~T%d(); break;" % t)
676 cog.outl(" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
677 cog.outl(" }")
678 cog.outl(" }")
679 cog.outl("")
680 cog.outl(" //********************************************")
681 cog.outl(" void add_new_message(const etl::imessage& msg)")
682 cog.outl(" {")
683 cog.outl(" const size_t id = msg.get_message_id();")
684 cog.outl(" void* p = data;")
685 cog.outl("")
686 cog.outl(" switch (id)")
687 cog.outl(" {")
688 for t in range(1, n + 1):
689 cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<const T%d&>(msg)); break;" %(t, t, t))
690 cog.outl(" default: ETL_ASSERT_FAIL(ETL_ERROR(unhandled_message_exception)); break;")
691 cog.outl(" }")
692 cog.outl(" }")
693 cog.outl("")
694 cog.outl("#if ETL_USING_CPP11 && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03_IMPLEMENTATION)")
695 cog.outl(" //********************************************")
696 cog.outl(" void add_new_message(etl::imessage&& msg)")
697 cog.outl(" {")
698 cog.outl(" const size_t id = msg.get_message_id();")
699 cog.outl(" void* p = data;")
700 cog.outl("")
701 cog.outl(" switch (id)")
702 cog.outl(" {")
703 for t in range(1, n + 1):
704 cog.outl(" case T%d::ID: ::new (p) T%d(static_cast<T%d&&>(msg)); break;" %(t, t, t))
705 cog.outl(" default: break;")
706 cog.outl(" }")
707 cog.outl(" }")
708 cog.outl("#endif")
709 cog.outl("")
710 cog.outl(" typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;")
711 cog.outl(" bool valid;")
712 cog.outl("};")
713 ]]]*/
714 /*[[[end]]]*/
715
716 //***************************************************************************
717 // Specialisation for 0 message types.
718 //***************************************************************************
719 template <>
720 class message_packet<void, void, void, void, void, void, void, void,
721 void, void, void, void, void, void, void, void>
722 {
723 public:
724
725#if ETL_USING_CPP11
726 using message_types = etl::type_list<>;
727#endif
728
729 ETL_CONSTEXPR message_packet() ETL_NOEXCEPT
730 : valid(false)
731 {
732 }
733
734 static ETL_CONSTEXPR bool accepts(etl::message_id_t)
735 {
736 return false;
737 }
738
739 static ETL_CONSTEXPR bool accepts(const etl::imessage&)
740 {
741 return false;
742 }
743
744 template <etl::message_id_t Id>
745 static ETL_CONSTEXPR bool accepts()
746 {
747 return false;
748 }
749
750 template <typename TMessage>
751 static ETL_CONSTEXPR typename etl::enable_if<etl::is_base_of<etl::imessage, TMessage>::value, bool>::type accepts()
752 {
753 return false;
754 }
755
756 bool is_valid() const
757 {
758 return valid;
759 }
760
761 enum
762 {
763 SIZE = 0U,
764 ALIGNMENT = 1U
765 };
766
767 private:
768
769 bool valid;
770 };
Definition message.h:75
Definition message_packet_cpp03.h:41
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40