comparison src/gpf/inc/tdc_base.h @ 5:1ea54a97e831

src/gpf: import of Magnetite src/gpf3
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 08:11:07 +0000
parents
children
comparison
equal deleted inserted replaced
4:6e457872f745 5:1ea54a97e831
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul : TDC
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose :
18 +-----------------------------------------------------------------------------
19 */
20
21 #if defined TDC_PRECOMPILE && !defined TDC_BASE_TDC_H
22 #pragma message("TDC_BASE.H ENTERING PRECOMPILE MODE")
23 /*
24 This code is added to make a prettier and easier to navigate .i-file
25 Purpose:
26 A) maintain info of which macro codes come from
27 B) maintain line breaks from inside macros
28
29 The process include the following steps:
30
31 1:
32 Command:
33 perl tdc_h.pl ..\..\..\..\INC\tdc_base.h >tdc_base.tdc_h
34 (add TDC_BEGIN_MACRO TDC_NL TDC_MACRO_END TDC_NL macros)
35
36 Example transformation:
37 Input: (tdc_base.h)
38 */
39 #define MULTI_LINE_MACRO(A) ... \
40 ... \
41 ...
42 #define SINGLE_LINE_MACRO(A) ...
43 /*
44 Output: (tdc_base.tdc_h)
45 #define MULTI_LINE_MACRO(A) TDC_BEGIN_MACRO(MULTI_LINE_MACRO(A)) ... TDC_NL\
46 ... TDC_NL\
47 ... TDC_MACRO_END()
48 #define SINGLE_LINE_MACRO(A) TDC_MACRO(SINGLE_LINE_MACRO(A)) ...
49 2:
50 Command:
51 EDI preprocess .cpp-file with TDC and TDC_PRECOMPILE defined
52 (as a consequence tdc_base.tdc_h is used instead of tdc_base.h)
53
54 Example transformation:
55 Input: (use_some_macro.cpp)
56 MULTI_LINE_MACRO(B)
57 Output: (use_some_macro.i)
58 TDC_BEGIN_MACRO("MULTI_LINE_MACRO(B)") ... TDC_NL ... TDC_NL ... TDC_MACRO_END()
59
60 3:
61 Command:
62 perl tdc_i.pl .\tdc.i >tdc.tdc_i
63 (replace TDC_NL with real newline, make pretty indention
64
65 Example transformation:
66 Input: (use_some_macro.i)
67 TDC_BEGIN_MACRO("MULTI_LINE_MACRO(B)") ... TDC_NL ... TDC_NL ... TDC_MACRO_END
68 Output: (use_some_macro.tdc_i)
69 TDC_BEGIN_MACRO("MULTI_LINE_MACRO(B)") ...
70 ...
71 ... TDC_MACRO_END()
72
73 */
74 #define TDC_BASE_TDC_H
75 #include "tdc_base.tdc_h"
76 #endif //defined TDC_PRECOMPILE && !defined TDC_BASE_TDC_H
77
78 #ifndef TDC_BASE_H // stadard h-file guard
79 #define TDC_BASE_H
80
81 //============================================================================
82 /// \defgroup Configuration
83 //\{
84
85 ///memory leak detection
86 #define noTDC_USE_ALLOC_DEBUG_COUNTER
87
88 #define TDC_DEBUG
89
90 #define TDC_NO_PROFILING
91
92 ///include T_PORT
93 #define TDC_PORT
94
95 #define noM_TDC_MESSAGE_DEMO
96
97 ///typeinfo not needed, everything we need is in cccdgen tables
98 #define noTDC_TYPEINFO
99
100 ///never defined
101 #define noDOT_COMPLETE
102
103 //\}
104
105 //============================================================================
106 // include files
107 //============================================================================
108
109 //tdc_test_header_begin
110 //extern int dummy_to_make_namespace_non_empty;
111 //} //temporare leave namespace tdc
112 #ifndef TDC_TEST_I_CPP
113 #include <setjmp.h>
114 #include <stddef.h>
115 #include <typeinfo.h>
116 #include <malloc.h>
117 #include <string.h>
118 #endif
119 //namespace tdc { // reenter namespace tdc
120
121 //============================================================================
122 // controling warning levels from compilers
123 //============================================================================
124
125 #pragma warning(disable:4786)
126 //tdc_test_header_end
127
128 /*
129 general info members are constructed etc by generic functions so these are normal ok when
130 arriving inside M_TDC_... :
131 Warning 1539: member 'T_raw::handle' (line 3242, file M:\gpf\inc\tdc_base.h, module M:\gpf\util\tap\tdc\src\tdc_lib_main.cpp) not assigned by assignment operator
132 Warning 1401: member 'T_raw::handle' (line 3242, file M:\gpf\inc\tdc_base.h, module M:\gpf\util\tap\tdc\src\tdc_lib_main.cpp) not initialized by constructor
133 */
134
135 /*lint -e1717*/ //Info 1717: empty prototype for function declaration, assumed '(void)'
136 /*lint -e1505*/ //TODO: add access specifier for all base classes
137 /*lint -DLINT*/
138 /*lint -esym(18,BUF_*)*/ //CCDGEN generates surplus typedefs for _dsc.h-files
139 /*#lint -libdir(M:\gpf\util\teststack\inc\tdcinc)*/
140 /*#lint -libh(M:\gpf\util\teststack\inc\tdcinc\p_xx_tdc_1.h)*/
141
142 /// this lint option is used inside a macro, VA can not handle comments in macros correctly
143 #define TDC_LINT_UNUSED_MEMBER /*lint -e{754}*/
144 #define TDC_LINT_UNASSIGNED_MEMBER /*lint -e{1539}*/
145 #define TDC_LINT_UNCOPIED_BASE /*lint -e{1538}*/
146 #define TDC_LINT_NO_SELFASSIGN_TEST /*lint -e{1529}*/
147 #define TDC_LINT_UNINITIALIZED_MEMBER /*lint -e{1401}*/
148 #define TDC_LINT_POSSIBLE_UNHANDLE_POINTER_MEMBER /*lint -e{1740}*/
149
150 //============================================================================
151 /// \defgroup Constants
152 //============================================================================
153 //\{
154
155 #define FALSE 0
156 #define TRUE 1
157
158 /// TDSConstant comming from macros.h -> used in cc.doc
159 #define NOT_PRESENT_8BIT 0xff
160
161 /// TDSConstant comming from macros.h -> used in cc.doc
162 #define NOT_PRESENT_16BIT 0xffff
163
164 /// TDSConstant comming from macros.h -> used in cc.doc
165 #define NOT_PRESENT_32BIT 0xffffffffL
166
167 //\}
168
169 //============================================================================
170
171 #if TDC_DEBUG_DOT_COMPLETE
172 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_0
173 {
174 int i0;
175 };
176
177 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1
178 {
179 int i;
180 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_0 operator->(){}
181 };
182
183 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1A()
184 {
185 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
186 s.
187 i;
188 s->
189 i0;
190 }
191 #else
192 #endif
193
194 //============================================================================
195 // partial compiling tdcinc\*.cpp
196 //============================================================================
197
198 /** VC6 can not handle more than 30000 types per compilation unit, but this
199 has not so much to do with this, here we are trying to minimize the overall
200 memory usage during compilation, this is a problem for the umts asn1 file
201 the big isue is that determin this number is not an excat sicense since
202 VC give NO hint on whic entry is coursing this problem if it ocour during
203 pass2 of the compilation
204
205 to overcome this problem CCDGEN generate additional gaurds in tdcinc\*.cpp files
206
207 enum form
208
209 #if TDC_ENUM_PART
210 #ifndef TDC_SKIP_FORWARD_MENUM_prefix_enumtypename
211 M_TDC_POST_MENUM (prefix_enumtypename)
212 #endif
213 #endif // TDC_ENUM_PART
214
215 other form (example is for MSG but PRIM, STRUCT, UNION etc. use the same layout)
216
217 #if N / TDC_SIZE == TDC_PART
218 #ifndef TDC_SKIP_FORWARD_msgname
219 M_TDC_POST_MSG (msgname)
220 #endif
221 #endif // N / TDC_SIZE == TDC_PART
222
223 where N is a sequence number running from 0 and onwards, incremented by 1 for
224 each struct in the file
225
226 by defining TDC_SIZE and TDC_PART the source files can be partial compiled
227 the default behaviour is to compile the hole file at once
228
229 */
230
231 #ifndef TDC_PART
232 #define TDC_SIZE 99999L // number of structs per compilation
233 #define TDC_PART 0L // which struct part to compile in this session
234 #define TDC_ENUM_PART 1 // if enum part is to be compiled in this session
235 #elif TDC_PART == -1
236 #define TDC_ENUM_PART 1 // if enum part is to be compiled in this session
237 #else
238 #define TDC_ENUM_PART 0 // if enum part is to be compiled in this session
239 #endif
240
241 //============================================================================
242 // configuration side effects
243 //============================================================================
244
245 #ifndef TDC_DESCRIPTOR
246
247 #define NO_TDC_DESCRIPTOR
248
249 #else //TDC_DESCRIPTOR
250
251 #define __T_TDC_INTERFACE_MESSAGE__
252 #define __T_TDC_INTERFACE_PRIMITIVE__
253
254 #endif //TDC_DESCRIPTOR
255
256 //============================================================================
257 /// \defgroup dot_complete helper macros
258 //============================================================================
259 //\{
260
261 #if DOT_COMPLETE
262 #define TDC_DOT_COMPLETE_HIDE(code) \
263 /* nothing */
264 struct T_TDC_EMPTY {};
265 #else//DOT_COMPLETE
266 #define TDC_DOT_COMPLETE_HIDE(code) \
267 code
268 #endif//DOT_COMPLETE
269
270 //\}
271
272 //============================================================================
273 //
274 //============================================================================
275
276 ///tdc_test_header_begin
277 #ifndef M_TDC_DOC
278 #if DOT_COMPLETE
279
280 void TDC_NOTHING() {} // generate code for breakpoint
281 size_t TDC_LENGTHOF(array) {}
282 void TDC_DYNAMIC_DEAD_CODE() {} // program execution is not suposed to reach this point
283
284 #else //DOT_COMPLETE
285
286 void tdc_nothing();
287 /** generate code for breakpoint */
288 #define TDC_NOTHING() \
289 tdc_nothing()
290
291 #define TDC_DYNAMIC_DEAD_CODE() tdc_dynamic_dead_code() // program execution is not suposed to reach this point
292
293
294 #define TDC_LENGTHOF(array) (size_t(sizeof array / sizeof *array))
295
296 #define M_TDC_STRING1(text) #text
297 /** expand macros before stringify */
298 #define M_TDC_STRING(text) M_TDC_STRING1(text)
299
300 #endif //DOT_COMPLETE
301 #endif //M_TDC_DOC
302
303 // macro to show pragma message with file name and line number when compiling (see M_TDC_MESSAGE_DEMO below)
304 //#define M_TDC_MESSAGE(text) message(__FILE__ "(" M_TDC_STRING(__LINE__) ") : message: \'" text "\'")
305 #define M_TDC_MESSAGE(text) message(__FILE__ "(" M_TDC_STRING(__LINE__) ") : message: \'" M_TDC_STRING(text) "\'")
306 #ifdef M_TDC_MESSAGE_DEMO
307 // e.g. show how a macro is expanded
308 #define MY(X) MY_##X
309 #pragma M_TDC_MESSAGE(M_TDC_STRING(MY(Y)))
310 // compiler output: \gpf\inc\tdc_base.h(130) : message: 'MY_Y'
311 #endif
312
313 /// \defgroup IN_CLASS values for IN_CLASS macro argument
314 //\{
315 #define M_TDC_IN_CLASS(code) code
316 #define M_TDC_NOT_IN_CLASS(code)
317 #define M_TDC_NOT_M_TDC_IN_CLASS(code)
318 #define M_TDC_NOT_M_TDC_NOT_IN_CLASS(code) code
319 //\}
320
321 /// \defgroup WITH_BODY values for WITH_BODY macro argument
322 //\{
323 #define M_TDC_WITH_BODY(code) code
324 #define M_TDC_WITHOUT_BODY(code) ;
325 //\}
326
327 /// temporary removed multiline comments in multiline macros
328 /// <pre>(some compilers have problems with constructions like:
329 /// #define MY_MACRO() /* \\
330 /// my comment */ my_code
331 /// )</pre>
332 #define M_TDC_COMMENT(code) ;
333
334
335 /// \defgroup MacroTesting
336 /** for testing macros
337 * these macros is only used when tdc.dsw has the active project set to "tdc_lib - Win32 Precompile"
338 */
339 //\{
340 #define TDC_MACRO_BEGIN_(name,line)
341 #define TDC_MACRO_(name,line)
342 #define TDC_MACRO_END_()
343 //\}
344
345 // /tdc_test_header_end
346
347 #ifndef USE_TDC_TEST_I_II// during testing we see this part in the preprocessed file tdc_test_i.ii
348
349 struct T_TDC_BASE_DOT_COMPLETE_TEST
350 {
351 int i; //HINT
352 };
353
354 #define TDC_TBD() tdc_tbd(__FILE__, __LINE__)
355
356 #define TDC_ASSERT(condition) tdc_assert(condition,#condition,__FILE__,__LINE__)
357
358 #ifndef TDC_DEBUG
359 #define IF_TDC_DEBUG(code)
360 #else
361 #define IF_TDC_DEBUG(code) code
362 #endif
363
364 #ifndef TDC_TEST_PROFILE
365
366 #define TDC_PURE_BODY(code)\
367 = 0;
368
369 #else
370
371 #define TDC_PURE_BODY(code)\
372 {\
373 tdc_pure_body();\
374 code\
375 }\
376
377 #endif
378
379 #if TDC_DEBUG_DOT_COMPLETE
380 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1C()
381 {
382 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
383 s.
384 i;
385 }
386 #else
387 #endif
388
389 void tdc_cursor_trace (char* file, int line, char* format, ...);
390 void tdc_trace (char* format, ...);
391 void __declspec(noreturn) tdc_trace_fail (char* format, ...); /*lint -sem(tdc_trace_fail,r_no)*/
392 extern "C" void tdc_usi_trace (char* format, ...);
393 void __declspec(noreturn) tdc_internal_error (char* format, ...); /*lint -sem(tdc_internal_error,r_no)*/
394 void __declspec(noreturn) tdc_user_error (char* format, ...); /*lint -sem(tdc_user_error,r_no)*/
395 void tdc_check_array_assignment(const void* that, const void* address);
396
397 // some error reporting functions, which have no argument becourse they have to be called from a lot of places
398 void __declspec(noreturn) tdc_tbd(char* file, int line); /*lint -sem(tdc_tbd,r_no)*/// this facility is yet to be defined i.e. implemented
399 void __declspec(noreturn) tdc_tbd(char* message); /*lint -sem(tdc_tbd,r_no)*/// this facility is yet to be defined i.e. implemented
400
401 void __declspec(noreturn) tdc_tbd_pointer_assignment_error();
402 void __declspec(noreturn) tdc_tbd_array_assignment_error();
403 void __declspec(noreturn) tdc_tbd_array_assignment_error_T_ARRAY();
404 void __declspec(noreturn) tdc_tbd_xxx_constructor_call(char* message);
405 void __declspec(noreturn) tdc_tbd_constructor_call(char* message);
406 void __declspec(noreturn) tdc_tbd_primitive_union_constructor_call();
407 void __declspec(noreturn) tdc_tbd_message_union_constructor_call();
408
409 void tdc_pure_body();
410 void tdc_dynamic_dead_code(); // program execution is not suposed to reach this point
411 void tdc_missing_h_file(); // use of AIM/SAP not included
412 void tdc_assert(int condition, char* message, char* file, int line);
413
414 //============================================================================
415
416 #if TDC_DEBUG_DOT_COMPLETE
417 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1D()
418 {
419 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
420 s.
421 i;
422 }
423 #else
424 #endif
425
426 //----------------------------------------------------------------------------
427
428 //tdc_test_header_begin
429
430 //----------------------------------------------------------------------------
431 //
432 //----------------------------------------------------------------------------
433 #ifdef M_TDC_DOC
434 /*
435 The definitions in this sections is only present to be able to generate call graphs to be used
436 in documentation (call graphs are generated with SourceInsight 3.5)
437 */
438 /// \defgroup NamingScheme Naming convention template tree
439 //\{
440 /// \callgraph
441 #define BASE() MAIN() PART()
442 #define MAIN() all_unions() PRIM_and_MSG() XXX()
443 #define all_unions() PRMITIVE_UNION() MESSAGE_UNION()
444 #define XXX() XXX_PRMITIVE_UNION() XXX_MESSAGE_UNION()
445 #define PRIM_and_MSG() PRIM() MSG()
446 #define PART() COMP() VAR()
447 #define COMP() STRUCT() UNION()
448 #define VAR() INT() ENUM()
449 #define ENUM() PENUM() MENM()
450 #define PRMITIVE_UNION()
451 #define MESSAGE_UNION()
452 #define XXX_PRMITIVE_UNION()
453 #define XXX_MESSAGE_UNION()
454 #define PRIM()
455 #define MSG()
456 #define STRUCT() PSTRUCT() MSTRUCT()
457 #define UNION() PUNION() PUNION()
458 #define PSTRUCT()
459 #define MSTRUCT()
460 #define PUNION()
461 #define PUNION()
462 #define PENUM()
463 #define MENM()
464 #define INT()
465 //\}
466 // base entries
467 /*
468 #define M_TDC_BASE\
469 M_TDC_FORWARD_BASE(SHORT_NAME, T_HANDLE)\
470 M_TDC_INSTANCE_ADDITIONAL_BASE(IN_CLASS, WITH_BODY, T_INTERFACE_, T_INSTANCE, T_HANDLE_)\
471 M_TDC_INTERFACE_ADDITIONAL_BASE(IN_CLASS, WITH_BODY, T_INTERFACE, T_INSTANCE_, T_HANDLE)\
472 M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
473 M_TDC_FORWARD_BASE(SHORT_NAME, T_HANDLE)\
474 //*/
475 //TDC keywords
476 void TDC_keywords()
477 {
478 FAIL();
479 PASS();
480 SEND(primitive);
481 AWAIT(primitive);
482 START_TIMEOUT(timeout);
483 WAIT_TIMEOUT();
484 MUTE(timeout);
485 COMMAND(command);
486 TIMEOUT(timeout);
487 PARKING(enable);
488 ALT() //dummy "()"to force call graph
489 {
490 ON(await);
491 OTHERWISE();
492 }
493 TRAP() //dummy "()"to force call graph
494 {
495 }
496 ONFAIL() //dummy "()"to force call graph
497 {
498 }
499 }
500 #endif
501 //----------------------------------------------------------------------------
502
503 #if DOT_COMPLETE_DEFINES
504
505 #define CCC(COMMENT)
506
507 //----------------------------------------------------------------------------
508 // macros to generate dummy functions body
509 //----------------------------------------------------------------------------
510
511 #define M_TDC_TYPE_NAME\
512 //for(;;); /* no error for missing return */
513
514 #define T_TDC_TYPE_NAME
515
516 //----------------------------------------------------------------------------
517 // macros to repeat stuff that is similar in many descriptor classes
518 //----------------------------------------------------------------------------
519
520 #define M_TDC_FORWARD_PRIM(SAP,SHORT_NAME)
521 #define M_TDC_FORWARD_PSTRUCT(SHORT_NAME)
522 #define M_TDC_FORWARD_PUNION(SHORT_NAME)
523 #define M_TDC_FORWARD_SDU(SHORT_NAME)
524 #define M_TDC_FORWARD_PENUM(SHORT_NAME)
525 //-----
526 #define M_TDC_FORWARD_MSG(SHORT_NAME)
527 #define M_TDC_FORWARD_MSTRUCT(SHORT_NAME)
528 #define M_TDC_FORWARD_MUNION(SHORT_NAME)
529 #define M_TDC_FORWARD_MENUM(SHORT_NAME)
530 //-----
531 #define M_TDC_FORWARD_INT(SHORT_NAME)
532 #define M_TDC_FORWARD_XXX_PRIMITIVE_UNION(SAP)
533 #define M_TDC_FORWARD_XXX_MESSAGE_UNION(MSG)
534 #define M_TDC_FORWARD_PRIMITIVE()
535 #define M_TDC_FORWARD_MESSAGE()
536
537 //----------------------------------------------------------------------------
538 // macros to repeat stuff that is similar in many descriptor classes
539 //----------------------------------------------------------------------------
540
541 #define M_TDC_DESCRIPTOR_PRIM_ADDITIONAL(SHORT_NAME)
542 #define M_TDC_DESCRIPTOR_PSTRUCT_ADDITIONAL(SHORT_NAME)
543 #define M_TDC_DESCRIPTOR_PUNION_ADDITIONAL(SHORT_NAME)
544 #define M_TDC_DESCRIPTOR_SDU_ADDITIONAL(SHORT_NAME)
545 #define M_TDC_DESCRIPTOR_PENUM_ADDITIONAL(SHORT_NAME)
546 //-----
547 #define M_TDC_DESCRIPTOR_MSG_ADDITIONAL(SHORT_NAME)
548 #define M_TDC_DESCRIPTOR_MSTRUCT_ADDITIONAL(SHORT_NAME)
549 #define M_TDC_DESCRIPTOR_MUNION_ADDITIONAL(SHORT_NAME)
550 #define M_TDC_DESCRIPTOR_MENUM_ADDITIONAL(SHORT_NAME)
551 //-----
552 #define M_TDC_DESCRIPTOR_INT_ADDITIONAL(SHORT_NAME)
553 #define M_TDC_DESCRIPTOR_XXX_PRIMITIVE_UNION_ADDITIONAL(SAP)
554 #define M_TDC_DESCRIPTOR_XXX_MESSAGE_UNION_ADDITIONAL(MSG)
555 #define M_TDC_CREATE_DEFAULT_PRIMITIVE_DESCRIPTOR_CLASS(SAP)
556 #define M_TDC_DESCRIPTOR_PRIMITIVE_ADDITIONAL()
557 #define M_TDC_CREATE_DEFAULT_MESSAGE_DESCRIPTOR_CLASS(MSG)
558 #define M_TDC_DESCRIPTOR_MESSAGE_ADDITIONAL()
559
560 //----------------------------------------------------------------------------
561 // macros to repeat stuff that is similar in many interface classes
562 //----------------------------------------------------------------------------
563
564 #ifndef TDC_T_TDC_INTERFACE_DOT_COMPLETE_TEST
565 #define TDC_T_TDC_INTERFACE_DOT_COMPLETE_TEST
566 struct T_TDC_INTERFACE_DOT_COMPLETE_TEST
567 {
568 typedef char T_HANDLE;
569 };
570 #endif //TDC_T_TDC_INTERFACE_DOT_COMPLETE_TEST
571
572 //-----
573 #define M_TDC_INTERFACE_PRIM_ADDITIONAL(SHORT_NAME) /*nothing*/
574 #define M_TDC_INTERFACE_PSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
575 #define M_TDC_INTERFACE_PUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
576 #define M_TDC_INTERFACE_SDU_ADDITIONAL(SHORT_NAME) /*nothing*/
577 #define M_TDC_INTERFACE_PENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
578 //-----
579 #define M_TDC_INTERFACE_MSG_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
580 #define M_TDC_INTERFACE_MSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
581 #define M_TDC_INTERFACE_MUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
582 #define M_TDC_INTERFACE_MENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
583 //-----
584 #define M_TDC_INTERFACE_INT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
585 #define M_TDC_INTERFACE_XXX_PRIMITIVE_UNION_ADDITIONAL(SAP,PREFIXED_SAP) /*nothing*/
586 #define M_TDC_INTERFACE_XXX_MESSAGE_UNION_ADDITIONAL(MSG,PREFIXED_MSG) /*nothing*/
587 #define M_TDC_CREATE_DEFAULT_PRIMITIVE_INTERFACE_CLASS(SAP) /*nothing*/
588 #define M_TDC_INTERFACE_PRIMITIVE_ADDITIONAL() /*nothing*/
589 #define M_TDC_CREATE_DEFAULT_MESSAGE_INTERFACE_CLASS(MSG) /*nothing*/
590 #define M_TDC_INTERFACE_MESSAGE_ADDITIONAL() /*nothing*/
591
592 //----------------------------------------------------------------------------
593 // macros to repeat stuff that is similar in many instance classes
594 //----------------------------------------------------------------------------
595
596 #define M_TDC_INSTANCE_PRIM_ADDITIONAL(SAP,SHORT_NAME) /*nothing*/
597 #define M_TDC_INSTANCE_PSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
598 #define M_TDC_INSTANCE_PUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
599 #define M_TDC_INSTANCE_SDU_ADDITIONAL(SHORT_NAME) /*nothing*/
600 #define M_TDC_INSTANCE_PENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
601 //-----
602 #define M_TDC_INSTANCE_MSG_ADDITIONAL(MSG,SHORT_NAME) /*nothing*/
603 #define M_TDC_INSTANCE_MSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
604 #define M_TDC_INSTANCE_MUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
605 #define M_TDC_INSTANCE_MENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME) /*nothing*/
606 //-----
607 #define M_TDC_INSTANCE_INT_ADDITIONAL(SHORT_NAME) /*nothing*/
608 #define M_TDC_INSTANCE_XXX_PRIMITIVE_ADDITIONAL(SAP) /*nothing*/
609 #define M_TDC_INSTANCE_XXX_MESSAGE_ADDITIONAL(MSG) /*nothing*/
610 #define M_TDC_INSTANCE_PRIMITIVE_ADDITIONAL() /*nothing*/
611 #define M_TDC_INSTANCE_MESSAGE_ADDITIONAL() /*nothing*/
612
613 #else
614 #endif
615
616 //tdc_test_header_end
617
618 #if DOT_COMPLETE_DEFINES
619 #else //DOT_COMPLETE_DEFINES
620
621 #ifndef TDC_KEEP_CCC
622 #define CCC(COMMENT)
623 #endif //TDC_KEEP_CCC
624
625 //----------------------------------------------------------------------------
626 // macros to control namespace
627 //----------------------------------------------------------------------------
628
629 #define M_TDC_ENTER() //TODO namespace TDC {
630 #define M_TDC_LEAVE() //TODO }
631
632 //----------------------------------------------------------------------------
633 // macros to generate dummy functions body
634 //----------------------------------------------------------------------------
635
636 #define M_TDC_TYPE_NAME\
637 return T_TDC_TYPE_NAME();
638
639 //#define T_TDC_TYPE_NAME M_TDC_HIDE(T_TDC_TYPE_NAME)
640
641 //----------------------------------------------------------------------------
642 // macros to hide templates from dot-completion
643 //----------------------------------------------------------------------------
644
645 typedef char T_TDC_LEVEL;
646 extern T_TDC_LEVEL tdc_level;
647
648 //----------------------------------------------------------------------------
649 // macros to repeat stuff that is similar in many descriptor classes
650 //----------------------------------------------------------------------------
651
652 #ifndef TDC_DESCRIPTOR
653
654
655 #define M_TDC_FORWARD_BASE(SHORT_NAME,T_HANDLE)\
656 struct T_TDC_INTERFACE_##SHORT_NAME;\
657 T_TDC_INTERFACE_BASE* new_T_TDC_INTERFACE_##SHORT_NAME();\
658 struct T_HANDLE;\
659 T_TDC_HANDLE_BASE* new_##T_HANDLE();\
660
661 #define M_TDC_FORWARD_COMP(SHORT_NAME,TDC_IS)\
662 M_TDC_FORWARD_BASE(SHORT_NAME, T_TDC_HANDLE_##SHORT_NAME)\
663
664 #define M_TDC_FORWARD_VAR(SHORT_NAME)\
665 M_TDC_FORWARD_BASE(SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME)\
666
667
668 #define M_TDC_POST_BASE(SHORT_NAME,T_HANDLE)\
669 M_TDC_INTERFACE_ADDITIONAL_BASE (M_TDC_NOT_IN_CLASS, M_TDC_WITH_BODY, T_TDC_INTERFACE_##SHORT_NAME, T_##SHORT_NAME, T_HANDLE)\
670 M_TDC_INSTANCE_ADDITIONAL_BASE (M_TDC_NOT_IN_CLASS, M_TDC_WITH_BODY, T_TDC_INTERFACE_##SHORT_NAME, T_##SHORT_NAME, T_HANDLE)\
671
672 #define M_TDC_POST_XXX(SHORT_NAME,TDC_IS)\
673 M_TDC_POST_BASE(SHORT_NAME, T_TDC_HANDLE_##SHORT_NAME)\
674
675 #define M_TDC_POST_COMP(SHORT_NAME,TDC_IS)\
676 M_TDC_POST_BASE(SHORT_NAME, T_TDC_HANDLE_##SHORT_NAME)\
677
678 #define M_TDC_POST_VAR(SHORT_NAME)\
679 M_TDC_POST_BASE(SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME)\
680
681
682 #else //TDC_DESCRIPTOR
683
684
685 #define M_TDC_FORWARD_BASE(SHORT_NAME,T_HANDLE)\
686
687 #define M_TDC_FORWARD_COMP(SHORT_NAME,TDC_IS)\
688 M_TDC_FORWARD_DESCRIPTOR_COMP(SHORT_NAME,TDC_IS)\
689
690 // TODO:eliminate forwards: T_##SHORT_NAME and T_TDC_INTERFACE_##SHORT_NAME
691 #define M_TDC_FORWARD_VAR(SHORT_NAME)\
692 M_TDC_FORWARD_BASE(SHORT_NAME,T_TDC_HANDLE_##SHORT_NAME)\
693 struct T_TDC_DESCRIPTOR_##SHORT_NAME;\
694 struct T_##SHORT_NAME;\
695 struct T_TDC_INTERFACE_##SHORT_NAME;\
696 typedef T_TDC_DESCRIPTOR_##SHORT_NAME T_TDC_HANDLE_##SHORT_NAME;\
697 T_TDC_HANDLE_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME();\
698
699 #define M_TDC_POST_DESCRIPTOR_BASE(SHORT_NAME,T_HANDLE)\
700 T_TDC_HANDLE_BASE* new_##T_HANDLE()\
701 {\
702 return new T_HANDLE;\
703 }\
704
705 #if TDC_DEBUG_DOT_COMPLETE
706 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6
707 {
708 int i6;
709 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
710 };
711
712 inline void dot_complete_test(){
713 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
714 tdc_debug_dot_complete__tdc_h. i6;
715 tdc_debug_dot_complete__tdc_h-> i;
716 }
717 #else
718 #endif
719
720 #define M_TDC_POST_XXX(SHORT_NAME,TDC_IS)\
721 M_TDC_POST_DESCRIPTOR_BASE(SHORT_NAME,T_TDC_HANDLE_##SHORT_NAME)\
722 T_TDC_DESCRIPTOR_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME ()\
723 {\
724 return new T_TDC_DESCRIPTOR_##SHORT_NAME;\
725 }\
726
727 #define M_TDC_POST_COMP(SHORT_NAME, TDC_IS)\
728 M_TDC_POST_DESCRIPTOR_COMP(SHORT_NAME, TDC_IS)\
729
730 #define M_TDC_POST_VAR(SHORT_NAME)\
731 M_TDC_POST_DESCRIPTOR_BASE(SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME)\
732
733
734 #endif //TDC_DESCRIPTOR
735
736
737 #define M_TDC_FORWARD_DESCRIPTOR_COMP(SHORT_NAME,TDC_IS)\
738 M_TDC_HANDLE(M_TDC_IN_CLASS,M_TDC_WITHOUT_BODY,SHORT_NAME,TDC_IS)\
739
740 #define M_TDC_POST_DESCRIPTOR_COMP(SHORT_NAME, TDC_IS)\
741 M_TDC_POST_DESCRIPTOR_BASE(SHORT_NAME,T_TDC_HANDLE_##SHORT_NAME)\
742 T_TDC_DESCRIPTOR_BASE* T_TDC_HANDLE_##SHORT_NAME::implement_new_descriptor () const\
743 {\
744 return new T_TDC_DESCRIPTOR_##SHORT_NAME;\
745 }\
746 M_TDC_HANDLE_ADDITIONAL(M_TDC_NOT_IN_CLASS,M_TDC_WITH_BODY,T_TDC_HANDLE_##SHORT_NAME,SHORT_NAME,TDC_IS)\
747
748
749 /*lint -emacro(1706,M_TDC_HANDLE_ADDITIONAL)*/ //we don't want M_TDC_NOT(IN_CLASS(...)) for all the scope operators
750 #define M_TDC_HANDLE_ADDITIONAL(IN_CLASS,WITH_BODY,T_HANDLE_,SHORT_NAME,TDC_IS)\
751 IN_CLASS(virtual) char* T_HANDLE_::get_name () const\
752 WITH_BODY({\
753 return #SHORT_NAME;\
754 })\
755 IN_CLASS(virtual) long T_HANDLE_::get_sizeof ()\
756 WITH_BODY({\
757 return sizeof *this;\
758 })\
759 IN_CLASS(virtual) T_TDC_IS_ENUM T_HANDLE_::is ()\
760 WITH_BODY({\
761 return T_TDC_IS_ENUM (TDC_IS_COMP | TDC_IS);\
762 })\
763 IN_CLASS(static) T_TDC_HANDLE_BASE* T_HANDLE_::implement_new_handle ()\
764 WITH_BODY({\
765 return new T_HANDLE_();\
766 })\
767
768 #define M_TDC_HANDLE(IN_CLASS,WITH_BODY,SHORT_NAME,TDC_IS)\
769 struct T_TDC_DESCRIPTOR_##SHORT_NAME;\
770 struct T_TDC_HANDLE_##SHORT_NAME:T_TDC_HANDLE_BASE\
771 {\
772 typedef T_TDC_DESCRIPTOR_##SHORT_NAME T_DESCRIPTOR;\
773 M_TDC_HANDLE_ADDITIONAL(IN_CLASS,WITH_BODY,T_TDC_HANDLE_##SHORT_NAME,SHORT_NAME,TDC_IS)\
774 M_TDC_DESCRIPTOR_HANDLE_ADDITIONAL_PART (T_TDC_DESCRIPTOR_##SHORT_NAME)\
775 protected:\
776 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const;\
777 };\
778
779 #if TDC_DEBUG_DOT_COMPLETE
780 inline void dot_complete_test(){
781 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
782 tdc_debug_dot_complete__tdc_h. i6;
783 tdc_debug_dot_complete__tdc_h-> i;
784 }
785 #else
786 #endif
787
788 //------
789
790 #define M_TDC_FORWARD_PRIM(SHORT_NAME)\
791 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_PRIM)
792
793 #define M_TDC_FORWARD_PSTRUCT(SHORT_NAME)\
794 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_STRUCT)
795
796 #define M_TDC_FORWARD_PUNION(SHORT_NAME)\
797 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_UNION)
798
799 #define M_TDC_FORWARD_SDU(SHORT_NAME)\
800 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_SDU)
801
802 #define M_TDC_FORWARD_TYPEDEF_SDU(BUF)\
803 typedef T_TDC_HANDLE_SDU T_TDC_HANDLE_##BUF;\
804 typedef T_TDC_DESCRIPTOR_SDU T_TDC_DESCRIPTOR_##BUF;\
805
806 /**TODO: eliminate this macro*/
807 #define M_FORWARD_TYPEDEF_SDU(BUF)\
808 M_TDC_FORWARD_TYPEDEF_SDU(BUF)\
809
810 #define M_TDC_FORWARD_TYPEDEF(BASE,SHORT_NAME)\
811 typedef T_TDC_HANDLE_##BASE T_TDC_HANDLE_##SHORT_NAME;\
812 typedef T_TDC_DESCRIPTOR_##BASE T_TDC_DESCRIPTOR_##SHORT_NAME;\
813
814 #define M_TDC_FORWARD_PENUM(SHORT_NAME)\
815 M_TDC_FORWARD_VAR (SHORT_NAME)
816
817 #if TDC_DEBUG_DOT_COMPLETE
818 inline void dot_complete_test(){
819 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
820 tdc_debug_dot_complete__tdc_h. i6;
821 tdc_debug_dot_complete__tdc_h-> i;
822 }
823 #else
824 #endif
825
826 //------
827
828 #define M_TDC_FORWARD_MSG(SHORT_NAME)\
829 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_MSG)
830
831 #define M_TDC_FORWARD_MSTRUCT(SHORT_NAME)\
832 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_STRUCT)
833
834 #define M_TDC_FORWARD_MUNION(SHORT_NAME)\
835 M_TDC_FORWARD_COMP (SHORT_NAME,TDC_IS_UNION)
836
837 #define M_TDC_FORWARD_MENUM(SHORT_NAME)\
838 M_TDC_FORWARD_VAR (SHORT_NAME)
839
840 //------
841
842 #define M_TDC_FORWARD_INT(SHORT_NAME)\
843 M_TDC_FORWARD_BASE(SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME)\
844 struct T_TDC_DESCRIPTOR_##SHORT_NAME;\
845 typedef T_TDC_DESCRIPTOR_##SHORT_NAME T_TDC_HANDLE_##SHORT_NAME;\
846 typedef T_TDC_INT_##SHORT_NAME SHORT_NAME;\
847 T_TDC_HANDLE_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME();\
848
849 #if TDC_DEBUG_DOT_COMPLETE
850 inline void dot_complete_test(){
851 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
852 tdc_debug_dot_complete__tdc_h. i6;
853 tdc_debug_dot_complete__tdc_h-> i;
854 }
855 #else
856 #endif
857
858 #define M_TDC_FORWARD_XXX_PRIMITIVE_UNION(SAP)\
859 M_TDC_FORWARD_BASE (SAP, T_TDC_HANDLE_##SAP)\
860
861 #define M_TDC_FORWARD_XXX_MESSAGE_UNION(MSG)\
862 M_TDC_FORWARD_BASE (MSG,T_TDC_HANDLE_##MSG)\
863
864 #if TDC_DEBUG_DOT_COMPLETE
865 inline void dot_complete_test(){
866 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
867 tdc_debug_dot_complete__tdc_h. i6;
868 tdc_debug_dot_complete__tdc_h-> i;
869 }
870 #else
871 #endif
872
873 //----------------------------------------------------------------------------
874 // macros to repeat stuff that is similar in many descriptor classes
875 //----------------------------------------------------------------------------
876
877 #define M_TDC_POST_PRIM(SHORT_NAME)\
878 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_PRIM)
879
880 #define M_TDC_POST_PSTRUCT(SHORT_NAME)\
881 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_STRUCT)
882
883 #define M_TDC_POST_PUNION(SHORT_NAME)\
884 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_UNION)
885
886 #define M_TDC_POST_SDU(SHORT_NAME)
887
888 #define M_TDC_POST_PENUM(SHORT_NAME)\
889 M_TDC_POST_VAR (SHORT_NAME)
890
891 #define M_TDC_POST_MSG(SHORT_NAME)\
892 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_MSG)
893
894 #define M_TDC_POST_MSTRUCT(SHORT_NAME)\
895 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_STRUCT)
896
897 #define M_TDC_POST_MUNION(SHORT_NAME)\
898 M_TDC_POST_COMP (SHORT_NAME, TDC_IS_UNION)
899
900 #define M_TDC_POST_MENUM(SHORT_NAME)\
901 M_TDC_POST_VAR (SHORT_NAME)
902
903 #define M_TDC_POST_INT(SHORT_NAME)
904
905 #define M_TDC_POST_XXX_PRIMITIVE_UNION(SAP)\
906 M_TDC_POST_XXX(SAP,TDC_IS_XXX_PRIMITIE_UNION)
907
908 #define M_TDC_POST_XXX_MESSAGE_UNION(MSG)\
909 M_TDC_POST_XXX(MSG,TDC_IS_XXX_MESSAGE_UNION)
910
911 #define M_TDC_POST_PRIMITIVE()
912
913 #define M_TDC_POST_MESSAGE()
914
915 #if TDC_DEBUG_DOT_COMPLETE
916 inline void dot_complete_test(){
917 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_6 tdc_debug_dot_complete__tdc_h;
918 tdc_debug_dot_complete__tdc_h. i6;
919 tdc_debug_dot_complete__tdc_h-> i;
920 }
921
922 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_5
923 {
924 int i5;
925 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
926 };
927
928 inline void dot_complete_test(){
929 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_5 tdc_debug_dot_complete__tdc_h;
930 tdc_debug_dot_complete__tdc_h. i4;
931 tdc_debug_dot_complete__tdc_h-> i;
932 }
933 #else
934 #endif
935
936 //============================================================================
937
938 #if TDC_DEBUG_DOT_COMPLETE
939 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1F
940 {
941 int i1F;
942 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
943 };
944 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1F()
945 {
946 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
947 s.
948 i;
949 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1F s1F;
950 s1F->
951 i0;
952 }
953 #else
954 #endif
955
956 //----------------------------------------------------------------------------
957 /// \defgroup M_TDC_DESCRIPTOR M_TDC_DESCRIPTOR
958 /// macros to repeat stuff that is similar in many descriptor classes
959 //----------------------------------------------------------------------------
960 //\{
961
962 /** declare action and description elements that are accessed through typecast to stencil */
963 #define M_TDC_DESCRIPTOR_HANDLE_ADDITIONAL_PART(T_DESCRIPTOR)\
964 T_TDC_ACTION_ENUM action TDC_LINT_UNUSED_MEMBER;\
965 T_DESCRIPTOR* descriptor TDC_LINT_UNUSED_MEMBER;\
966
967 #define M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
968 private:\
969 virtual long get_sizeof ()\
970 {\
971 return sizeof *this;\
972 }\
973
974 #define M_TDC_DESCRIPTOR_ADDITIONAL_MAIN_BASE(SHORT_NAME)\
975 M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
976 public:\
977 int ctrl;\
978 virtual int read_ctrl () const\
979 {\
980 return ctrl;\
981 }\
982 T_TDC_HANDLE_BASE* get_element (unsigned index)\
983 {\
984 return implement_get_union_element (index, ctrl);\
985 }\
986 virtual char* get_name () const\
987 {\
988 return #SHORT_NAME;\
989 }\
990 T_TDC_DESCRIPTOR_##SHORT_NAME ():\
991 ctrl (0)\
992 {\
993 }\
994
995
996 #define M_TDC_DESCRIPTOR_ADDITIONAL_STRUCT_BASE(SHORT_NAME)\
997 M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
998 public:\
999 typedef T_TDC_HANDLE_##SHORT_NAME T_HANDLE;\
1000 virtual char* get_name () const\
1001 {\
1002 extern char* TDC_NAME_##SHORT_NAME;\
1003 return TDC_NAME_##SHORT_NAME;\
1004 }\
1005 friend T_TDC_DESCRIPTOR_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME ()\
1006 {\
1007 return new T_TDC_DESCRIPTOR_##SHORT_NAME;\
1008 }\
1009 T_TDC_DESCRIPTOR_##SHORT_NAME ()\
1010 {\
1011 }\
1012
1013 #define M_TDC_DESCRIPTOR_ADDITIONAL_UNION_BASE(SHORT_NAME,TABLE_KIND)\
1014 M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
1015 public:\
1016 typedef T_TDC_HANDLE_##SHORT_NAME T_HANDLE;\
1017 int ctrl;\
1018 virtual int read_ctrl () const\
1019 {\
1020 return ctrl;\
1021 }\
1022 T_TDC_HANDLE_BASE* get_element (unsigned index)\
1023 {\
1024 return implement_get_union_element (index, ctrl);\
1025 }\
1026 virtual char* get_name () const\
1027 {\
1028 extern char* TDC_NAME_##SHORT_NAME;\
1029 return TDC_NAME_##SHORT_NAME;\
1030 }\
1031 T_TDC_DESCRIPTOR_##SHORT_NAME ():\
1032 ctrl (0)\
1033 {\
1034 }\
1035
1036 /**
1037 * \todo move get_tap_handle() to var base class
1038 */
1039 #define M_TDC_DESCRIPTOR_ADDITIONAL_VAR(T_DESCRIPTOR, T_VAR, SHORT_NAME)\
1040 M_TDC_DESCRIPTOR_ADDITIONAL_BASE(SHORT_NAME)\
1041 public:\
1042 typedef T_DESCRIPTOR T_HANDLE;\
1043 T_TDC_ACTION_ENUM action;\
1044 union \
1045 {\
1046 T_VAR value;\
1047 T_TDC_BASIC_TYPES value_as_basic_types;\
1048 };\
1049 virtual char* get_name () const\
1050 {\
1051 extern char* TDC_NAME_##SHORT_NAME;\
1052 return TDC_NAME_##SHORT_NAME;\
1053 }\
1054 T_DESCRIPTOR ():\
1055 action (TDC_ACTION_DEFAULT)\
1056 {\
1057 }\
1058 virtual unsigned get_sizeof_target ()\
1059 {\
1060 return sizeof T_VAR;\
1061 }\
1062 static T_TDC_HANDLE_BASE* implement_new_handle ()\
1063 {\
1064 return new_##T_DESCRIPTOR();\
1065 }\
1066
1067 //-----
1068
1069 #define M_TDC_DESCRIPTOR_INT_ADDITIONAL(SHORT_NAME)\
1070 M_TDC_DESCRIPTOR_ADDITIONAL_VAR (T_TDC_DESCRIPTOR_##SHORT_NAME, T_TDC_INT_##SHORT_NAME,SHORT_NAME)\
1071 virtual T_TDC_IS_ENUM is ()\
1072 {\
1073 return TDC_IS_VAR;\
1074 }\
1075
1076 //-----
1077
1078 #define M_TDC_DESCRIPTOR_PRIM_ADDITIONAL(SHORT_NAME)\
1079 M_TDC_DESCRIPTOR_ADDITIONAL_STRUCT_BASE (SHORT_NAME)\
1080 virtual int get_id () const\
1081 {\
1082 return SHORT_NAME;\
1083 }\
1084
1085 #define M_TDC_DESCRIPTOR_PSTRUCT_ADDITIONAL(SHORT_NAME)\
1086 M_TDC_DESCRIPTOR_ADDITIONAL_STRUCT_BASE (SHORT_NAME)\
1087
1088 #define M_TDC_DESCRIPTOR_PUNION_ADDITIONAL(SHORT_NAME)\
1089 M_TDC_DESCRIPTOR_ADDITIONAL_UNION_BASE (SHORT_NAME,TDC_TABLE_KIND_PRIM)\
1090
1091 #define M_TDC_DESCRIPTOR_SDU_ADDITIONAL(SHORT_NAME)\
1092 M_TDC_DESCRIPTOR_ADDITIONAL_UNION_BASE (SHORT_NAME,TDC_TABLE_KIND_PRIM)\
1093
1094 #define M_TDC_DESCRIPTOR_PENUM_ADDITIONAL(SHORT_NAME)\
1095 M_TDC_DESCRIPTOR_ADDITIONAL_VAR (T_TDC_DESCRIPTOR_##SHORT_NAME, T_TDC_ENUM_##SHORT_NAME,SHORT_NAME)\
1096 friend T_TDC_HANDLE_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME ();\
1097
1098 //-----
1099
1100 #define M_TDC_DESCRIPTOR_MSG_ADDITIONAL(SHORT_NAME)\
1101 M_TDC_DESCRIPTOR_ADDITIONAL_STRUCT_BASE (SHORT_NAME)\
1102 virtual int get_id () const\
1103 {\
1104 return SHORT_NAME;\
1105 }\
1106
1107 #define M_TDC_DESCRIPTOR_MSTRUCT_ADDITIONAL(SHORT_NAME)\
1108 M_TDC_DESCRIPTOR_ADDITIONAL_STRUCT_BASE (SHORT_NAME)\
1109
1110 #define M_TDC_DESCRIPTOR_MUNION_ADDITIONAL(SHORT_NAME)\
1111 M_TDC_DESCRIPTOR_ADDITIONAL_UNION_BASE (SHORT_NAME,TDC_TABLE_KIND_MSG)\
1112
1113 #define M_TDC_DESCRIPTOR_MENUM_ADDITIONAL(SHORT_NAME)\
1114 M_TDC_DESCRIPTOR_ADDITIONAL_VAR (T_TDC_DESCRIPTOR_##SHORT_NAME, T_TDC_ENUM_##SHORT_NAME,SHORT_NAME)\
1115 friend T_TDC_HANDLE_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME ();\
1116
1117 //-----
1118
1119 #define M_TDC_DESCRIPTOR_XXX_PRIMITIVE_UNION_ADDITIONAL(SAP)\
1120 M_TDC_DESCRIPTOR_ADDITIONAL_MAIN_BASE (SAP)\
1121
1122 #define M_TDC_DESCRIPTOR_XXX_MESSAGE_UNION_ADDITIONAL(MSG)\
1123 M_TDC_DESCRIPTOR_ADDITIONAL_MAIN_BASE (MSG)\
1124 virtual int get_id () const\
1125 {\
1126 return CCDENT_##MSG;\
1127 }\
1128
1129 #ifdef TDC_LIB_MAIN_DSC
1130 #define IF_TDC_LIB_MAIN_DSC(code) code
1131 #else
1132 #define IF_TDC_LIB_MAIN_DSC(code)
1133 #endif
1134
1135 #define M_TDC_CREATE_DEFAULT_DESCRIPTOR_CLASS(SHORT_NAME, TDC_IS)\
1136 struct T_TDC_DESCRIPTOR_##SHORT_NAME;\
1137 struct T_TDC_HANDLE_##SHORT_NAME:T_TDC_HANDLE_BASE\
1138 {\
1139 typedef T_TDC_DESCRIPTOR_##SHORT_NAME T_DESCRIPTOR;\
1140 M_TDC_HANDLE_ADDITIONAL(M_TDC_IN_CLASS,M_TDC_WITH_BODY,T_TDC_HANDLE_##SHORT_NAME,SHORT_NAME,TDC_IS)\
1141 M_TDC_DESCRIPTOR_HANDLE_ADDITIONAL_PART (T_TDC_DESCRIPTOR_##SHORT_NAME)\
1142 protected:\
1143 static T_TDC_NEW_DESCRIPTOR new_descriptor;\
1144 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const\
1145 {\
1146 return call_implement_new_descriptor(new_descriptor);\
1147 }\
1148 friend char set_new_descriptor_T_TDC_HANDLE_##SHORT_NAME()\
1149 {\
1150 extern T_TDC_DESCRIPTOR_BASE* new_T_TDC_DESCRIPTOR_##SHORT_NAME ();\
1151 new_descriptor = new_T_TDC_DESCRIPTOR_##SHORT_NAME;\
1152 return 1;\
1153 }\
1154 };\
1155 T_TDC_HANDLE_BASE* new_T_TDC_HANDLE_##SHORT_NAME();\
1156 M_TDC_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE_1(SHORT_NAME,SHORT_NAME)\
1157 IF_TDC_LIB_MAIN_DSC(T_TDC_NEW_DESCRIPTOR T_TDC_HANDLE_##SHORT_NAME::new_descriptor;)\
1158
1159 #define M_TDC_CREATE_DEFAULT_PRIMITIVE_DESCRIPTOR_CLASS(SAP)\
1160 M_TDC_CREATE_DEFAULT_DESCRIPTOR_CLASS(SAP##_PRIMITIVE_UNION,TDC_IS_XXX_PRIMITIVE_UNION)\
1161
1162 #define M_TDC_CREATE_DEFAULT__T_TDC_HANDLE_XXX_PRIMITIVE_UNION(SAP,CCDSAP)\
1163 M_TDC_CREATE_DEFAULT_DESCRIPTOR_CLASS(SAP##_PRIMITIVE_UNION,TDC_IS_XXX_PRIMITIVE_UNION)\
1164
1165 #define M_TDC_DESCRIPTOR_PRIMITIVE_ADDITIONAL()\
1166 M_TDC_DESCRIPTOR_ADDITIONAL_MAIN_BASE (PRIMITIVE_UNION)\
1167
1168 #define M_TDC_CREATE_DEFAULT_MESSAGE_DESCRIPTOR_CLASS(MSG)\
1169 M_TDC_CREATE_DEFAULT_DESCRIPTOR_CLASS(MSG##_MESSAGE_UNION,TDC_IS_XXX_MESSAGE_UNION)\
1170 enum { CCDENT_##MSG##_MESSAGE_UNION = CCDENT_##MSG };\
1171
1172 #define M_TDC_CREATE_DEFAULT__T_TDC_HANDLE_XXX_MESSAGE_UNION(MSG,CCDENT)\
1173 M_TDC_CREATE_DEFAULT_MESSAGE_DESCRIPTOR_CLASS(MSG)
1174
1175 #define M_TDC_DESCRIPTOR_MESSAGE_ADDITIONAL()\
1176 M_TDC_DESCRIPTOR_ADDITIONAL_MAIN_BASE (MESSAGE_UNION)\
1177
1178 //\}
1179 //============================================================================
1180
1181 #if TDC_DEBUG_DOT_COMPLETE
1182 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1H
1183 {
1184 int i1H;
1185 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
1186 };
1187 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1H()
1188 {
1189 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
1190 s.
1191 i;
1192 s->
1193 i0;
1194 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1H s1H;
1195 s1H->
1196 i0;
1197 }
1198 #else
1199 #endif
1200
1201 //----------------------------------------------------------------------------
1202 /// \defgroup M_TDC_INTERFACE
1203 // macros to repeat stuff that is similar in many inteface classes
1204 //----------------------------------------------------------------------------
1205 //\{
1206
1207 /**
1208 * should these functions return T_RETURN / *this instead?
1209 */
1210 #define M_TDC_ADDITIONAL_CALL_FUNCTION_BASE(IN_CLASS, WITH_BODY, T_SCOPE,T_RETURN,T_ARG)\
1211 void T_SCOPE::operator = (T_ARG (*f) ())\
1212 WITH_BODY({\
1213 T_ARG value_ = f ();\
1214 set_value (value_);\
1215 TDC_LINT_UNASSIGNED_MEMBER\
1216 })\
1217 void T_SCOPE::operator = (void (*f) (T_ARG))\
1218 WITH_BODY({\
1219 T_ARG value_;\
1220 f (value_);\
1221 set_value (value_);\
1222 TDC_LINT_UNASSIGNED_MEMBER\
1223 })\
1224
1225 #define M_TDC_INTERFACE_ADDITIONAL_BASE(IN_CLASS, WITH_BODY, T_INTERFACE, T_INSTANCE_, T_HANDLE)\
1226 IN_CLASS(typedef T_INSTANCE_ T_INSTANCE;)\
1227 IN_CLASS(friend struct T_INSTANCE_;)\
1228 IN_CLASS(private:)\
1229 void T_INTERFACE::set_value (const T_INSTANCE_& value_)\
1230 WITH_BODY({\
1231 copy_instance ((const T_TDC_INSTANCE_BASE*)&value_);\
1232 })\
1233 IN_CLASS(explicit) T_INTERFACE::T_INTERFACE (const T_INTERFACE& value_)\
1234 WITH_BODY({\
1235 copy_interface (&value_);\
1236 TDC_LINT_UNCOPIED_BASE\
1237 })\
1238 IN_CLASS(public:)\
1239 void T_INTERFACE::operator = (const T_TDC_ACTION& action_)\
1240 WITH_BODY({\
1241 set_action (action_);\
1242 TDC_LINT_UNASSIGNED_MEMBER\
1243 })\
1244 void T_INTERFACE::operator = (const T_INTERFACE& value_)\
1245 WITH_BODY({\
1246 copy_interface (&value_);\
1247 TDC_LINT_NO_SELFASSIGN_TEST\
1248 TDC_LINT_UNASSIGNED_MEMBER\
1249 })\
1250 T_INSTANCE_ T_INTERFACE::operator = (const T_INSTANCE_& value_)\
1251 WITH_BODY({\
1252 copy_instance (&value_);\
1253 return value_;\
1254 TDC_LINT_UNASSIGNED_MEMBER\
1255 })\
1256 IN_CLASS(static) T_TDC_HANDLE_BASE* T_INTERFACE::implement_new_handle ()\
1257 WITH_BODY({\
1258 return new_##T_HANDLE();\
1259 })\
1260 IN_CLASS(friend) T_TDC_INTERFACE_BASE* new_##T_INTERFACE()\
1261 WITH_BODY({\
1262 return new T_INTERFACE;\
1263 })\
1264 M_TDC_ADDITIONAL_CALL_FUNCTION_BASE(IN_CLASS, WITH_BODY, T_INTERFACE,T_INSTANCE,T_INSTANCE)\
1265
1266 #define M_TDC_INTERFACE_ADDITIONAL_MAIN(IN_CLASS, WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, BASE)\
1267 public:\
1268 void operator = (const T_TDC_INTERFACE_##BASE##_BASE& value_)\
1269 {\
1270 set_main_value (&value_);\
1271 }\
1272 void operator = (const T_TDC_INSTANCE_##BASE##_BASE& value_)\
1273 {\
1274 set_main_value (&value_);\
1275 }\
1276 T_TDC_INTERFACE_##PREFIXED_SHORT_NAME ()\
1277 {\
1278 tdc_level--;\
1279 }\
1280 M_TDC_INTERFACE_ADDITIONAL_BASE (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_HANDLE_##PREFIXED_SHORT_NAME)
1281
1282 #define M_TDC_INTERFACE_ADDITIONAL_COMP(IN_CLASS, WITH_BODY, SHORT_NAME, PREFIXED_SHORT_NAME)\
1283 public:\
1284 T_TDC_INTERFACE_##PREFIXED_SHORT_NAME ()\
1285 {\
1286 tdc_level--;\
1287 }\
1288 M_TDC_INTERFACE_ADDITIONAL_BASE (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_HANDLE_##PREFIXED_SHORT_NAME)
1289
1290 #define M_TDC_INTERFACE_ADDITIONAL_VAR(IN_CLASS, WITH_BODY, SHORT_NAME, PREFIXED_SHORT_NAME)\
1291 public:\
1292 T_TDC_INTERFACE_##PREFIXED_SHORT_NAME ()\
1293 {\
1294 }\
1295 M_TDC_INTERFACE_ADDITIONAL_BASE (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_HANDLE_##PREFIXED_SHORT_NAME)
1296
1297 #define M_TDC_INTERFACE_INT_ADDITIONAL(SHORT_NAME)\
1298 public:\
1299 void operator = (int value_)\
1300 {\
1301 set_descriptor_value (value_);\
1302 }\
1303 M_TDC_INTERFACE_ADDITIONAL_VAR (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME, SHORT_NAME)\
1304
1305 #define M_TDC_INTERFACE_ADDITIONAL_ENUM(IN_CLASS, WITH_BODY, SHORT_NAME, PREFIXED_SHORT_NAME)\
1306 public:\
1307 void set_value (int value_)\
1308 {\
1309 set_descriptor_value (value_);\
1310 }\
1311 void operator = (int value_)\
1312 {\
1313 set_descriptor_value (value_);\
1314 }\
1315 void set_value (const T_TDC_INSTANCE_INT_BASE &value_)\
1316 {\
1317 copy_instance (&value_);\
1318 }\
1319 void operator = (const T_TDC_INSTANCE_INT_BASE &value_)\
1320 {\
1321 copy_instance (&value_);\
1322 }\
1323 M_TDC_INTERFACE_ADDITIONAL_VAR (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME, PREFIXED_SHORT_NAME)\
1324
1325 #define M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL(IN_CLASS, WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME,T_ARG)\
1326 T_##SHORT_NAME operator = (const T_ARG& value_)\
1327 {\
1328 set_value (value_);\
1329 return value_;\
1330 TDC_LINT_UNASSIGNED_MEMBER\
1331 }\
1332
1333 //-----
1334
1335 #define M_TDC_INTERFACE_PRIM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1336 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, PRIMITIVE)\
1337 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, T_PRIMITIVE_UNION)\
1338
1339 #define M_TDC_INTERFACE_PSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1340 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1341
1342 #define M_TDC_INTERFACE_PUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1343 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1344
1345 #define M_TDC_INTERFACE_PENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1346 M_TDC_INTERFACE_ADDITIONAL_ENUM (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1347
1348 //-----
1349
1350 #define M_TDC_INTERFACE_MSG_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1351 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, MESSAGE)\
1352 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, T_MESSAGE_UNION)\
1353
1354 #define M_TDC_INTERFACE_MSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1355 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1356
1357 #define M_TDC_INTERFACE_MUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1358 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1359
1360 #define M_TDC_INTERFACE_MENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1361 M_TDC_INTERFACE_ADDITIONAL_ENUM (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1362
1363 //-----
1364
1365 #define M_TDC_INTERFACE_PRIM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1366 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, PRIMITIVE)\
1367 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, T_PRIMITIVE_UNION)\
1368
1369 #define M_TDC_INTERFACE_PSTRUCT_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1370 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1371
1372 #define M_TDC_INTERFACE_PUNION_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1373 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1374
1375 #define M_TDC_INTERFACE_SDU_ADDITIONAL_INLINE(SHORT_NAME)\
1376 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,SHORT_NAME)
1377
1378 #define M_TDC_INTERFACE_PENUM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1379 M_TDC_INTERFACE_ADDITIONAL_ENUM (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1380
1381 //-----
1382
1383 #define M_TDC_INTERFACE_MSG_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1384 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, MESSAGE)\
1385 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, T_MESSAGE_UNION)\
1386
1387 #define M_TDC_INTERFACE_MSTRUCT_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1388 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1389
1390 #define M_TDC_INTERFACE_MUNION_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1391 M_TDC_INTERFACE_ADDITIONAL_COMP (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1392
1393 #define M_TDC_INTERFACE_MENUM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1394 M_TDC_INTERFACE_ADDITIONAL_ENUM (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1395
1396 //-----
1397
1398 #define M_TDC_INTERFACE_ADDITIONAL_MAIN_XXX(M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY,XXX,PREFIXED_XXX)\
1399 private:\
1400 T_TDC_INTERFACE_##XXX (const T_TDC_INTERFACE_PRIMITIVE_BASE& primitive)\
1401 {\
1402 tdc_tbd_xxx_constructor_call(#XXX);\
1403 }\
1404
1405 #define M_TDC_INTERFACE_XXX_PRIMITIVE_UNION_ADDITIONAL(SAP,PREFIXED_SAP)\
1406 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SAP,PREFIXED_SAP, PRIMITIVE)\
1407 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SAP,PREFIXED_SAP, T_PRIMITIVE_UNION)\
1408 M_TDC_INTERFACE_ADDITIONAL_MAIN_XXX (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SAP,PREFIXED_SAP)\
1409 public:\
1410
1411 #define M_TDC_INTERFACE_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1412 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SAP,PREFIXED_SAP, PRIMITIVE)\
1413 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SAP,PREFIXED_SAP, T_PRIMITIVE_UNION)\
1414 M_TDC_INTERFACE_ADDITIONAL_MAIN_XXX (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SAP,PREFIXED_SAP)\
1415 public:\
1416
1417 #define M_TDC_INTERFACE_XXX_MESSAGE_UNION_ADDITIONAL(MSG,PREFIXED_MSG)\
1418 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MSG, PREFIXED_MSG, MESSAGE)\
1419 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MSG, PREFIXED_MSG, T_MESSAGE_UNION)\
1420 M_TDC_INTERFACE_ADDITIONAL_MAIN_XXX (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MSG,PREFIXED_MSG)\
1421 public:\
1422
1423 #define M_TDC_INTERFACE_XXX_MESSAGE_UNION_ADDITIONAL_INLINE(MSG,PREFIXED_MSG)\
1424 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, MSG, PREFIXED_MSG, MESSAGE)\
1425 M_TDC_INTERFACE_ADDITIONAL_MAIN_CALL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, MSG, PREFIXED_MSG, T_MESSAGE_UNION)\
1426 M_TDC_INTERFACE_ADDITIONAL_MAIN_XXX (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MSG,PREFIXED_MSG)\
1427 public:\
1428
1429 #define M_TDC_CREATE_DEFAULT_INTERFACE_CLASS(SHORT_NAME)\
1430 struct T_TDC_INTERFACE_##SHORT_NAME;\
1431 struct T_TDC_HANDLE_##SHORT_NAME;\
1432
1433 #define M_TDC_CREATE_DEFAULT_PRIMITIVE_INTERFACE_CLASS(SAP)\
1434 M_TDC_CREATE_DEFAULT_INTERFACE_CLASS(SAP##_PRIMITIVE_UNION)\
1435
1436 #define M_TDC_CREATE_DEFAULT__T_TDC_INTERFACE_XXX_PRIMITIVE_UNION(SAP,CCDSAP)\
1437 enum { CCDSAP_##SAP = CCDSAP };\
1438 M_TDC_CREATE_DEFAULT_INTERFACE_CLASS(SAP##_PRIMITIVE_UNION)\
1439
1440 #define M_TDC_INTERFACE_PRIMITIVE_ADDITIONAL()\
1441 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, PRIMITIVE_UNION, PRIMITIVE_UNION, PRIMITIVE)\
1442 private:\
1443 T_TDC_INTERFACE_PRIMITIVE_UNION (const T_TDC_INTERFACE_PRIMITIVE_BASE& primitive)\
1444 {\
1445 tdc_tbd_primitive_union_constructor_call();\
1446 }\
1447 public:\
1448
1449 #define M_TDC_INTERFACE_PRIMITIVE_ELEMENT_ADDITIONAL(SAP)\
1450 /*nothing*/
1451
1452 #define M_TDC_CREATE_DEFAULT_MESSAGE_INTERFACE_CLASS(MSG)\
1453 M_TDC_CREATE_DEFAULT_INTERFACE_CLASS(MSG##_MESSAGE_UNION)\
1454
1455 #define M_TDC_CREATE_DEFAULT__T_TDC_INTERFACE_XXX_MESSAGE_UNION(MSG,CCDENT)\
1456 enum { CCDENT_##MSG = CCDENT };\
1457 M_TDC_CREATE_DEFAULT_MESSAGE_INTERFACE_CLASS(MSG)
1458
1459 #define M_TDC_INTERFACE_MESSAGE_ADDITIONAL()\
1460 M_TDC_INTERFACE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MESSAGE_UNION,MESSAGE_UNION, MESSAGE)\
1461 private:\
1462 T_TDC_INTERFACE_MESSAGE_UNION (const T_TDC_INTERFACE_MESSAGE_BASE& primitive)\
1463 {\
1464 tdc_tbd_message_union_constructor_call();\
1465 }\
1466 public:\
1467
1468 #define M_TDC_INTERFACE_MESSAGE_ELEMENT_ADDITIONAL(MSG)\
1469 /*nothing*/
1470
1471 //\}
1472
1473 //============================================================================
1474
1475 #if TDC_DEBUG_DOT_COMPLETE
1476 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1I()
1477 {
1478 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
1479 s.
1480 i;
1481 s->
1482 i0;
1483 }
1484 #else
1485 #endif
1486
1487 //----------------------------------------------------------------------------
1488 /// \defgroup M_TDC_INSTANCE M_TDC_INSTANCE
1489 /// macros to repeat stuff that is similar in many instance classes
1490 //----------------------------------------------------------------------------
1491 //\{
1492
1493 /*lint -emacro(1706,M_TDC_INSTANCE_ADDITIONAL_BASE)*/ //we don't want M_TDC_NOT(IN_CLASS(...)) for all the scope operators
1494 #define M_TDC_INSTANCE_ADDITIONAL_BASE(IN_CLASS, WITH_BODY, T_INTERFACE_, T_INSTANCE, T_HANDLE_)\
1495 IN_CLASS(typedef T_INTERFACE_ T_INTERFACE;)\
1496 IN_CLASS(typedef T_HANDLE_ T_HANDLE;)\
1497 IN_CLASS(T_HANDLE* handle;)\
1498 IN_CLASS(static) T_TDC_HANDLE_BASE* T_INSTANCE::implement_new_handle ()\
1499 WITH_BODY({\
1500 return new_##T_HANDLE_();\
1501 })\
1502 IN_CLASS(virtual) T_TDC_INTERFACE_BASE* T_INSTANCE::new_interface() const\
1503 WITH_BODY({\
1504 return new_##T_INTERFACE_();\
1505 })\
1506 void T_INSTANCE::construct()\
1507 WITH_BODY({\
1508 construct_handle(new_##T_HANDLE_);\
1509 })\
1510 T_INSTANCE::T_INSTANCE ()\
1511 WITH_BODY({\
1512 construct();\
1513 TDC_LINT_UNINITIALIZED_MEMBER\
1514 })\
1515 T_INSTANCE::~T_INSTANCE ()\
1516 WITH_BODY({\
1517 destroy_handle ();\
1518 TDC_LINT_POSSIBLE_UNHANDLE_POINTER_MEMBER\
1519 })\
1520 T_INSTANCE::T_INSTANCE (const T_INTERFACE_& value_)\
1521 WITH_BODY({\
1522 construct_from_interface ((T_TDC_INTERFACE_BASE*)&value_, new_##T_HANDLE_); M_TDC_COMMENT(T_INTERFACE not defined yet; means need cast here to the base type pointer)\
1523 TDC_LINT_UNINITIALIZED_MEMBER\
1524 })\
1525 IN_CLASS(explicit) T_INSTANCE::T_INSTANCE (const T_TDC_HANDLE_BASE* value_)\
1526 WITH_BODY({\
1527 tdc_tbd_constructor_call(#T_INSTANCE);\
1528 TDC_LINT_UNINITIALIZED_MEMBER\
1529 })\
1530 void T_INSTANCE::operator = (const T_INSTANCE& value_)\
1531 WITH_BODY({\
1532 set_value (value_);\
1533 TDC_LINT_UNASSIGNED_MEMBER\
1534 TDC_LINT_NO_SELFASSIGN_TEST\
1535 })\
1536 M_TDC_NOT_##IN_CLASS(T_INTERFACE_* T_INSTANCE::operator -> ()\
1537 {\
1538 return (T_INTERFACE*)get_navigation();\
1539 })\
1540 T_INSTANCE::T_INSTANCE (const T_INSTANCE& value_)\
1541 WITH_BODY({\
1542 construct_from_instance (value_, new_##T_HANDLE_);\
1543 TDC_LINT_UNCOPIED_BASE\
1544 TDC_LINT_UNINITIALIZED_MEMBER\
1545 })\
1546 T_INSTANCE::T_INSTANCE (T_INSTANCE (*f) ())\
1547 WITH_BODY({\
1548 T_INSTANCE value_ = f ();\
1549 construct_from_instance (value_, new_##T_HANDLE_);\
1550 TDC_LINT_UNINITIALIZED_MEMBER\
1551 })\
1552 M_TDC_ADDITIONAL_CALL_FUNCTION_BASE(IN_CLASS, WITH_BODY, T_INSTANCE, T_INSTANCE, T_INSTANCE)
1553
1554 #define M_TDC_INSTANCE_ADDITIONAL_MAIN(IN_CLASS, WITH_BODY, SHORT_NAME, PREFIXED_SHORT_NAME, BASE)\
1555 public:\
1556 void operator = (const T_TDC_INTERFACE_##BASE##_BASE& value_)\
1557 {\
1558 set_main_value (&value_);\
1559 }\
1560 void operator = (const T_TDC_INSTANCE_##BASE##_BASE& value_)\
1561 {\
1562 set_main_value (&value_);\
1563 }\
1564 T_##SHORT_NAME (const T_TDC_INTERFACE_##BASE##_BASE& value_)\
1565 {\
1566 construct_main_value (&value_, new_T_TDC_HANDLE_##PREFIXED_SHORT_NAME);\
1567 }\
1568 T_##SHORT_NAME (const T_TDC_INSTANCE_##BASE##_BASE& value_)\
1569 {\
1570 construct_main_value (&value_, new_T_TDC_HANDLE_##PREFIXED_SHORT_NAME);\
1571 }\
1572 M_TDC_INSTANCE_ADDITIONAL_BASE (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_HANDLE_##PREFIXED_SHORT_NAME)
1573
1574 #define M_TDC_INSTANCE_PART_ADDITIONAL(IN_CLASS, WITH_BODY, T_INTERFACE, T_INSTANCE, T_DESCRIPTOR, T_HANDLE)\
1575 public:\
1576 T_INSTANCE (const T_TDC_ACTION& action_)\
1577 {\
1578 construct_from_action (action_, new_##T_HANDLE);\
1579 }\
1580 T_TDC_ACTION operator = (const T_TDC_ACTION& action_)\
1581 {\
1582 set_action (action_);\
1583 return action_;\
1584 }\
1585 M_TDC_INSTANCE_ADDITIONAL_BASE(IN_CLASS, WITH_BODY, T_INTERFACE, T_INSTANCE, T_HANDLE)
1586
1587 #define M_TDC_INSTANCE_COMP_ADDITIONAL(IN_CLASS, WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)\
1588 M_TDC_INSTANCE_PART_ADDITIONAL (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_DESCRIPTOR_##PREFIXED_SHORT_NAME, T_TDC_HANDLE_##PREFIXED_SHORT_NAME)
1589
1590 #define M_TDC_INSTANCE_ENUM_ADDITIONAL(IN_CLASS, WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)\
1591 T_##SHORT_NAME (int value_)\
1592 {\
1593 construct_from_number (value_, new_T_TDC_DESCRIPTOR_##PREFIXED_SHORT_NAME);\
1594 }\
1595 void operator = (int value_)\
1596 {\
1597 set_descriptor_value (value_);\
1598 }\
1599 bool operator == (T_TDC_ENUM_##PREFIXED_SHORT_NAME value_)\
1600 {\
1601 return cmp_descriptor_value (value_);\
1602 }\
1603 operator T_TDC_ENUM_##PREFIXED_SHORT_NAME ()\
1604 {\
1605 return (T_TDC_ENUM_##PREFIXED_SHORT_NAME) get_descriptor_value ();\
1606 }\
1607 M_TDC_INSTANCE_PART_ADDITIONAL (IN_CLASS, WITH_BODY, T_TDC_INTERFACE_##PREFIXED_SHORT_NAME, T_##SHORT_NAME, T_TDC_DESCRIPTOR_##PREFIXED_SHORT_NAME, T_TDC_DESCRIPTOR_##PREFIXED_SHORT_NAME)
1608
1609 #define M_TDC_INSTANCE_INT_ADDITIONAL(SHORT_NAME)\
1610 T_##SHORT_NAME (int value_)\
1611 {\
1612 construct_from_number (value_, new_T_TDC_DESCRIPTOR_##SHORT_NAME);\
1613 }\
1614 void operator = (int value_)\
1615 {\
1616 set_descriptor_value (value_);\
1617 }\
1618 M_TDC_INSTANCE_PART_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, T_TDC_INTERFACE_##SHORT_NAME, T_##SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME, T_TDC_DESCRIPTOR_##SHORT_NAME)
1619
1620 //-----
1621
1622 #define M_TDC_INSTANCE_PRIM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1623 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, PRIMITIVE)
1624
1625 #define M_TDC_INSTANCE_PSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1626 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1627
1628 #define M_TDC_INSTANCE_PUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1629 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1630
1631 #define M_TDC_INSTANCE_SDU_ADDITIONAL(SHORT_NAME)\
1632 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,SHORT_NAME)
1633
1634 #define M_TDC_INSTANCE_PENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1635 M_TDC_INSTANCE_ENUM_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1636
1637 //-----
1638
1639 #define M_TDC_INSTANCE_MSG_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1640 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, MESSAGE)
1641
1642 #define M_TDC_INSTANCE_MSTRUCT_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1643 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1644
1645 #define M_TDC_INSTANCE_MUNION_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1646 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1647
1648 #define M_TDC_INSTANCE_MENUM_ADDITIONAL(SHORT_NAME,PREFIXED_SHORT_NAME)\
1649 M_TDC_INSTANCE_ENUM_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1650
1651 //-----
1652
1653 #define M_TDC_INSTANCE_XXX_PRIMITIVE_UNION_ADDITIONAL(SAP,PREFIXED_SAP)\
1654 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, SAP,PREFIXED_SAP, PRIMITIVE)
1655
1656 #define M_TDC_INSTANCE_XXX_MESSAGE_UNION_ADDITIONAL(MSG,PREFIXED_MSG)\
1657 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MSG,PREFIXED_MSG, MESSAGE)
1658
1659 #define M_TDC_INSTANCE_PRIMITIVE_ADDITIONAL()\
1660 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, PRIMITIVE_UNION,PRIMITIVE_UNION, PRIMITIVE)\
1661 static int call_tdc_initialize_primitive ();\
1662
1663 #define M_TDC_INSTANCE_MESSAGE_ADDITIONAL()\
1664 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITHOUT_BODY, MESSAGE_UNION,MESSAGE_UNION, MESSAGE)\
1665 static int call_tdc_initialize_message ();\
1666
1667 //-----
1668
1669 #define M_TDC_INSTANCE_PRIM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1670 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, PRIMITIVE)
1671
1672 #define M_TDC_INSTANCE_PSTRUCT_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1673 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1674
1675 #define M_TDC_INSTANCE_PUNION_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1676 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1677
1678 #define M_TDC_INSTANCE_PENUM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1679 M_TDC_INSTANCE_ENUM_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1680
1681 //-----
1682
1683 #define M_TDC_INSTANCE_MSG_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1684 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME, MESSAGE)
1685
1686 #define M_TDC_INSTANCE_MSTRUCT_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1687 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1688
1689 #define M_TDC_INSTANCE_MUNION_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1690 M_TDC_INSTANCE_COMP_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1691
1692 #define M_TDC_INSTANCE_MENUM_ADDITIONAL_INLINE(SHORT_NAME,PREFIXED_SHORT_NAME)\
1693 M_TDC_INSTANCE_ENUM_ADDITIONAL (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SHORT_NAME,PREFIXED_SHORT_NAME)
1694
1695 //-----
1696
1697 template<class T_INSTANCE,class T_HANDLE>class T_TDC_FORCE_LINK_INSTANCE_WORKER
1698 {
1699 T_TDC_FORCE_LINK_INSTANCE_WORKER(){
1700 T_HANDLE::new_descriptor = T_INSTANCE::get_new_descriptor();
1701 }
1702 };
1703
1704 template<class T_INSTANCE,class T_HANDLE>class T_TDC_FORCE_LINK_INSTANCE
1705 {
1706 static T_TDC_FORCE_LINK_INSTANCE_WORKER<T_INSTANCE,T_HANDLE> worker;
1707 };
1708 template<class T_INSTANCE,class T_HANDLE>T_TDC_FORCE_LINK_INSTANCE_WORKER<T_INSTANCE,T_HANDLE> T_TDC_FORCE_LINK_INSTANCE<T_INSTANCE,T_HANDLE>::worker;
1709
1710 #define M_TDC_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE_1(SAP,PREFIXED_SAP)\
1711 extern char set_new_descriptor_T_TDC_HANDLE_##SAP();\
1712 static char init_new_descriptor_T_TDC_HANDLE_##SAP = set_new_descriptor_T_TDC_HANDLE_##SAP();\
1713
1714 #define M_TDC_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1715
1716 #define M_TDC_XXX_MESSAGE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1717
1718 /*
1719 #define M_TDC_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1720 extern char set_new_descriptor_T_TDC_HANDLE_##SAP();\
1721 static char init_new_descriptor_T_TDC_HANDLE_##SAP = set_new_descriptor_T_TDC_HANDLE_##SAP();\
1722
1723 #define M_TDC_XXX_MESSAGE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1724 extern char set_new_descriptor_T_TDC_HANDLE_##SAP();\
1725 static char init_new_descriptor_T_TDC_HANDLE_##SAP = set_new_descriptor_T_TDC_HANDLE_##SAP();\
1726 */
1727
1728 #define M_TDC_INSTANCE_XXX_PRIMITIVE_UNION_ADDITIONAL_INLINE(SAP,PREFIXED_SAP)\
1729 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, SAP,PREFIXED_SAP, PRIMITIVE)\
1730 T_TDC_NEW_DESCRIPTOR get_new_descriptor()\
1731 {\
1732 extern T_TDC_DESCRIPTOR_BASE* new_T_TDC_DESCRIPTOR_##SAP();\
1733 return new_T_TDC_DESCRIPTOR_##SAP;\
1734 }\
1735
1736 #define M_TDC_INSTANCE_XXX_MESSAGE_UNION_ADDITIONAL_INLINE(MSG,PREFIXED_MSG)\
1737 M_TDC_INSTANCE_ADDITIONAL_MAIN (M_TDC_IN_CLASS, M_TDC_WITH_BODY, MSG,PREFIXED_MSG, MESSAGE)\
1738 T_TDC_NEW_DESCRIPTOR get_new_descriptor()\
1739 {\
1740 extern T_TDC_DESCRIPTOR_BASE* new_T_TDC_DESCRIPTOR_##MSG();\
1741 return new_T_TDC_DESCRIPTOR_##MSG;\
1742 }\
1743
1744 //\}
1745
1746 //-----
1747
1748 #ifdef TDC_TYPE_NAME_COMPLETE
1749 #define M_TDC_TYPE_NAME_COMPLETE TDC_DOT_COMPLETE_HIDE({ T_TDC_TYPE_NAME type_name = {0}; return type_name; })
1750 #else
1751 #define M_TDC_TYPE_NAME_COMPLETE ;
1752 #endif
1753
1754 #endif //DOT_COMPLETE_DEFINES
1755
1756 //============================================================================
1757
1758 #if TDC_DEBUG_DOT_COMPLETE
1759 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1J()
1760 {
1761 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
1762 s.
1763 i;
1764 s->
1765 i0;
1766 }
1767 #else
1768 #endif
1769
1770 //============================================================================
1771 // implementation classes
1772 //============================================================================
1773
1774 typedef bool T_TDC_TABLE_KIND;
1775
1776 enum T_TDC_ACTION_ENUM
1777 {
1778 TDC_ACTION_UNKNOWN,
1779 // MANDATORY-SEND OPTIONAL-SEND MANDATORY-WAIT OPTIONAL-WAIT
1780 TDC_ACTION_SKIP, // ERROR ABSENT SKIPED SKIPED
1781 TDC_ACTION_SHOW, // ERROR ABSENT SKIPED SKIPED
1782 TDC_ACTION_FORBID, // ERROR ABSENT ERROR CHECKED
1783 TDC_ACTION_REQUIRE, // ERROR ERROR ERROR CHECKED PRESENT
1784 TDC_ACTION_MESSAGE,
1785 TDC_ACTION_DESTROYED,
1786 TDC_ACTION_SKIP_TO_END,
1787 TDC_ACTION_SET = 0x10, // PRESENT PRESENT CHECKED CHECKED VALUE
1788 TDC_ACTION_HAS_VALUE = 0x20,
1789 TDC_ACTION_HAS_REF = 0x40,
1790 TDC_ACTION_IS_IMPLICIT = 0x80,
1791 TDC_ACTION_SET_VALUE = TDC_ACTION_SET + TDC_ACTION_HAS_VALUE,
1792 TDC_ACTION_SET_REF = TDC_ACTION_SET + TDC_ACTION_HAS_REF,
1793 TDC_ACTION_CHILD_TOUCHED = TDC_ACTION_SET + TDC_ACTION_HAS_REF + TDC_ACTION_IS_IMPLICIT,
1794 TDC_ACTION_DEFAULT = TDC_ACTION_UNKNOWN
1795 };
1796
1797 /** allow one optional extra set of () on action member functions, first set is suplyed by macro
1798 * second set might be suplyed by the user, this will have no effect on behaviour of code
1799 */
1800 struct T_TDC_ASSIGN_ACTION
1801 {
1802 void operator ()();
1803 };
1804
1805 extern T_TDC_ASSIGN_ACTION tdc_assign_action;
1806
1807 struct T_TDC_ACTION
1808 {
1809 //create a waper class for T_TDC_ACTION_ENUM so that the action constants can not be converted to integers
1810 T_TDC_ACTION_ENUM action;
1811 T_TDC_ACTION (T_TDC_ACTION_ENUM action_):
1812 action (action_)
1813 {
1814 //nothing
1815 }
1816 T_TDC_ACTION ();
1817 };
1818
1819 struct T_TDC_CREATE_ACTION:T_TDC_ACTION
1820 {
1821 /* This type is returned by constant action function, this allow the user to optional
1822 omit the "()" after the action name
1823 Src code After macro expantion Function returns After implicit type convting
1824 ======== ==================== ======================== =====================
1825 _skip tdc_skip() SKIP::T_TDC_CREATE_ACTION SKIP::T_TDC_ACTION
1826 _skip() tdc_skip()() SKIP::T_TDC_ACTION SKIP::T_TDC_ACTION
1827 _skip()() tdc_skip()()() <error T_TDC_ACTION have no operator ()>
1828 */
1829 T_TDC_CREATE_ACTION ();
1830 T_TDC_ACTION operator()();
1831 };
1832
1833 extern T_TDC_CREATE_ACTION SKIP;
1834 extern T_TDC_CREATE_ACTION SHOW;
1835 extern T_TDC_CREATE_ACTION FORBID;
1836 extern T_TDC_CREATE_ACTION REQUIRE;
1837 extern T_TDC_CREATE_ACTION SKIP_TO_END;
1838
1839 extern T_TDC_CREATE_ACTION tdc_skip();
1840 extern T_TDC_CREATE_ACTION tdc_show();
1841 extern T_TDC_CREATE_ACTION tdc_forbid();
1842 extern T_TDC_CREATE_ACTION tdc_require();
1843 extern T_TDC_CREATE_ACTION tdc_skip_to_end();
1844
1845 //----------------------------------------------------------------------------
1846
1847 enum T_TDC_EVENT_ENUM
1848 {
1849 TDC_EVENT_SEND,
1850 TDC_EVENT_AWAIT
1851 };
1852
1853 enum T_TDC_IS_ENUM
1854 {
1855 TDC_IS_UNKNOWN = 0,
1856 TDC_IS_VAR = 0x001,
1857 TDC_IS_STRUCT = 0x002,
1858 TDC_IS_SDU = 0x004,
1859 TDC_IS_P = 0x008,
1860 TDC_IS_M = 0x010,
1861 TDC_IS_COMP = 0x20,
1862 TDC_IS_ARRAY = 0x40,
1863 TDC_IS_UNION = 0x80,
1864 TDC_IS_MESSAGE_UNION = 0x100,
1865 TDC_IS_PRIMITIVE_UNION = 0x200,
1866 TDC_IS_MSG = 0x400,
1867 TDC_IS_PRIM = 0x800,
1868 TDC_IS_XXX_MESSAGE_UNION = 0x1000,
1869 TDC_IS_XXX_PRIMITIVE_UNION = 0x2000,
1870 TDC_IS_POINTER = 0x4000,
1871 TDC_IS_PVAR = TDC_IS_VAR | TDC_IS_P,
1872 TDC_IS_MVAR = TDC_IS_VAR | TDC_IS_M
1873 };
1874
1875 //----------------------------------------------------------------------------
1876
1877 struct T_TDC_HANDLE_BASE;
1878 struct T_TDC_DESCRIPTOR_BASE;
1879 struct T_TDC_INSTANCE_MAIN_BASE;
1880 struct T_TDC_INTERFACE_BASE;
1881 struct T_TDC_INSTANCE_BASE;
1882 struct T_TDC_PATH;
1883 struct T_TDC_PATH_TEXT;
1884
1885 typedef T_TDC_INTERFACE_BASE* (*T_TDC_NEW_INTERFACE)();
1886 typedef T_TDC_HANDLE_BASE* (*T_TDC_NEW_HANDLE)();
1887 typedef T_TDC_DESCRIPTOR_BASE* (*T_TDC_NEW_DESCRIPTOR)();
1888
1889 struct T_PRIMITIVE_UNION;
1890 struct T_TDC_INTERFACE_PRIMITIVE_UNION;
1891 struct T_TDC_DESCRIPTOR_PRIMITIVE_UNION;
1892
1893 struct T_MESSAGE_UNION;
1894 struct T_TDC_INTERFACE_MESSAGE_UNION;
1895 struct T_TDC_DESCRIPTOR_MESSAGE_UNION;
1896
1897 typedef signed long T_TDC_INT_S32;
1898 typedef signed short T_TDC_INT_S16;
1899 typedef signed char T_TDC_INT_S8;
1900 typedef unsigned long T_TDC_INT_U32;
1901 typedef unsigned short T_TDC_INT_U16;
1902 typedef unsigned char T_TDC_INT_U8;
1903 typedef char CHAR;
1904
1905 //----------------------------------------------------------------------------
1906 inline unsigned long num_elements(const unsigned char* array)
1907 {
1908 return strlen((const char*)array);
1909 }
1910
1911 inline unsigned long num_elements(const signed char* array)
1912 {
1913 return strlen((const char*)array);
1914 }
1915
1916
1917 //----------------------------------------------------------------------------
1918
1919 enum T_TDC_RW_MODE
1920 {
1921 TDC_RW_MODE_READ,
1922 TDC_RW_MODE_WRITE
1923 };
1924
1925 struct T_TDC_HANDLE_BASE
1926 {
1927 friend struct T_TDC_COPY;
1928 protected:
1929 T_TDC_ACTION_ENUM implement_get_action () const;
1930 void implement_set_action (T_TDC_ACTION_ENUM action_);
1931 T_TDC_DESCRIPTOR_BASE* implement_get_descriptor () const;
1932 void implement_set_descriptor (T_TDC_DESCRIPTOR_BASE* descriptor_);
1933 long implement_get_value () const;
1934 void implement_set_value (long value_);
1935 friend void add_name_info (T_TDC_HANDLE_BASE* descriptor_ref, int level, int parent, int index);
1936 T_TDC_PATH_TEXT path_text();
1937 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const;
1938 static T_TDC_DESCRIPTOR_BASE* call_implement_new_descriptor(T_TDC_NEW_DESCRIPTOR new_descriptor);
1939 public:
1940 T_TDC_DESCRIPTOR_BASE* make_descriptor ();
1941 T_TDC_DESCRIPTOR_BASE* make_array_descriptor (T_TDC_NEW_HANDLE new_element_handle);
1942 virtual char* get_name () const
1943 TDC_PURE_BODY({
1944 //TDC_ERROR();
1945 return 0;
1946 })
1947 virtual long get_sizeof () = 0
1948 {
1949 return sizeof *this;
1950 }
1951 T_TDC_HANDLE_BASE ();
1952 ~T_TDC_HANDLE_BASE ();
1953 T_TDC_HANDLE_BASE* get_element (int index)const;
1954 T_TDC_HANDLE_BASE* get_union_element ();
1955 void destroy ();
1956 T_TDC_DESCRIPTOR_BASE* get_descriptor()const;
1957 T_TDC_ACTION_ENUM get_action()const;
1958 long get_value()const;
1959 int get_ctrl()const;
1960 void clear();
1961 void set_descriptor_value(long value_);
1962 virtual unsigned get_sizeof_target ();
1963 virtual T_TDC_IS_ENUM is ();
1964 };
1965
1966 #ifdef TDC_USE_ALLOC_DEBUG_COUNTER
1967 struct T_TDC_ALLOC_DEBUG_COUNTER
1968 {
1969 int count;
1970 int max_count;
1971 int alloc_count;
1972 int free_count;
1973 bool alloc[1000];
1974 T_TDC_ALLOC_DEBUG_COUNTER ()
1975 {
1976 /* nothing here should allways be static allocated and there for cleared,
1977 futher more it is used before construction so intializing here will be fatal */
1978 }
1979 ~T_TDC_ALLOC_DEBUG_COUNTER ()
1980 {
1981 for (int first_not_freed = 0; !alloc[first_not_freed]; first_not_freed++)
1982 TDC_ASSERT (first_not_freed < sizeof alloc);
1983 TDC_ASSERT (count==0); // some where we have a leak
1984 }
1985 };
1986
1987 template<class T>
1988 struct T_TDC_ALLOC_DEBUG
1989 {
1990 static T_TDC_ALLOC_DEBUG_COUNTER counter;
1991 int alloc_count;
1992 T_TDC_ALLOC_DEBUG_COUNTER& counter_;
1993 T_TDC_ALLOC_DEBUG ():
1994 counter_ (counter)
1995 {
1996 counter.count++;
1997 alloc_count = counter.alloc_count++;
1998 if (alloc_count < sizeof counter.alloc)
1999 counter.alloc[alloc_count]=true;
2000 if (counter.max_count < counter.count)
2001 counter.max_count = counter.count;
2002 }
2003 ~T_TDC_ALLOC_DEBUG ()
2004 {
2005 if (alloc_count < sizeof counter.alloc)
2006 counter.alloc[alloc_count]=false;
2007 TDC_ASSERT (counter.count > 0); // deallocating more than ever allocated
2008 counter.free_count++;
2009 counter.count--;
2010 }
2011 };
2012
2013 template<class T>T_TDC_ALLOC_DEBUG_COUNTER T_TDC_ALLOC_DEBUG<T>::counter;
2014 #endif
2015
2016 enum {
2017 TDC_CTRL_DEFAULT = 0,
2018 TDC_CTRL_NO_DESCRIPTOR = -1,
2019 TDC_CTRL_NOT_AN_UNION = -2,
2020 TDC_REF_COUNT_ELEMENTS_DESTROYED = -2,
2021 TDC_DESCRIPTOR_DESTROYED_VALUE = -4,
2022 TDC_DUMMY_TAP_HANDLE = -16
2023 };
2024
2025 #define TDC_DESCRIPTOR_DESTROYED ((T_TDC_DESCRIPTOR_BASE*)TDC_DESCRIPTOR_DESTROYED_VALUE)
2026
2027 struct T_TDC_DESCRIPTOR_BASE
2028 #ifdef TDC_USE_ALLOC_DEBUG_COUNTER
2029 :T_TDC_ALLOC_DEBUG<T_TDC_DESCRIPTOR_BASE>
2030 #endif
2031 {
2032 private:
2033 friend struct T_TDC_COPY;
2034 friend void unsubscribe (T_TDC_DESCRIPTOR_BASE* descriptor);
2035 int ref_count;
2036 virtual long get_sizeof ()
2037 TDC_PURE_BODY(
2038 return 0;
2039 )
2040
2041 void destroy_elements ();
2042 protected:
2043 T_TDC_HANDLE_BASE* implement_get_element (unsigned index, char *first_element);
2044 T_TDC_HANDLE_BASE* implement_get_union_element (unsigned index, int& ctrl);
2045 public:
2046 void *operator new (size_t size);//TODO: operator new (size_t size); + eliminate T_TDC_HANDLE_BASE::T_TDC_HANDLE_BASE i.e. todo T_TDC_HANDLE_BASE::operator new (size_t size);
2047 T_TDC_PATH_TEXT path_text();
2048 virtual int read_ctrl () const
2049 {
2050 return TDC_CTRL_NOT_AN_UNION;
2051 }
2052 void set_skip_to_end_from_action (T_TDC_ACTION_ENUM action);
2053 virtual void set_skip_to_end (bool skip_to_end);
2054 virtual bool get_skip_to_end () const;
2055 virtual T_TDC_HANDLE_BASE* make_element (unsigned index);
2056 virtual T_TDC_HANDLE_BASE* get_element (unsigned index);
2057 virtual int get_tap_handle ();
2058 T_TDC_DESCRIPTOR_BASE ();
2059 virtual ~T_TDC_DESCRIPTOR_BASE ();
2060 virtual char* get_name () const
2061 TDC_PURE_BODY(
2062 return 0;
2063 )
2064 virtual T_TDC_IS_ENUM is ()
2065 {
2066 //TODO: TDC_ERROR() here and mov is function to distinct base classes;
2067 return TDC_IS_UNKNOWN;
2068 }
2069 };
2070
2071 union T_TDC_BASIC_TYPES
2072 {
2073 unsigned long u32;
2074 signed long s32;
2075 signed int s16;
2076 signed char s8;
2077 char c[4];
2078 };
2079
2080 //----------------------------------------------------------------------------
2081
2082 struct T_TDC_INTERFACE_BASE
2083 {
2084 private:
2085 void* operator &(); /* this member function is only here to prevent the user from taking the address of
2086 an interface, which make no sence to the user as it gives the address of
2087 some internal tdc navigation data */
2088 #ifdef LINT //TODO: introduce for VC too
2089 const void* operator &() const; /* but we don't want ripling errors from LINT
2090 the ripling errors comes from the fact that LINT seems to have a more correct
2091 interpretion of where to use the overloaded function and where to truely take
2092 the address*/
2093 #endif
2094 protected:
2095 T_TDC_LEVEL level[1];
2096 T_TDC_ASSIGN_ACTION set_action (const T_TDC_ACTION& action_);
2097 T_TDC_INTERFACE_BASE ()
2098 {
2099 //nothing
2100 }
2101 public:
2102 T_TDC_PATH* implement_make_descriptor_ref (T_TDC_RW_MODE rw_mode);
2103 T_TDC_PATH* make_descriptor_ref (T_TDC_RW_MODE rw_mode);
2104 const T_TDC_PATH* make_descriptor_ref (T_TDC_RW_MODE rw_mode) const;
2105 void set_descriptor_value (long value_);
2106 //bool cmp_descriptor_value (long value_);
2107 void copy_instance (const T_TDC_INSTANCE_BASE * value_);
2108 void copy_interface (const T_TDC_INTERFACE_BASE * value_);
2109 };
2110
2111 struct T_TDC_INTERFACE_MAIN_BASE
2112 #if DOT_COMPLETE_MEMBERS
2113 #else
2114 TDC_DOT_COMPLETE_HIDE(:T_TDC_INTERFACE_BASE)
2115 #endif
2116 {
2117 #if DOT_COMPLETE_MEMBERS
2118 #else
2119 protected:
2120 void set_main_value (const T_TDC_INTERFACE_MAIN_BASE* value_);
2121 void set_main_value (const T_TDC_INSTANCE_MAIN_BASE* value_);
2122 T_TDC_INTERFACE_BASE* get_element_navigation(T_TDC_NEW_INTERFACE new_element_interface);
2123 /*T_TDC_INTERFACE_MAIN_BASE ()
2124 {
2125 tdc_level++;
2126 }*/
2127 #endif
2128 };
2129
2130 struct T_TDC_INTERFACE_REF_BASE
2131 #if DOT_COMPLETE_MEMBERS
2132 #else
2133 TDC_DOT_COMPLETE_HIDE(:T_TDC_INTERFACE_BASE)
2134 #endif
2135 {
2136 #if DOT_COMPLETE_MEMBERS
2137 T_TDC_ASSIGN_ACTION _skip () {} /* you can use '= SKIP' as well */
2138 T_TDC_ASSIGN_ACTION _show () {} /* you can use '= SHOW' as well */
2139 T_TDC_ASSIGN_ACTION _forbid () {} /* you can use '= FORBID' as well */
2140 T_TDC_ASSIGN_ACTION _require () {} /* you can use '= REQUIRE' as well */
2141 #else//DOT_COMPLETE_MEMBERS
2142 T_TDC_INTERFACE_REF_BASE ()
2143 {
2144 level[0] = 'A'+tdc_level;
2145 }
2146 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_skip ();) /* you can use '= SKIP' as well */
2147 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_show ();) /* you can use '= SHOW' as well */
2148 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_forbid ();) /* you can use '= FORBID' as well */
2149 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_require ();) /* you can use '= REQUIRE' as well */
2150 #endif//DOT_COMPLETE_MEMBERS
2151 };
2152
2153 struct T_TDC_INTERFACE_VAR_BASE
2154 #if DOT_COMPLETE_MEMBERS
2155 #else
2156 TDC_DOT_COMPLETE_HIDE(:T_TDC_INTERFACE_BASE)
2157 #endif
2158 {
2159 #if DOT_COMPLETE_MEMBERS
2160 T_TDC_ASSIGN_ACTION _skip () {} /* you can use '= SKIP' as well */
2161 T_TDC_ASSIGN_ACTION _show () {} /* you can use '= SHOW' as well */
2162 T_TDC_ASSIGN_ACTION _forbid () {} /* you can use '= FORBID' as well */
2163 T_TDC_ASSIGN_ACTION _require () {} /* you can use '= REQUIRE' as well */
2164 #else//DOT_COMPLETE_MEMBERS
2165 T_TDC_INTERFACE_VAR_BASE ()
2166 {
2167 level[0] = 'A'+tdc_level;
2168 }
2169 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_skip ();) /* you can use '= SKIP' as well */
2170 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_show ();) /* you can use '= SHOW' as well */
2171 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_forbid ();) /* you can use '= FORBID' as well */
2172 TDC_DOT_COMPLETE_HIDE(T_TDC_ASSIGN_ACTION tdc_require ();) /* you can use '= REQUIRE' as well */
2173 #endif//DOT_COMPLETE_MEMBERS
2174 };
2175
2176 //----------------------------------------------------------------------------
2177
2178 #if TDC_DEBUG_DOT_COMPLETE
2179 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1K()
2180 {
2181 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2182 s.
2183 i;
2184 s->
2185 i0;
2186 }
2187 #else
2188 #endif
2189
2190 //----------------------------------------------------------------------------
2191 /** \defgroup PATH PATH
2192 * A set of classes and functions that is used for generating the path of
2193 * an element when generating warning or error messages.
2194 * TODO: need more work
2195 */
2196 //\{
2197
2198 struct T_TDC_PATH
2199 #ifdef TDC_USE_ALLOC_DEBUG_COUNTER
2200 :T_TDC_ALLOC_DEBUG<T_TDC_PATH>
2201 #endif
2202 {
2203 T_TDC_HANDLE_BASE* handle;
2204 T_TDC_DESCRIPTOR_BASE* cahed_descriptor;
2205 int indexes_count;
2206 union{
2207 int *indexes;
2208 struct T_WATCH_INDEXES{
2209 int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;
2210 }*watch_indexes;
2211 };
2212 T_TDC_INTERFACE_BASE* pattern;
2213 T_TDC_PATH* next;
2214 T_TDC_PATH (T_TDC_HANDLE_BASE* handle_);
2215 ~T_TDC_PATH ();
2216 void add_index(T_TDC_DESCRIPTOR_BASE* descriptor, int index);
2217 void add_to_cashed_path_list ();
2218 T_TDC_HANDLE_BASE* get_leaf();
2219 T_TDC_PATH_TEXT get_path_text ();
2220 T_TDC_PATH* duplicate()const;
2221 };
2222
2223 //----------------------------------------------------------------------------
2224
2225 #if TDC_DEBUG_DOT_COMPLETE
2226 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1L()
2227 {
2228 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2229 s.
2230 i;
2231 s->
2232 i0;
2233
2234 }
2235 #else
2236 #endif
2237
2238 //----------------------------------------------------------------------------
2239
2240 struct const_T_TDC_COPY
2241 {
2242 T_TDC_HANDLE_BASE* descriptor_ref;
2243 const T_TDC_PATH* path;
2244 const_T_TDC_COPY (const T_TDC_PATH* path_):
2245 descriptor_ref (const_cast<T_TDC_PATH*>(path_)->get_leaf()),
2246 path (path_)
2247 {
2248 }
2249 const_T_TDC_COPY (const T_TDC_HANDLE_BASE* descriptor_ref_):
2250 descriptor_ref (const_cast<T_TDC_HANDLE_BASE*>(descriptor_ref_)),
2251 path (0)
2252 {
2253 }
2254 const_T_TDC_COPY (const const_T_TDC_COPY& src):
2255 descriptor_ref (src.descriptor_ref),
2256 path (0)
2257 {
2258 if (src.path)
2259 path = src.path->duplicate();
2260 }
2261 void operator = (const const_T_TDC_COPY& src)
2262 {
2263 descriptor_ref = src.descriptor_ref;
2264 if (path)
2265 delete path;
2266 if (src.path)
2267 path = src.path->duplicate();
2268 else
2269 path = 0;
2270 }
2271 const T_TDC_HANDLE_BASE* operator->()
2272 {
2273 return descriptor_ref;
2274 }
2275 operator const T_TDC_HANDLE_BASE*()const
2276 {
2277 return descriptor_ref;
2278 }
2279 ~const_T_TDC_COPY ()
2280 {
2281 if (path)
2282 delete path;
2283 }
2284 T_TDC_PATH_TEXT path_text ();
2285 T_TDC_ACTION_ENUM get_action () const
2286 {
2287 return descriptor_ref->get_action();
2288 }
2289 bool has_value () const
2290 {
2291 return (descriptor_ref->get_action() & TDC_ACTION_HAS_VALUE) != 0;
2292 }
2293 int get_value () const
2294 {
2295 return descriptor_ref->get_value();
2296 }
2297 };
2298
2299 struct T_TDC_COPY:const_T_TDC_COPY
2300 {
2301 friend struct T_TDC_COPY;
2302 T_TDC_COPY (T_TDC_PATH* path_):
2303 const_T_TDC_COPY (path_)
2304 {
2305 }
2306 T_TDC_COPY (T_TDC_HANDLE_BASE* descriptor_ref_):
2307 const_T_TDC_COPY (descriptor_ref_)
2308 {
2309 }
2310 T_TDC_HANDLE_BASE* operator->()
2311 {
2312 return descriptor_ref;
2313 }
2314 operator T_TDC_HANDLE_BASE*()const
2315 {
2316 return descriptor_ref;
2317 }
2318 void copy_descriptor_ref (const const_T_TDC_COPY& value_);
2319 void copy_number (long value_);
2320 T_TDC_ASSIGN_ACTION copy_action (T_TDC_ACTION_ENUM action_);
2321 private:
2322 void set_action_and_value (T_TDC_ACTION_ENUM action_, long value_=0xFCFCFCFC);
2323 };
2324
2325 //----------------------------------------------------------------------------
2326
2327 /** \struct T_TDC_PATH_TEXT
2328 T_TDC_PATH_TEXT is used to return a string on the heap that will auto dealloc
2329 <pre>
2330 e.g.
2331
2332 T_TDC_PATH_TEXT f()
2333 {
2334 return strdup ("...");
2335 }
2336
2337 void g()
2338 {
2339 printf ("%s", f()); // free of string allocated in f() will happen automatic
2340 // when ~T_TDC_PATH_TEXT is called at the end of sentence (at ';')
2341 }
2342 </pre>
2343 */
2344 struct T_TDC_PATH_TEXT
2345 {
2346 char* str;
2347 T_TDC_PATH_TEXT(char* str_);
2348 ~T_TDC_PATH_TEXT();
2349 };
2350
2351 //\}
2352
2353 //----------------------------------------------------------------------------
2354
2355 #if TDC_DEBUG_DOT_COMPLETE
2356 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1N()
2357 {
2358 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2359 s.
2360 i;
2361 s->
2362 i0;
2363
2364 }
2365 #else
2366 #endif
2367
2368 //============================================================================
2369 /// \defgroup T_TDC_INTERFACE
2370 //\{
2371
2372 struct T_TDC_INTERFACE_REF:T_TDC_INTERFACE_REF_BASE
2373 {
2374 #if DOT_COMPLETE_MEMBERS
2375 #else
2376 T_TDC_INTERFACE_REF ()
2377 {
2378 tdc_level++;
2379 }
2380 #endif
2381 };
2382
2383 struct T_TDC_INTERFACE_VAR:T_TDC_INTERFACE_VAR_BASE
2384 {
2385 #if DOT_COMPLETE_MEMBERS
2386 #else
2387 T_TDC_INTERFACE_VAR ()
2388 {
2389 //nothing
2390 }
2391 #endif
2392 };
2393
2394 //============================================================================
2395
2396 #if TDC_DEBUG_DOT_COMPLETE
2397 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1O
2398 {
2399 int i1O;
2400 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
2401 };
2402 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1O()
2403 {
2404 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2405 s.
2406 i;
2407 s->
2408 i0;
2409 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1O s10;
2410 s10->
2411 i0;
2412 }
2413 #else
2414 #endif
2415
2416 //----------------------------------------------------------------------------
2417
2418 #if DOT_COMPLETE
2419 #define TDC_HIDDEN_LEVEL_DEF
2420 #define TDC_HIDDEN_LEVEL(T_BASE)
2421 #define TDC_HIDDEN_LEVEL_MAIN_DEF
2422 #define TDC_HIDDEN_LEVEL_MAIN(T_BASE)
2423 struct T_TDC_INTERFACE_POINTER_MAIN_BASE:T_TDC_INTERFACE_REF_BASE
2424 {
2425 };
2426 #else
2427 #define TDC_HIDDEN_LEVEL_DEF
2428 #define TDC_HIDDEN_LEVEL
2429 #define TDC_HIDDEN_LEVEL_MAIN_DEF , class T_TDC_INTERFACE_POINTER_MAIN_BASE = T_TDC_INTERFACE_POINTER_MAIN_BASE_DEFAULT
2430 #define TDC_HIDDEN_LEVEL_MAIN(T_BASE) , T_BASE
2431 #endif
2432
2433 struct T_TDC_INTERFACE_PRIMITIVE_BASE:T_TDC_INTERFACE_MAIN_BASE
2434 {
2435 };
2436
2437 struct T_TDC_INTERFACE_MESSAGE_BASE:T_TDC_INTERFACE_MAIN_BASE
2438 {
2439 };
2440
2441 //template<class T TDC_HIDDEN_LEVEL_MAIN_DEF > struct T_TDC_INTERFACE_POINTER_MAIN:T_TDC_INTERFACE_POINTER_BASE
2442 template<class T TDC_HIDDEN_LEVEL_MAIN_DEF > struct T_TDC_INTERFACE_POINTER_MAIN:T_TDC_INTERFACE_POINTER_MAIN_BASE
2443 {
2444 T_TDC_INTERFACE_POINTER_MAIN ()
2445 {
2446 level[0] = 'A'+tdc_level;
2447 }
2448 #if DOT_COMPLETE_MEMBERS
2449 #else //DOT_COMPLETE_MEMBERS
2450 operator = (const T& t)
2451 {
2452 tdc_tbd_pointer_assignment_error();
2453 //get_navigation()->_set(t);
2454 return 0;
2455 }
2456 #endif //DOT_COMPLETE_MEMBERS
2457 /*operator = (const T_TDC_INSTANCE& t)
2458 {
2459 get_navigation()->_set(t);
2460 }*/
2461 T* operator-> (){
2462 return (T*)get_element_navigation(new_element_interface);
2463 }
2464 /*operator const T&()
2465 {
2466 return *get_navigation();
2467 }*/
2468 private:
2469 #if DOT_COMPLETE_MEMBERS
2470 #else //DOT_COMPLETE_MEMBERS
2471 static T_TDC_INTERFACE_BASE* new_element_interface()
2472 {
2473 return new T;
2474 }
2475 #endif //DOT_COMPLETE_MEMBERS
2476 };
2477
2478 template<class T> struct T_ARRAY;
2479
2480 struct T_TDC_INTERFACE_ARRAY_BASE
2481 :T_TDC_INTERFACE_REF_BASE
2482 {
2483 #if DOT_COMPLETE
2484 #else
2485 protected:
2486 T_TDC_INTERFACE_BASE* get_element_navigation(int index, T_TDC_NEW_INTERFACE new_element_interface, T_TDC_NEW_HANDLE new_handle);
2487 void copy_basic_array (const T_TDC_INT_U8* array, unsigned size, void *address);
2488 void copy_basic_array (const T_TDC_INT_S8* array, unsigned size, void *address);
2489 void copy_basic_array (const T_TDC_INT_U16* array, unsigned size, void *address);
2490 void copy_basic_array (const T_TDC_INT_S16* array, unsigned size, void *address);
2491 void copy_basic_array (const T_TDC_INT_U32* array, unsigned size, void *address);
2492 void copy_basic_array (const T_TDC_INT_S32* array, unsigned size, void *address);
2493 #endif
2494 };
2495
2496 /*
2497 ** TODO: Function header (this is a comment for an bug fix)
2498 **
2499 ** I would expect dropdown to work for this
2500 ** template<class T, int MAX_INDEX > struct T_TDC_INTERFACE_ARRAY:T_TDC_INTERFACE_POINTER_BASE_DEFAULT
2501 ** ^^
2502 ** and to fail for this
2503 ** template<class T, int MAX_INDEX, int DUMMY=0 > struct T_TDC_INTERFACE_ARRAY:T_TDC_INTERFACE_POINTER_BASE_DEFAULT
2504 ** ^^^^^^^^^^^^^
2505 **
2506 ** but it seams to be the otherway around (see more info in tcd_test.cpp::test_1000())
2507 */
2508
2509 #if DOT_COMPLETE
2510 template<class T /*T_INTERFACE*/, int MAX_INDEX = 1, int DUMMY=0> struct T_TDC_INTERFACE_ARRAY
2511 #else
2512 template<class T /*T_INTERFACE*/, int MAX_INDEX = 1> struct T_TDC_INTERFACE_ARRAY
2513 //template<class T /*T_INTERFACE*/> struct T_TDC_INTERFACE_ARRAY
2514 #endif
2515 :T_TDC_INTERFACE_ARRAY_BASE
2516 {
2517 public:
2518 T& operator [] (int index)//HINT: blah
2519 {
2520 return *(T*)get_element_navigation (index, new_element_interface, T::implement_new_handle);
2521 }
2522 T* operator-> ()//HINT: blah
2523 {
2524 return (T*)get_element_navigation (0, new_element_interface, T::implement_new_handle);
2525 }
2526 #if DOT_COMPLETE_MEMBERS
2527 #else//DOT_COMPLETE_MEMBERS
2528 T_TDC_INTERFACE_ARRAY ()
2529 {
2530 //nothing
2531 }
2532 void assign (const T_TDC_INT_U8* array, unsigned size, void *address)
2533 {
2534 copy_basic_array (array, size, address);
2535 }
2536 void assign (const T_TDC_INT_S8* array, unsigned size, void *address)
2537 {
2538 copy_basic_array (array, size, address);
2539 }
2540 void assign (const T_TDC_INT_U16* array, unsigned size, void *address)
2541 {
2542 copy_basic_array (array, size, address);
2543 }
2544 void assign (const T_TDC_INT_S16* array, unsigned size, void *address)
2545 {
2546 copy_basic_array (array, size, address);
2547 }
2548 void assign (const T_TDC_INT_U32* array, unsigned size, void *address)
2549 {
2550 copy_basic_array (array, size, address);
2551 }
2552 void assign (const T_TDC_INT_S32* array, unsigned size, void *address)
2553 {
2554 copy_basic_array (array, size, address);
2555 }
2556 void assign (const T_TDC_ACTION& action_, unsigned size, void *address)
2557 {
2558 set_action(action_);
2559 }
2560 /*template <class U>
2561 void assign (const U* u, unsigned size)
2562 {
2563 //TDC_TBD();
2564 }*/
2565 template <class U>
2566 void assign (const T_ARRAY<U>& src, unsigned size, void *address)
2567 {
2568 T_TDC_COPY handle = make_descriptor_ref (TDC_RW_MODE_WRITE);
2569 handle.copy_descriptor_ref (src.handle);
2570 }
2571 void assign (const T* t, unsigned size, void *address)
2572 {
2573 //tdc_check_array_assignment(array, address);
2574 tdc_tbd_array_assignment_error();
2575 }
2576 void assign (const T::T_INSTANCE* array, unsigned size, void *address)
2577 {
2578 tdc_check_array_assignment(array, address);
2579 //copy_instance_array (array, size);
2580 T_TDC_COPY handle = make_descriptor_ref (TDC_RW_MODE_WRITE);
2581 T_TDC_HANDLE_BASE* descriptor_ref = handle.descriptor_ref;
2582 T_TDC_DESCRIPTOR_BASE* descriptor = descriptor_ref->make_descriptor ();
2583 T_TDC_HANDLE_BASE** elements = ((T_TDC_DESCRIPTOR_ARRAY_BASE*)descriptor)->get_elements();
2584 if (!*elements)
2585 *elements = T::implement_new_handle ();
2586 int count = size / sizeof *array;
2587
2588 for (int i = 0; i < count; i++)
2589 {
2590 T_TDC_COPY dst_element = descriptor->make_element(i);
2591 const_T_TDC_COPY src_element = (T_TDC_HANDLE_BASE*) array[i].handle;
2592 dst_element.copy_descriptor_ref (src_element);
2593 }
2594 }
2595 template <class U>
2596 T_TDC_INTERFACE_ARRAY& operator = (const U& array)
2597 {
2598 int size = sizeof array; /* if you have error "illegal indirection" here the right hand operator can not be converted to an array
2599 see next error message for the bad assignment */
2600 assign (array, size, (void*)&array);
2601 return *this;
2602 }
2603 private:
2604 static T_TDC_INTERFACE_BASE* new_element_interface()
2605 {
2606 return new T;
2607 }
2608 #endif//DOT_COMPLETE_MEMBERS
2609 };
2610
2611 /*
2612 ** TODO: Function header (this is a comment for an bug fix)
2613 **
2614 ** When we change T_TDC_INTERFACE_ARRAY we have to change T_TDC_INTERFACE_POINTER too
2615 ** template<class T TDC_HIDDEN_LEVEL_DEF > struct T_TDC_INTERFACE_POINTER:T_TDC_INTERFACE_ARRAY<T, 1 TDC_HIDDEN_LEVEL>
2616 */
2617
2618 struct T_TDC_INTERFACE_POINTER_BASE:T_TDC_INTERFACE_REF_BASE
2619 {
2620 protected:
2621 T_TDC_INTERFACE_BASE* get_navigation(T_TDC_NEW_INTERFACE new_element_interface, T_TDC_NEW_HANDLE new_handle);
2622 T_TDC_INTERFACE_BASE* get_navigation(T_TDC_NEW_INTERFACE new_element_interface, T_TDC_NEW_HANDLE new_handle, int index);
2623 };
2624
2625 template<class T_INTERFACE> struct T_TDC_INTERFACE_POINTER
2626 #if DOT_COMPLETE
2627 #else
2628 :T_TDC_INTERFACE_POINTER_BASE
2629 #endif
2630 {
2631 T_INTERFACE* operator-> ()
2632 {
2633 return (T_INTERFACE*)get_navigation (new_element_interface, T_INTERFACE::implement_new_handle);
2634 }
2635 #if DOT_COMPLETE_MEMBERS
2636 #else//DOT_COMPLETE_MEMBERS
2637 T_INTERFACE& operator [] (int index)
2638 {
2639 return *(T_INTERFACE*)get_navigation (new_element_interface, T_INTERFACE::implement_new_handle, index);
2640 }
2641 static T_TDC_INTERFACE_BASE* new_element_interface()
2642 {
2643 return new T_INTERFACE;
2644 }
2645 /*T_TDC_INTERFACE_POINTER ()
2646 {
2647 //nothing
2648 }*/
2649 #endif//DOT_COMPLETE_MEMBERS
2650 };
2651
2652 //============================================================================
2653
2654 #if TDC_DEBUG_DOT_COMPLETE
2655 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1P
2656 {
2657 int i1P;
2658 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
2659 };
2660 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1P()
2661 {
2662 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2663 s.
2664 i;
2665 s->
2666 i0;
2667 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1P s1P;
2668 s1P->
2669 i0;
2670 T_TDC_INTERFACE_ARRAY<int> i;
2671 i.assign(0,0);
2672 T_ARRAY<int> array;
2673 array.
2674
2675 }
2676 #else
2677 #endif
2678
2679 //----------------------------------------------------------------------------
2680 // T_TDC_INTERFACE
2681 //----------------------------------------------------------------------------
2682
2683 struct T_TDC_INTERFACE_PRIM_BASE:T_TDC_INTERFACE_PRIMITIVE_BASE
2684 {
2685 T_TDC_INTERFACE_PRIM_BASE ()
2686 {
2687 level[0] = 'A'+tdc_level;
2688 tdc_level++;
2689 }
2690 #if DOT_COMPLETE_MEMBERS//{{
2691 T_TDC_ASSIGN_ACTION _require () {} // you can use '= REQUIRE' as well
2692 #else//}DOT_COMPLETE_MEMBERS{
2693 T_TDC_ASSIGN_ACTION tdc_require() // you can use '= REQUIRE' as well
2694 {
2695 return set_action (REQUIRE);
2696 }
2697 #endif//}}DOT_COMPLETE_MEMBERS
2698 };
2699
2700 struct T_TDC_INTERFACE_PSTRUCT_BASE:T_TDC_INTERFACE_REF
2701 {
2702 };
2703
2704 struct T_TDC_INTERFACE_PUNION_BASE:T_TDC_INTERFACE_REF
2705 {
2706 };
2707
2708 struct T_TDC_INTERFACE_SDU_BASE:T_TDC_INTERFACE_REF
2709 {
2710 };
2711
2712 struct T_TDC_INTERFACE_PENUM_BASE:T_TDC_INTERFACE_VAR
2713 {
2714 };
2715
2716 struct T_TDC_INTERFACE_MSG_BASE:T_TDC_INTERFACE_MESSAGE_BASE
2717 {
2718 T_TDC_INTERFACE_MSG_BASE ()
2719 {
2720 level[0] = 'A'+tdc_level;
2721 tdc_level++;
2722 }
2723 #if DOT_COMPLETE_MEMBERS
2724 T_TDC_ASSIGN_ACTION _require () {} // you can use '= REQUIRE' as well
2725 #else//DOT_COMPLETE_MEMBERS
2726 T_TDC_ASSIGN_ACTION tdc_require() // you can use '= REQUIRE' as well
2727 {
2728 return set_action (REQUIRE);
2729 }
2730 #endif//DOT_COMPLETE_MEMBERS
2731 };
2732
2733 struct T_TDC_INTERFACE_MSTRUCT_BASE:T_TDC_INTERFACE_REF
2734 {
2735 };
2736
2737 struct T_TDC_INTERFACE_MUNION_BASE:T_TDC_INTERFACE_REF
2738 {
2739 };
2740
2741 struct T_TDC_INTERFACE_MENUM_BASE:T_TDC_INTERFACE_VAR
2742 {
2743 };
2744
2745 struct T_TDC_INTERFACE_INT_BASE:T_TDC_INTERFACE_VAR
2746 {
2747 };
2748
2749 struct T_TDC_INTERFACE_XXX_PRIMITIVE_UNION_BASE:T_TDC_INTERFACE_PRIMITIVE_BASE
2750 {
2751 T_TDC_INTERFACE_XXX_PRIMITIVE_UNION_BASE ()
2752 {
2753 level[0] = 'A'+tdc_level;
2754 tdc_level++;
2755 }
2756 };
2757
2758 struct T_TDC_INTERFACE_XXX_MESSAGE_UNION_BASE:T_TDC_INTERFACE_MESSAGE_BASE
2759 {
2760 T_TDC_INTERFACE_XXX_MESSAGE_UNION_BASE ()
2761 {
2762 level[0] = 'A'+tdc_level;
2763 tdc_level++;
2764 }
2765 };
2766
2767 struct T_TDC_INTERFACE_PRIMITIVE_UNION_BASE:T_TDC_INTERFACE_PRIMITIVE_BASE
2768 {
2769 T_TDC_INTERFACE_PRIMITIVE_UNION_BASE ()
2770 {
2771 level[0] = 'A'+tdc_level;
2772 tdc_level++;
2773 }
2774 };
2775
2776 struct T_TDC_INTERFACE_MESSAGE_UNION_BASE:T_TDC_INTERFACE_MESSAGE_BASE
2777 {
2778 T_TDC_INTERFACE_MESSAGE_UNION_BASE ()
2779 {
2780 level[0] = 'A'+tdc_level;
2781 tdc_level++;
2782 }
2783 };
2784
2785 #if TDC_DEBUG_DOT_COMPLETE
2786 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q
2787 {
2788 int i1Q;
2789 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
2790 };
2791 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q()
2792 {
2793 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2794 s.
2795 i;
2796 s->
2797 i0;
2798 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q s1Q;
2799 s1Q->
2800 i;
2801 }
2802 #else
2803 #endif
2804
2805 template<class T> struct T_TDC_INTERFACE_XXX_PRIMITIVE:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_PRIMITIVE_BASE) >
2806 {
2807 };
2808
2809 template<class T> struct T_TDC_INTERFACE_XXX_MESSAGE:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_MESSAGE_BASE) >
2810 {
2811 };
2812
2813 template<class T> struct T_TDC_INTERFACE_PRIMITIVE:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_PRIMITIVE_BASE) >
2814 {
2815 };
2816
2817 template<class T> struct T_TDC_INTERFACE_PRIMITIVE_UNION_POINTER:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_PRIMITIVE_BASE) >
2818 {
2819 };
2820
2821 template<class T> struct T_TDC_INTERFACE_MESSAGE:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_MESSAGE_BASE) >
2822 {
2823 };
2824
2825 template<class T> struct T_TDC_INTERFACE_MESSAGE_UNION_POINTER:T_TDC_INTERFACE_POINTER_MAIN<T TDC_HIDDEN_LEVEL_MAIN(T_TDC_INTERFACE_MESSAGE_BASE) >
2826 {
2827 };
2828
2829 //\}
2830
2831 #if TDC_DEBUG_DOT_COMPLETE
2832 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1
2833 {
2834 int i1Q1;
2835 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
2836 };
2837 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1u
2838 {
2839 int i1Q1u;
2840 };
2841 template<class T>
2842 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1t1
2843 {
2844 int i1Q1t;
2845 //T* operator->(){return 0;}
2846 };
2847 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1()
2848 {
2849 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1 s1Q1;
2850 s1Q1->
2851 i;
2852 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1t1<T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1u> s1Q1t1u;
2853 s1Q1t1u.
2854 i1Q1t;
2855 s1Q1t1u->
2856 i1Q1u;
2857 /*T_TDC_INTERFACE_PRIMITIVE_UNION_POINTER z1Q1_;
2858 z1Q1_->
2859 i;*/
2860 T_TDC_INTERFACE_PRIMITIVE_UNION_POINTER<T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Q1> z1Q1;
2861 z1Q1.
2862 x;
2863 z1Q1->
2864 i;
2865 }
2866 #else
2867 #endif
2868
2869 //============================================================================
2870
2871 #if TDC_DEBUG_DOT_COMPLETE
2872 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1R
2873 {
2874 int i1R;
2875 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
2876 };
2877 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1R()
2878 {
2879 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
2880 s.
2881 i;
2882 s->
2883 i0;
2884 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1R s1R;
2885 s1R->
2886 i0;
2887 }
2888 #else
2889 #endif
2890
2891 //----------------------------------------------------------------------------
2892 /// \defgroup T_TDC_DESCRIPTOR T_TDC_DESCRIPTOR
2893 /// base classes to repeat stuff that is similar in many descriptor classes
2894 //----------------------------------------------------------------------------
2895 //\{
2896
2897 struct T_TDC_DESCRIPTOR_ARRAY_BASE:T_TDC_DESCRIPTOR_BASE
2898 {
2899 int tap_handle;
2900 int implement_get_tap_array_handle (unsigned c_elements, T_TDC_DESCRIPTOR_BASE* sdu_handle);
2901 int get_tap_array_handle (unsigned c_elements);
2902 bool skip_to_end;
2903 virtual T_TDC_IS_ENUM is ();
2904 virtual void set_skip_to_end (bool skip_to_end_);
2905 virtual bool get_skip_to_end ();
2906 T_TDC_DESCRIPTOR_ARRAY_BASE ();
2907 virtual char* get_name () const;
2908 ~T_TDC_DESCRIPTOR_ARRAY_BASE ();
2909 T_TDC_HANDLE_BASE** get_elements();
2910 unsigned get_c_elements();
2911 void set_c_elements(unsigned c_elements);
2912 T_TDC_HANDLE_BASE* make_element (unsigned index);
2913 T_TDC_HANDLE_BASE* get_element (unsigned index);
2914 };
2915
2916 template<class T, int MAX_INDEX = 1>
2917 struct T_TDC_DESCRIPTOR_ARRAY:T_TDC_DESCRIPTOR_ARRAY_BASE
2918 {
2919 typedef T_TDC_DESCRIPTOR_ARRAY<T, MAX_INDEX> T_DESCRIPTOR_ARRAY;
2920 friend T_TDC_DESCRIPTOR_BASE * new_T_DESCRIPTOR_ARRAY(void)
2921 {
2922 return new T_TDC_DESCRIPTOR_ARRAY<T, MAX_INDEX>;
2923 }
2924 unsigned c_elements;
2925 typedef T T_ELEMENT;
2926 T_ELEMENT* elements;
2927 T_TDC_DESCRIPTOR_ARRAY()
2928 {
2929 c_elements = 0;
2930 elements = 0;
2931 }
2932 virtual int get_tap_handle ()
2933 {
2934 return get_tap_array_handle (c_elements);
2935 }
2936 #ifndef TDC_TEST_PROFILE
2937 virtual long get_sizeof ()
2938 {
2939 /* this function should never be called but the base version have no chance of returning a proper value so we keep it just in case */
2940 TDC_DYNAMIC_DEAD_CODE();
2941 return sizeof *this;
2942 }
2943 #endif
2944 };
2945
2946 struct T_TDC_HANDLE_ARRAY_BASE:T_TDC_HANDLE_BASE
2947 {
2948 virtual char* get_name () const;
2949 virtual T_TDC_IS_ENUM is ()
2950 {
2951 return TDC_IS_ARRAY;
2952 }
2953 };
2954
2955 template<class T, int MAX_INDEX = 1>
2956 struct T_TDC_HANDLE_ARRAY:T_TDC_HANDLE_ARRAY_BASE
2957 {
2958 typedef T_TDC_DESCRIPTOR_ARRAY<T, MAX_INDEX> T_DESCRIPTOR_ARRAY;
2959 virtual long get_sizeof ()
2960 {
2961 return sizeof *this;
2962 }
2963 M_TDC_DESCRIPTOR_HANDLE_ADDITIONAL_PART (T_DESCRIPTOR_ARRAY)
2964 protected:
2965 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const;
2966 };
2967
2968 #if DOT_COMPLETE
2969 #else
2970 // the dot complete compiler can not handle this code
2971 template<class T, int MAX_INDEX>
2972 T_TDC_DESCRIPTOR_BASE* T_TDC_HANDLE_ARRAY<T, MAX_INDEX>::implement_new_descriptor(void) const
2973 {
2974 //return new T_DESCRIPTOR_ARRAY;
2975 /*TODO: We don't allways need the element array and the code was once remove
2976 but it seems like there are still problems with code like:
2977 T_ARRAY<T_S8> parray_ps8c;
2978 parray_ps8c[0]. _require;
2979 */
2980 T_DESCRIPTOR_ARRAY *descriptor = new T_DESCRIPTOR_ARRAY;
2981 /*T_TDC_HANDLE_BASE** elements = ((T_TDC_DESCRIPTOR_ARRAY_BASE*)descriptor)->get_elements();
2982 if (!*elements)
2983 //*elements = new_handle ();
2984 *elements = T::implement_new_handle();*/
2985 return descriptor;
2986 }
2987 #endif
2988
2989 #ifdef TDC_SIMULATE_POINTER
2990 #define T_TDC_DESCRIPTOR_POINTER T_TDC_DESCRIPTOR_ARRAY
2991 #define T_TDC_HANDLE_POINTER T_TDC_HANDLE_ARRAY
2992 #else
2993
2994 struct T_TDC_DESCRIPTOR_POINTER_BASE:T_TDC_DESCRIPTOR_BASE
2995 {
2996 virtual T_TDC_IS_ENUM is ();
2997 virtual char* get_name () const;
2998 T_TDC_HANDLE_BASE** get_elements();
2999 virtual T_TDC_HANDLE_BASE* get_element (unsigned index);
3000 virtual int get_tap_handle ();
3001 //virtual int read_ctrl () const;
3002 };
3003
3004 template<class T /*T_HANDLE*/> struct T_TDC_DESCRIPTOR_POINTER:T_TDC_DESCRIPTOR_POINTER_BASE
3005 {
3006 typedef T_TDC_DESCRIPTOR_POINTER<T> T_DESCRIPTOR_POINTER;
3007 friend T_TDC_DESCRIPTOR_BASE * new_T_DESCRIPTOR_POINTER(void)
3008 {
3009 return new T_TDC_DESCRIPTOR_POINTER<T, MAX_INDEX>;
3010 }
3011 //T::T_DESCRIPTOR element;
3012 T* element;
3013 //T element;
3014 #ifndef TDC_TEST_PROFILE
3015 virtual long get_sizeof ()
3016 {
3017 /* this function should never be called but the base version have no chance of returning a proper value so we keep it just in case */
3018 TDC_DYNAMIC_DEAD_CODE();
3019 return sizeof *this;
3020 }
3021 #endif
3022 };
3023
3024 struct T_TDC_HANDLE_POINTER_BASE:T_TDC_HANDLE_BASE
3025 {
3026 virtual char* get_name () const;
3027 virtual T_TDC_IS_ENUM is ()
3028 {
3029 return TDC_IS_POINTER;
3030 }
3031 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const;
3032 };
3033
3034 template<class T> struct T_TDC_HANDLE_POINTER:T_TDC_HANDLE_POINTER_BASE
3035 {
3036 typedef T_TDC_DESCRIPTOR_POINTER<T> T_DESCRIPTOR_POINTER;
3037 virtual long get_sizeof ()
3038 {
3039 return sizeof *this;
3040 }
3041 M_TDC_DESCRIPTOR_HANDLE_ADDITIONAL_PART (T_DESCRIPTOR_POINTER)
3042 protected:
3043 virtual T_TDC_DESCRIPTOR_BASE* implement_new_descriptor () const;
3044 };
3045
3046 #if DOT_COMPLETE
3047 #else
3048 // the dot complete compiler can not handle this code
3049 template<class T>
3050 T_TDC_DESCRIPTOR_BASE* T_TDC_HANDLE_POINTER<T>::implement_new_descriptor(void) const
3051 {
3052 return new T_DESCRIPTOR_POINTER;
3053 }
3054 #endif
3055
3056 #endif
3057
3058 //----------------------------------------------------------------------------
3059
3060 struct T_TDC_DESCRIPTOR_MAIN_BASE:T_TDC_DESCRIPTOR_BASE
3061 {
3062 virtual int get_id () const
3063 TDC_PURE_BODY(
3064 return 0;
3065 )
3066 T_TDC_HANDLE_BASE* get_element (unsigned index)
3067 {
3068 char *first_element = (char*) this + sizeof *this;
3069 return implement_get_element (index, first_element);
3070 }
3071 };
3072
3073 struct T_TDC_DESCRIPTOR_XSTRUCT_BASE:T_TDC_DESCRIPTOR_BASE
3074 {
3075 int tap_handle;
3076 int get_tap_xstruct_handle (T_TDC_TABLE_KIND table_kind);
3077 T_TDC_DESCRIPTOR_XSTRUCT_BASE ();
3078 ~T_TDC_DESCRIPTOR_XSTRUCT_BASE ();
3079 T_TDC_HANDLE_BASE* get_element (unsigned index);
3080 };
3081
3082 struct T_TDC_DESCRIPTOR_INT_BASE:T_TDC_HANDLE_BASE
3083 {
3084 virtual int get_tap_handle ();
3085 };
3086
3087 //-----
3088
3089 struct T_TDC_DESCRIPTOR_PRIM_BASE:T_TDC_DESCRIPTOR_MAIN_BASE
3090 {
3091 virtual T_TDC_IS_ENUM is ()
3092 {
3093 return T_TDC_IS_ENUM (TDC_IS_COMP | TDC_IS_PRIM);
3094 }
3095 };
3096
3097 struct T_TDC_DESCRIPTOR_PSTRUCT_BASE:T_TDC_DESCRIPTOR_XSTRUCT_BASE
3098 {
3099 virtual T_TDC_IS_ENUM is ()
3100 {
3101 return TDC_IS_STRUCT;
3102 }
3103 virtual int get_tap_handle ();
3104 };
3105
3106 struct T_TDC_DESCRIPTOR_PUNION_BASE:T_TDC_DESCRIPTOR_BASE
3107 {
3108 virtual T_TDC_IS_ENUM is ()
3109 {
3110 return TDC_IS_UNION;
3111 }
3112 };
3113
3114 struct T_TDC_DESCRIPTOR_SDU_BASE:T_TDC_DESCRIPTOR_BASE
3115 {
3116 virtual T_TDC_IS_ENUM is ()
3117 {
3118 return TDC_IS_SDU;
3119 }
3120 virtual int get_tap_handle ()
3121 {
3122 return TDC_DUMMY_TAP_HANDLE;
3123 }
3124 void invoke_tap (T_TDC_EVENT_ENUM event) const;
3125 };
3126
3127 struct T_TDC_DESCRIPTOR_PENUM_BASE:T_TDC_HANDLE_BASE
3128 {
3129 virtual int get_tap_handle ();
3130 virtual T_TDC_IS_ENUM is ()
3131 {
3132 return TDC_IS_PVAR;
3133 }
3134 };
3135
3136 //-----
3137
3138 struct T_TDC_DESCRIPTOR_MSG_BASE:T_TDC_DESCRIPTOR_MAIN_BASE
3139 {
3140 virtual T_TDC_IS_ENUM is ()
3141 {
3142 return T_TDC_IS_ENUM (TDC_IS_COMP | TDC_IS_MSG);
3143 }
3144 };
3145
3146 struct T_TDC_DESCRIPTOR_MSTRUCT_BASE:T_TDC_DESCRIPTOR_XSTRUCT_BASE
3147 {
3148 virtual T_TDC_IS_ENUM is ()
3149 {
3150 return TDC_IS_STRUCT;
3151 }
3152 virtual int get_tap_handle ();
3153 };
3154
3155 struct T_TDC_DESCRIPTOR_MUNION_BASE:T_TDC_DESCRIPTOR_BASE
3156 {
3157 virtual T_TDC_IS_ENUM is ()
3158 {
3159 return TDC_IS_UNION;
3160 }
3161 };
3162
3163 struct T_TDC_DESCRIPTOR_MENUM_BASE:T_TDC_HANDLE_BASE
3164 {
3165 virtual int get_tap_handle ();
3166 virtual T_TDC_IS_ENUM is ()
3167 {
3168 return TDC_IS_MVAR;
3169 }
3170 };
3171
3172 //-----
3173
3174 struct T_TDC_DESCRIPTOR_XXX_PRIMITIVE_UNION_BASE:T_TDC_DESCRIPTOR_BASE
3175 {
3176 };
3177
3178 struct T_TDC_DESCRIPTOR_XXX_MESSAGE_UNION_BASE:T_TDC_DESCRIPTOR_BASE
3179 {
3180 };
3181
3182 struct T_TDC_DESCRIPTOR_PRIMITIVE_UNION_BASE:T_TDC_DESCRIPTOR_BASE
3183 {
3184 };
3185
3186 struct T_TDC_DESCRIPTOR_MESSAGE_UNION_BASE:T_TDC_DESCRIPTOR_BASE
3187 {
3188 //TODO: construct munions (when called from make_element_info, shold be hamless in get_element_info)
3189 };
3190
3191 //\}
3192
3193 //============================================================================
3194
3195 #if TDC_DEBUG_DOT_COMPLETE
3196 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1S
3197 {
3198 int i1S;
3199 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3200 };
3201 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1S()
3202 {
3203 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3204 s.
3205 i;
3206 s->
3207 i0;
3208 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1S s1S;
3209 s1S->
3210 i0;
3211 }
3212 #else
3213 #endif
3214
3215 //----------------------------------------------------------------------------
3216 /// \defgroup T_TDC_INSTANCE T_TDC_INSTANCE
3217 /// base classes to repeat stuff that is similar in many instance classes
3218 //----------------------------------------------------------------------------
3219 ///\{
3220
3221 struct T_TDC_INSTANCE_BASE
3222 {
3223 //private:
3224 T_TDC_HANDLE_BASE* implement_get_handle () const;
3225 void implement_set_handle(T_TDC_HANDLE_BASE* handle);
3226 //protected:
3227 virtual T_TDC_INTERFACE_BASE *new_interface () const;
3228 //public:
3229 T_TDC_INTERFACE_BASE *get_navigation () const;
3230 //protected:
3231 T_TDC_INTERFACE_BASE *get_element_navigation (int index) const;
3232 //public:
3233 T_TDC_INTERFACE_BASE *make_element_navigation (int index, T_TDC_NEW_HANDLE new_element_handle);
3234 T_TDC_HANDLE_BASE* get_descriptor_ref () const;
3235 T_TDC_ASSIGN_ACTION set_action(const T_TDC_ACTION& action_);
3236 void set_value (const T_TDC_INSTANCE_BASE& value_);
3237 void copy_instance (const T_TDC_INSTANCE_BASE * value_);
3238 void copy_interface (const T_TDC_INTERFACE_BASE * value_);
3239 T_TDC_ASSIGN_ACTION construct_from_action(const T_TDC_ACTION& action_, T_TDC_NEW_HANDLE new_handle);
3240 void construct_from_instance (const T_TDC_INSTANCE_BASE& value_, T_TDC_NEW_HANDLE new_handle);
3241 void construct_from_interface (const T_TDC_INTERFACE_BASE * value_, T_TDC_NEW_HANDLE new_handle);
3242 void set_descriptor_value (long value_);
3243 long get_descriptor_value ();
3244 bool cmp_descriptor_value (long value_);
3245 void construct_from_number (long value_, T_TDC_NEW_HANDLE new_handle);
3246 void destroy_handle ();
3247 T_TDC_HANDLE_BASE* construct_handle (T_TDC_NEW_HANDLE new_handle);
3248 T_TDC_HANDLE_BASE* construct_array_handle (T_TDC_NEW_HANDLE new_handle,T_TDC_NEW_HANDLE new_element_handle);
3249 T_TDC_DESCRIPTOR_BASE* construct_descriptor (T_TDC_NEW_HANDLE new_handle);
3250 T_TDC_DESCRIPTOR_BASE* construct_array_descriptor (T_TDC_NEW_HANDLE new_handle,T_TDC_NEW_HANDLE new_element_handle);
3251 T_TDC_INSTANCE_BASE();
3252 ~T_TDC_INSTANCE_BASE();
3253 private:
3254 ///Check for copy constructor missing in class derived from T_TDC_INSTANCE_BASE
3255 T_TDC_INSTANCE_BASE(const T_TDC_INSTANCE_BASE&);
3256 };
3257
3258 struct T_TDC_INSTANCE_MAIN_BASE:T_TDC_INSTANCE_BASE
3259 {
3260 void set_main_value (const T_TDC_INTERFACE_MAIN_BASE* value_);
3261 void set_main_value (const T_TDC_INSTANCE_MAIN_BASE* value_);
3262 void construct_main_value (const T_TDC_INTERFACE_MAIN_BASE* value_, T_TDC_NEW_HANDLE new_handle);
3263 void construct_main_value (const T_TDC_INSTANCE_MAIN_BASE* value_, T_TDC_NEW_HANDLE new_handle);
3264 };
3265
3266 struct T_TDC_INSTANCE_PART_BASE
3267 #if DOT_COMPLETE
3268 #else
3269 TDC_DOT_COMPLETE_HIDE(:T_TDC_INSTANCE_BASE)
3270 #endif
3271 {
3272 };
3273
3274 struct T_TDC_INSTANCE_PRIMITIVE_BASE
3275 #if DOT_COMPLETE
3276 #else
3277 TDC_DOT_COMPLETE_HIDE(:T_TDC_INSTANCE_MAIN_BASE)
3278 #endif
3279 {
3280 #if DOT_COMPLETE
3281 #else
3282 TDC_DOT_COMPLETE_HIDE(void invoke_tap (T_TDC_EVENT_ENUM) const;)
3283 #endif
3284 };
3285
3286 struct T_TDC_INSTANCE_MESSAGE_BASE
3287 #if DOT_COMPLETE
3288 #else
3289 TDC_DOT_COMPLETE_HIDE(:T_TDC_INSTANCE_MAIN_BASE)
3290 #endif
3291 {
3292 };
3293
3294 struct T_TDC_INSTANCE_PRIM_BASE:T_TDC_INSTANCE_PRIMITIVE_BASE
3295 {
3296 };
3297
3298 struct T_TDC_INSTANCE_PSTRUCT_BASE:T_TDC_INSTANCE_PART_BASE
3299 {
3300 };
3301
3302 struct T_TDC_INSTANCE_PUNION_BASE:T_TDC_INSTANCE_PART_BASE
3303 {
3304 };
3305
3306 struct T_TDC_INSTANCE_SDU_BASE:T_TDC_INSTANCE_PART_BASE
3307 {
3308 };
3309
3310 struct T_TDC_INSTANCE_PENUM_BASE:T_TDC_INSTANCE_PART_BASE
3311 {
3312 };
3313
3314 struct T_TDC_INSTANCE_MSG_BASE:T_TDC_INSTANCE_MESSAGE_BASE
3315 {
3316 };
3317
3318 struct T_TDC_INSTANCE_MSTRUCT_BASE:T_TDC_INSTANCE_PART_BASE
3319 {
3320 };
3321
3322 struct T_TDC_INSTANCE_MUNION_BASE:T_TDC_INSTANCE_PART_BASE
3323 {
3324 };
3325
3326 struct T_TDC_INSTANCE_MENUM_BASE:T_TDC_INSTANCE_PART_BASE
3327 {
3328 };
3329
3330 struct T_TDC_INSTANCE_INT_BASE:T_TDC_INSTANCE_PART_BASE
3331 {
3332 };
3333
3334 struct T_TDC_INSTANCE_XXX_PRIMITIVE_UNION_BASE:T_TDC_INSTANCE_PRIMITIVE_BASE
3335 {
3336 };
3337
3338 struct T_TDC_INSTANCE_XXX_MESSAGE_UNION_BASE:T_TDC_INSTANCE_MESSAGE_BASE
3339 {
3340 };
3341
3342 struct T_TDC_INSTANCE_PRIMITIVE_UNION_BASE:T_TDC_INSTANCE_PRIMITIVE_BASE
3343 {
3344 };
3345
3346 struct T_TDC_INSTANCE_MESSAGE_UNION_BASE:T_TDC_INSTANCE_MESSAGE_BASE
3347 {
3348 };
3349
3350 //----------------------------------------------------------------------------
3351
3352 struct T_TDC_INSTANCE_ARRAY_BASE
3353 #if DOT_COMPLETE
3354 #else
3355 TDC_DOT_COMPLETE_HIDE(:T_TDC_INSTANCE_BASE)
3356 #endif
3357 {
3358 #if DOT_COMPLETE_MEMBERS
3359 T_TDC_ASSIGN_ACTION _skip () {} /* you can use '= SKIP' as well */
3360 T_TDC_ASSIGN_ACTION _show () {} /* you can use '= SHOW' as well */
3361 T_TDC_ASSIGN_ACTION _forbid () {} /* you can use '= FORBID' as well */
3362 T_TDC_ASSIGN_ACTION _require () {} /* you can use '= REQUIRE' as well */
3363 #else//DOT_COMPLETE_MEMBERS
3364 T_TDC_ASSIGN_ACTION tdc_skip (); /* you can use '= SKIP' as well */
3365 T_TDC_ASSIGN_ACTION tdc_show (); /* you can use '= SHOW' as well */
3366 T_TDC_ASSIGN_ACTION tdc_forbid (); /* you can use '= FORBID' as well */
3367 T_TDC_ASSIGN_ACTION tdc_require (); /* you can use '= REQUIRE' as well */
3368 /*T_ARRAY operator = (const T_TDC_ACTION& action_)
3369 {
3370 set_action (action_);
3371 return *this;
3372 }*/
3373 #endif//DOT_COMPLETE_MEMBERS
3374 };
3375
3376 #if DOT_COMPLETE
3377 template<class T /*T_INSTANCE*/, int DUMMY> struct T_ARRAY
3378 #else
3379 template<class T /*T_INSTANCE*/> struct T_ARRAY
3380 #endif
3381 :T_TDC_INSTANCE_ARRAY_BASE
3382 {
3383 T::T_INTERFACE& operator [] (int index_)
3384 {
3385 return *(T::T_INTERFACE*)make_element_navigation(index_,T::implement_new_handle);
3386 }
3387 /*
3388 T::T_INTERFACE& operator -> ()
3389 {
3390 return *(T::T_INTERFACE*)get_element_navigation(0);
3391 }
3392 */
3393 #if DOT_COMPLETE
3394 #else
3395 typedef T_TDC_HANDLE_ARRAY<T::T_HANDLE> T_HANDLE;
3396 T_HANDLE* handle;
3397 friend T_TDC_HANDLE_BASE* new_T_HANDLE()\
3398 {
3399 return new T_HANDLE;//(T::implement_new_handle);
3400 }
3401 T_ARRAY operator = (const T_ARRAY& value_)
3402 {
3403 set_value (value_);
3404 return *this;
3405 }
3406 T_ARRAY ()
3407 {
3408 construct_array_handle(new_T_HANDLE,T::implement_new_handle);
3409 }
3410 ~T_ARRAY ()
3411 {
3412 destroy_handle();
3413 }
3414 // T_ARRAY (const T_ARRAY<T>& u1) => ambiguous call to overloaded function
3415 void assign (const T_ARRAY<T>& array, unsigned size, void* address)
3416 {
3417 construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3418 T_TDC_COPY(handle).copy_descriptor_ref (array.handle);
3419 }
3420 template<class U1> void assign (const U1* array, unsigned size, void* address)
3421 {
3422 tdc_check_array_assignment(array, address);
3423 int count = size / sizeof *array;
3424 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3425 for (int i = 0; i < count; i++)
3426 {
3427 T_TDC_COPY element = descriptor->make_element(i);
3428 element.copy_descriptor_ref ((T_TDC_HANDLE_BASE*) array[i].handle);
3429 }
3430 }
3431 void assign (const T_TDC_ACTION& action_, unsigned size, void *address)
3432 {
3433 construct_from_action (action_, new_T_HANDLE);
3434 }
3435 /*T_ARRAY (const T_ARRAY& array) //ambiguous call to overloaded function
3436 {
3437 assign (array, sizeof array, (void*)&array);
3438 }*/
3439 template<class U1> T_ARRAY (const U1& array)
3440 {
3441 assign (array, sizeof array, (void*)&array);
3442 }
3443 template<class U1> T_ARRAY (const U1& u1, T_TDC_ACTION action)
3444 {
3445 const T* array = u1;
3446 int count = sizeof u1 / sizeof *u1;
3447 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3448 descriptor->set_skip_to_end_from_action (action.action);
3449 for (int i = 0; i < count; i++)
3450 {
3451 T_TDC_COPY element = descriptor->make_element(i);
3452 element.copy_descriptor_ref ((T_TDC_HANDLE_BASE*) array[i].handle);
3453 }
3454 }
3455 template<class U1> T_ARRAY (const U1& u1, T_TDC_CREATE_ACTION action)
3456 {
3457 const T* array = u1;
3458 int count = sizeof u1 / sizeof *u1;
3459 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3460 descriptor->set_skip_to_end_from_action (action.action);
3461 for (int i = 0; i < count; i++)
3462 {
3463 T_TDC_COPY element = descriptor->make_element(i);
3464 element.copy_descriptor_ref ((T_TDC_HANDLE_BASE*) array[i].handle);
3465 }
3466 }
3467 template<class U1, class U2> T_ARRAY (const U1& u1, const U2& u2)
3468 {
3469 tdc_tbd_array_assignment_error_T_ARRAY();
3470 }
3471 /*
3472 template<class U1, class U2, class U3> T_ARRAY (U1 u1, U2 u2, U3 u3)
3473 {
3474 TDC_TBD();
3475 }
3476 template<class U1, class U2, class U3, class U4> T_ARRAY (U1 u1, U2 u2, U3 u3, U4 u4)
3477 {
3478 TDC_TBD();
3479 }
3480 template<class U1, class U2, class U3, class U4, class U5> T_ARRAY (U1 u1, U2 u2, U3 u3, U4 u4, U5 u5)
3481 {
3482 TDC_TBD();
3483 }
3484 */
3485 virtual T_TDC_INTERFACE_BASE *new_interface () const
3486 {
3487 return new T::T_INTERFACE;
3488 }
3489 #endif
3490 };
3491
3492
3493 #define M_TDC_BASIC_ARRAY(T_BASIC)\
3494 T_ARRAY ()\
3495 {\
3496 /*construct_handle(new_T_HANDLE);*/\
3497 }\
3498 template<class U1>\
3499 T_ARRAY (const U1& array, T_TDC_ACTION action)\
3500 {\
3501 assign (array, sizeof array, (void*)&array, action);\
3502 }\
3503 template<class U1>\
3504 T_ARRAY (const U1& array)\
3505 {\
3506 assign (array, sizeof array, (void*)&array, TDC_ACTION_UNKNOWN);\
3507 }\
3508 T_ARRAY operator = (const T_ARRAY& value_)\
3509 {\
3510 set_value (value_);\
3511 return *this;\
3512 }\
3513 T_ARRAY operator = (const T_TDC_ACTION& action_)\
3514 {\
3515 construct_from_action (action_,new_T_HANDLE);\
3516 return *this;\
3517 }\
3518
3519 template<class T, class T_BASIC> struct T_TDC_INSTANCE_BASIC_ARRAY:T_TDC_INSTANCE_ARRAY_BASE
3520 {
3521 typedef T_TDC_HANDLE_ARRAY<T::T_HANDLE> T_HANDLE;
3522 T_HANDLE* handle;
3523 static T_TDC_HANDLE_BASE* new_T_HANDLE()\
3524 {
3525 return new T_HANDLE;//(T::implement_new_handle);
3526 }
3527 T_TDC_INSTANCE_BASIC_ARRAY ()
3528 {
3529 construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3530 }
3531 void assign (const T_BASIC* array, unsigned size, void* address, T_TDC_ACTION action)
3532 {
3533 tdc_check_array_assignment(array, address);
3534 unsigned count = size / sizeof T_BASIC;
3535 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3536 descriptor->set_skip_to_end_from_action (action.action);
3537 for (int i = 0; i < count; i++)
3538 {
3539 T_TDC_COPY element= descriptor->make_element(i);
3540 element.copy_number (array[i]);
3541 }
3542 }
3543 void assign (const T_BASIC* array, unsigned size, void* address, T_TDC_CREATE_ACTION action)
3544 {
3545 tdc_check_array_assignment(array, address);
3546 unsigned count = size / sizeof T_BASIC;
3547 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3548 descriptor->set_skip_to_end_from_action (action.action);
3549 for (int i = 0; i < count; i++)
3550 {
3551 T_TDC_COPY element= descriptor->make_element(i);
3552 element.copy_number (array[i]);
3553 }
3554 }
3555 void assign (const T_ARRAY<T>& array, unsigned size, void* address)
3556 {
3557 construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3558 T_TDC_COPY(handle).copy_descriptor_ref (array.handle);
3559 }
3560 template<class U1> void assign (const U1* array, unsigned size, void* address)
3561 {
3562 tdc_check_array_assignment(array, address);
3563 int count = size / sizeof *array;
3564 T_TDC_DESCRIPTOR_BASE* descriptor = construct_array_descriptor(new_T_HANDLE,T::implement_new_handle);
3565 for (int i = 0; i < count; i++)
3566 {
3567 T_TDC_COPY element = descriptor->make_element(i);
3568 element.copy_descriptor_ref ((T_TDC_HANDLE_BASE*) array[i].handle);
3569 }
3570 }
3571 void assign (const T_TDC_ACTION& action_, unsigned size, void *address)
3572 {
3573 construct_from_action (action_, new_T_HANDLE);
3574 }
3575 void assign (const T_ARRAY<T_BASIC>& array, unsigned size, void* address, T_TDC_ACTION action)
3576 {
3577 construct_from_instance(array,new_T_HANDLE);
3578 }
3579 T::T_INTERFACE& operator [] (int index_)
3580 {
3581 return *(T::T_INTERFACE*)get_element_navigation(index_);
3582 }
3583 virtual T_TDC_INTERFACE_BASE *new_interface () const
3584 {
3585 return new T::T_INTERFACE;
3586 }
3587 };
3588
3589 //\}
3590
3591 //============================================================================
3592
3593 #if TDC_DEBUG_DOT_COMPLETE
3594 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W
3595 {
3596 int i1W;
3597 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3598 };
3599 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W()
3600 {
3601 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3602 s.
3603 i;
3604 s->
3605 i0;
3606 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W s1W;
3607 s1W->
3608 i0;
3609 }
3610 #else
3611 #endif
3612
3613 //============================================================================
3614 /// \defgroup BuildInTypes build in types
3615 //============================================================================
3616 //\{
3617
3618 //#pragma M_TDC_MESSAGE (M_TDC_STRING(M_TDC_FORWARD_INT (U8)))
3619 M_TDC_FORWARD_INT (U8)
3620 M_TDC_FORWARD_INT (S8)
3621 M_TDC_FORWARD_INT (U16)
3622 M_TDC_FORWARD_INT (S16)
3623 M_TDC_FORWARD_INT (U32)
3624 M_TDC_FORWARD_INT (S32)
3625
3626 M_TDC_FORWARD_PSTRUCT (raw)
3627 M_TDC_FORWARD_PSTRUCT (aim)
3628 M_TDC_FORWARD_COMP (MESSAGE_UNION,TDC_IS_MESSAGE_UNION)
3629
3630 //M_TDC_FORWARD_MSTRUCT(COMP_STENCIL)
3631 M_TDC_FORWARD_BASE(COMP_STENCIL, T_TDC_HANDLE_COMP_STENCIL)
3632 M_TDC_HANDLE(M_TDC_IN_CLASS,M_TDC_WITHOUT_BODY,COMP_STENCIL,TDC_IS_COMP)
3633
3634 #ifndef TDC_DOT_COMPLETE_HIDE_PROTOTYPES
3635 struct T_PRIMITIVE_UNION;
3636 struct T_TDC_INTERFACE_PRIMITIVE_UNION;
3637 struct T_TDC_DESCRIPTOR_PRIMITIVE_UNION;
3638 struct T_TDC_HANDLE_PRIMITIVE_UNION;
3639 T_TDC_HANDLE_BASE* new_T_TDC_HANDLE_PRIMITIVE_UNION();
3640
3641 struct T_MESSAGE_UNION;
3642 struct T_TDC_INTERFACE_MESSAGE_UNION;
3643 struct T_TDC_DESCRIPTOR_MESSAGE_UNION;
3644 struct T_TDC_HANDLE_MESSAGE_UNION;
3645 T_TDC_HANDLE_BASE* new_T_TDC_HANDLE_MESSAGE_UNION();
3646 #endif
3647
3648 struct T_TDC_DESCRIPTOR_S8:T_TDC_DESCRIPTOR_INT_BASE
3649 {
3650 M_TDC_DESCRIPTOR_INT_ADDITIONAL (S8)
3651 };
3652
3653 struct T_TDC_DESCRIPTOR_U8:T_TDC_DESCRIPTOR_INT_BASE
3654 {
3655 M_TDC_DESCRIPTOR_INT_ADDITIONAL (U8)
3656 };
3657
3658 struct T_TDC_DESCRIPTOR_S16:T_TDC_DESCRIPTOR_INT_BASE
3659 {
3660 M_TDC_DESCRIPTOR_INT_ADDITIONAL (S16)
3661 };
3662
3663 struct T_TDC_DESCRIPTOR_U16:T_TDC_DESCRIPTOR_INT_BASE
3664 {
3665 M_TDC_DESCRIPTOR_INT_ADDITIONAL (U16)
3666 };
3667
3668 struct T_TDC_DESCRIPTOR_S32:T_TDC_DESCRIPTOR_INT_BASE
3669 {
3670 M_TDC_DESCRIPTOR_INT_ADDITIONAL (S32)
3671 };
3672
3673 struct T_TDC_DESCRIPTOR_U32:T_TDC_DESCRIPTOR_INT_BASE
3674 {
3675 M_TDC_DESCRIPTOR_INT_ADDITIONAL (U32)
3676 };
3677
3678 struct T_TDC_DESCRIPTOR_raw:T_TDC_DESCRIPTOR_PSTRUCT_BASE
3679 {
3680 M_TDC_DESCRIPTOR_PSTRUCT_ADDITIONAL (raw)
3681 T_TDC_HANDLE_U16 l_buf;
3682 T_TDC_HANDLE_U16 o_buf;
3683 T_TDC_HANDLE_ARRAY<T_TDC_DESCRIPTOR_U8> buf;
3684 virtual int get_tap_handle ();
3685 };
3686
3687 struct T_TDC_DESCRIPTOR_COMP_STENCIL:T_TDC_DESCRIPTOR_MSTRUCT_BASE
3688 {
3689 M_TDC_DESCRIPTOR_MSTRUCT_ADDITIONAL (COMP_STENCIL)
3690 };
3691
3692 struct T_TDC_DESCRIPTOR_VAR_STENCIL:T_TDC_DESCRIPTOR_MENUM_BASE
3693 {
3694 typedef long T_TDC_ENUM_VAR_STENCIL;
3695 M_TDC_DESCRIPTOR_MENUM_ADDITIONAL (VAR_STENCIL)
3696 };
3697
3698 #if TDC_DEBUG_DOT_COMPLETE
3699 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W1
3700 {
3701 int i1W1;
3702 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3703 };
3704 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W1()
3705 {
3706 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3707 s.
3708 i;
3709 s->
3710 i0;
3711 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W1 s1W1;
3712 s1W1->
3713 i0;
3714 }
3715 #else
3716 #endif
3717
3718
3719 typedef T_TDC_DESCRIPTOR_ARRAY<T_TDC_HANDLE_COMP_STENCIL> T_TDC_DESCRIPTOR_ARRAY_STENCIL;
3720 typedef T_TDC_DESCRIPTOR_POINTER<T_TDC_HANDLE_COMP_STENCIL> T_TDC_DESCRIPTOR_POINTER_STENCIL;
3721 typedef T_TDC_HANDLE_POINTER<T_TDC_HANDLE_COMP_STENCIL> T_TDC_HANDLE_POINTER_STENCIL;
3722
3723
3724 #if TDC_DEBUG_DOT_COMPLETE
3725 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W4
3726 {
3727 int i1W4;
3728 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3729 };
3730 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W4()
3731 {
3732 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3733 s.
3734 i;
3735 s->
3736 i0;
3737 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W4 s1W4;
3738 s1W4->
3739 i0;
3740 }
3741 #else
3742 #endif
3743
3744 #if !defined TDC_DESCRIPTOR || defined TDC_PRECOMPILE
3745
3746 #if TDC_DEBUG_DOT_COMPLETE
3747 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W5
3748 {
3749 int i1W5;
3750 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3751 };
3752 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W5()
3753 {
3754 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3755 s.
3756 i;
3757 s->
3758 i0;
3759 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W5 s1W5;
3760 s1W5->
3761 i0;
3762 }
3763 #else
3764 #endif
3765
3766 struct T_U8:T_TDC_INSTANCE_INT_BASE
3767 {
3768 //enable pragma line to see expanded version of macro in list file
3769 //#pragma M_TDC_MESSAGE (M_TDC_STRING(M_TDC_INSTANCE_INT_ADDITIONAL (U8)))
3770 M_TDC_INSTANCE_INT_ADDITIONAL (U8)
3771 T_TDC_INTERFACE_U8* operator-> ();
3772 };
3773 struct T_TDC_INTERFACE_U8:T_TDC_INTERFACE_INT_BASE
3774 {
3775 //enable pragma line to see expanded version of macro in list file
3776 //#pragma M_TDC_MESSAGE (M_TDC_STRING(M_TDC_INTERFACE_INT_ADDITIONAL (U8)))
3777 M_TDC_INTERFACE_INT_ADDITIONAL (U8)
3778 #ifdef TDC_TYPE_NAME_COMPLETE
3779 struct T_TDC_TYPE_NAME { char T_U8, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3780 #endif
3781 };
3782
3783 #if TDC_DEBUG_DOT_COMPLETE
3784 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W6
3785 {
3786 int i1W6;
3787 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3788 };
3789 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W6()
3790 {
3791 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3792 s.
3793 i;
3794 s->
3795 i0;
3796 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W6 s1W6;
3797 s1W6->
3798 i0;
3799 }
3800 #else
3801 #endif
3802
3803 struct T_S8:T_TDC_INSTANCE_INT_BASE
3804 {
3805 M_TDC_INSTANCE_INT_ADDITIONAL (S8)
3806 T_TDC_INTERFACE_S8* operator-> ();
3807 };
3808 struct T_TDC_INTERFACE_S8:T_TDC_INTERFACE_INT_BASE
3809 {
3810 M_TDC_INTERFACE_INT_ADDITIONAL (S8)
3811 #ifdef TDC_TYPE_NAME_COMPLETE
3812 struct T_TDC_TYPE_NAME { char T_S8, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3813 #endif
3814 };
3815
3816 struct T_U16:T_TDC_INSTANCE_INT_BASE
3817 {
3818 M_TDC_INSTANCE_INT_ADDITIONAL (U16)
3819 T_TDC_INTERFACE_U16* operator-> ();
3820 };
3821 struct T_TDC_INTERFACE_U16:T_TDC_INTERFACE_INT_BASE
3822 {
3823 M_TDC_INTERFACE_INT_ADDITIONAL (U16)
3824 #ifdef TDC_TYPE_NAME_COMPLETE
3825 struct T_TDC_TYPE_NAME { char T_U16, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3826 #endif
3827 };
3828
3829 struct T_S16:T_TDC_INSTANCE_INT_BASE
3830 {
3831 M_TDC_INSTANCE_INT_ADDITIONAL (S16)
3832 T_TDC_INTERFACE_S16* operator-> ();
3833 };
3834 struct T_TDC_INTERFACE_S16:T_TDC_INTERFACE_INT_BASE
3835 {
3836 M_TDC_INTERFACE_INT_ADDITIONAL (S16)
3837 #ifdef TDC_TYPE_NAME_COMPLETE
3838 struct T_TDC_TYPE_NAME { char T_S16, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3839 #endif
3840 };
3841
3842 struct T_U32:T_TDC_INSTANCE_INT_BASE
3843 {
3844 M_TDC_INSTANCE_INT_ADDITIONAL (U32)
3845 T_TDC_INTERFACE_U32* operator-> ();
3846 };
3847 struct T_TDC_INTERFACE_U32:T_TDC_INTERFACE_INT_BASE
3848 {
3849 M_TDC_INTERFACE_INT_ADDITIONAL (U32)
3850 #ifdef TDC_TYPE_NAME_COMPLETE
3851 struct T_TDC_TYPE_NAME { char T_U32, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3852 #endif
3853 };
3854
3855 struct T_S32:T_TDC_INSTANCE_INT_BASE
3856 {
3857 M_TDC_INSTANCE_INT_ADDITIONAL (S32)
3858 T_TDC_INTERFACE_S32* operator-> ();
3859 };
3860 struct T_TDC_INTERFACE_S32:T_TDC_INTERFACE_INT_BASE
3861 {
3862 M_TDC_INTERFACE_INT_ADDITIONAL (S32)
3863 #ifdef TDC_TYPE_NAME_COMPLETE
3864 struct T_TDC_TYPE_NAME { char T_S32, ___dummy__basic_type_have_no_members; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3865 #endif
3866 };
3867
3868 struct T_raw:T_TDC_INSTANCE_PSTRUCT_BASE
3869 {
3870 M_TDC_INSTANCE_PSTRUCT_ADDITIONAL (raw,raw)
3871 T_TDC_INTERFACE_raw* operator-> ();
3872 };
3873 struct T_TDC_INTERFACE_raw:T_TDC_INTERFACE_PSTRUCT_BASE
3874 {
3875 M_TDC_INTERFACE_PSTRUCT_ADDITIONAL (raw,raw)
3876 T_TDC_INTERFACE_U16 l_buf; //number of valid bits
3877 T_TDC_INTERFACE_U16 o_buf; //offset of first valid bit
3878 T_TDC_INTERFACE_ARRAY<T_TDC_INTERFACE_U8> buf; //array size = (o_buf + l_buf + 7) /8
3879 #ifdef TDC_TYPE_NAME_COMPLETE
3880 struct T_TDC_TYPE_NAME { char T_raw, ___l_buf___o_buf___buf; } _type_name () M_TDC_TYPE_NAME_COMPLETE //HINT: ??? press CTRL + SHIFT + Q to create a reference to this variable
3881 #endif
3882 };
3883
3884 #if TDC_DEBUG_DOT_COMPLETE
3885 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9
3886 {
3887 int i1W9;
3888 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3889 };
3890 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9()
3891 {
3892 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3893 s.
3894 i;
3895 s->
3896 i0;
3897 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9 s1W9;
3898 s1W9->
3899 i0;
3900 }
3901 #else
3902 #endif
3903
3904 struct T_COMP_STENCIL:T_TDC_INSTANCE_MSTRUCT_BASE
3905 {
3906 /*void copy_instance (const T_TDC_INSTANCE_BASE * value_)
3907 {
3908 TDC_INTERNAL_ERROR();
3909 }*/
3910 M_TDC_INSTANCE_MSTRUCT_ADDITIONAL (COMP_STENCIL,COMP_STENCIL)
3911 };
3912 struct T_TDC_INTERFACE_COMP_STENCIL:T_TDC_INTERFACE_MSTRUCT_BASE
3913 {
3914 M_TDC_INTERFACE_MSTRUCT_ADDITIONAL (COMP_STENCIL,COMP_STENCIL)
3915 };
3916
3917 #if TDC_DEBUG_DOT_COMPLETE
3918 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9A9
3919 {
3920 int i1W9A9;
3921 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3922 };
3923 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9A9()
3924 {
3925 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3926 s.
3927 i;
3928 s->
3929 i0;
3930 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9A9 s1W9A9;
3931 s1W9A9->
3932 i0;
3933 }
3934 #else
3935 #endif
3936
3937 #ifndef TDC_DOT_COMPLETE_SOURCE_INSIGHT
3938 /**
3939 allocation call tree:
3940 function defined in
3941 T_PRIMITIVE_UNION() tdc_base.h
3942 T_PRIMITIVE_UNION
3943 M_TDC_INSTANCE_ADDITIONAL_BASE
3944 construct_handle(new_T_TDC_HANDLE_PRIMITIVE_UNION) tdc.cpp
3945 T_TDC_INSTANCE_BASE
3946 new_T_TDC_HANDLE_PRIMITIVE_UNION ??? global
3947 ???
3948 implement_new_handle () tdc_lib_main_dsc.cpp virtual in T_TDC_HANDLE_PRIMITIVE_UNION
3949 M_TDC_POST_COMP
3950 M_TDC_POST_DESCRIPTOR_COMP
3951 M_TDC_HANDLE_ADDITIONAL
3952 new T_TDC_HANDLE_PRIMITIVE_UNION() not explicit declared
3953 T_TDC_HANDLE_BASE () tdc_dsc.cpp
3954 implement_set_action(TDC_ACTION_DEFAULT) tdc_dsc.cpp
3955
3956 T_PRIMITIVE_UNION
3957
3958 make_descriptor() tdc.cpp
3959 implement_new_descriptor () tdc.cpp
3960 new T_TDC_DESCRIPTOR_PRIMITIVE_UNION tdc_lib_main_dsc.cpp
3961 M_TDC_POST_COMP
3962 M_TDC_POST_DESCRIPTOR_COMP
3963
3964
3965 */
3966 #if TDC_DEBUG_DOT_COMPLETE
3967 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9B
3968 {
3969 int i1W9B;
3970 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
3971 };
3972 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9B()
3973 {
3974 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
3975 s.
3976 i;
3977 s->
3978 i0;
3979 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9B s1W9B;
3980 s1W9B->
3981 i0;
3982 }
3983 #else
3984 #endif
3985
3986 struct T_PRIMITIVE_UNION
3987 TDC_DOT_COMPLETE_HIDE(:T_TDC_INSTANCE_PRIMITIVE_UNION_BASE)
3988 {
3989 TDC_DOT_COMPLETE_HIDE(M_TDC_INSTANCE_PRIMITIVE_ADDITIONAL ())
3990 T_TDC_INTERFACE_PRIMITIVE_UNION* operator-> ();
3991 };
3992
3993 struct T_MESSAGE_UNION:T_TDC_INSTANCE_MESSAGE_UNION_BASE
3994 {
3995 TDC_DOT_COMPLETE_HIDE(M_TDC_INSTANCE_MESSAGE_ADDITIONAL ())
3996 T_TDC_INTERFACE_MESSAGE_UNION* operator-> ();
3997 };
3998
3999 #if TDC_DEBUG_DOT_COMPLETE
4000 struct T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9B
4001 {
4002 int i1W9B;
4003 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 operator->(){return 0;}
4004 };
4005 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1W9B()
4006 {
4007 T_PRIMITIVE_UNION primitive_union;
4008 primitive_union-> XX_TDC_1;
4009 }
4010 #else
4011 #endif
4012
4013 #else
4014 typedef T_TDC_INTERFACE_PRIMITIVE_UNION* T_PRIMITIVE_UNION;
4015 typedef T_TDC_INTERFACE_MESSAGE_UNION* T_MESSAGE_UNION;
4016 #endif
4017
4018 //----------------------------------------------------------------------------
4019
4020 //#if TDC_DOT_COMPLETE
4021 //#else
4022 template<> struct T_ARRAY<U8>:T_TDC_INSTANCE_BASIC_ARRAY<T_U8, U8>
4023 {
4024 M_TDC_BASIC_ARRAY(U8)
4025 };
4026
4027 template<> struct T_ARRAY<S8>:T_TDC_INSTANCE_BASIC_ARRAY<T_S8, S8>
4028 {
4029 M_TDC_BASIC_ARRAY(S8)
4030 };
4031
4032 template<> struct T_ARRAY<U16>:T_TDC_INSTANCE_BASIC_ARRAY<T_U16, U16>
4033 {
4034 M_TDC_BASIC_ARRAY(U16)
4035 };
4036
4037 template<> struct T_ARRAY<S16>:T_TDC_INSTANCE_BASIC_ARRAY<T_S16, S16>
4038 {
4039 M_TDC_BASIC_ARRAY(S16)
4040 };
4041
4042 template<> struct T_ARRAY<U32>:T_TDC_INSTANCE_BASIC_ARRAY<T_U32, U32>
4043 {
4044 M_TDC_BASIC_ARRAY(U32)
4045 };
4046
4047 template<> struct T_ARRAY<S32>:T_TDC_INSTANCE_BASIC_ARRAY<T_S32, S32>
4048 {
4049 M_TDC_BASIC_ARRAY(S32)
4050 };
4051 //#endif
4052
4053 #endif //!defined TDC_DESCRIPTOR || defined TDC_PRECOMPILE
4054
4055 //\}
4056
4057 //============================================================================
4058 // types used by dynamic part
4059 //============================================================================
4060
4061 struct T_TDC_AWAIT_CONTEXT;
4062 struct T_TDC_SEND_CONTEXT;
4063 struct T_TDC_AWAIT;
4064
4065 #ifdef DOT_COMPLETE
4066 struct T_ON{};
4067 #endif
4068
4069 //============================================================================
4070
4071 enum T_TDC_JMPRET
4072 {
4073 TDC_JMPRET_SETJMP = 0, //setjmp is hard coded to return 0
4074 TDC_JMPRET_INITIAL = 1,
4075 TDC_JMPRET_FAIL = 2,
4076 TDC_JMPRET_PASS = 3,
4077 TDC_JMPRET_BAD_BREAK = 4,
4078 TDC_JMPRET_CASE_PASS = 5,
4079 TDC_JMPRET_STEP_PASS = 6,
4080 TDC_JMPRET_ON_PASS = 7,
4081 TDC_JMPRET_ON_TEST = 8,
4082 TDC_JMPRET_ALT_ENTER = 9,
4083 TDC_JMPRET_OTHERWISE_PASS = 10,
4084 TDC_JMPRET_OTHERWISE_PARK = 11,
4085 TDC_JMPRET_TRAP_PASS = 12,
4086 TDC_JMPRET_POPED = 13,
4087 TDC_JMPRET_USER_ERROR = 14,
4088 TDC_JMPRET_INTERNAL_ERROR = 15,
4089 TDC_JMPRET_TAP_EXCLUDED = 16
4090 };
4091
4092 enum T_TDC_CONTEXT
4093 {
4094 TDC_CONTEXT_UNKNOWN,
4095 TDC_CONTEXT_FUNCTION,
4096 TDC_CONTEXT_CASE,
4097 TDC_CONTEXT_STEP,
4098 TDC_CONTEXT_ALT,
4099 TDC_CONTEXT_ON,
4100 TDC_CONTEXT_OTHERWISE,
4101 TDC_CONTEXT_TRAP
4102 };
4103
4104 struct T_TDC_DYNAMIC_CONTEXT_DATA
4105 {
4106 T_TDC_DYNAMIC_CONTEXT_DATA* parent;
4107 jmp_buf mark;
4108 T_TDC_DYNAMIC_CONTEXT_DATA* prev;
4109 T_TDC_JMPRET jmpret;
4110 char* file;
4111 int line;
4112 int event;
4113 bool testing;
4114 char *text;
4115 int destroy_on_fail_handles_count;
4116 T_TDC_CONTEXT context;
4117 T_TDC_HANDLE_BASE** destroy_on_fail_handles;
4118 void add_destroy_on_fail (T_TDC_HANDLE_BASE* handle);
4119 void remove_destroy_on_fail (T_TDC_HANDLE_BASE* handle);
4120 T_TDC_DYNAMIC_CONTEXT_DATA* pop ();
4121 T_TDC_DYNAMIC_CONTEXT_DATA (T_TDC_CONTEXT
4122 context_, T_TDC_DYNAMIC_CONTEXT_DATA* parent_, char* file_, int line_, char* text_);
4123 ~T_TDC_DYNAMIC_CONTEXT_DATA();
4124 void jmp(T_TDC_JMPRET jmpret_);
4125 };
4126
4127 struct T_TDC_CONTEXT_BASE
4128 {
4129 };
4130
4131 struct T_TDC_FUNCTION_CONTEXT:T_TDC_CONTEXT_BASE //the name of this type is contructed to give more info from error message
4132 {
4133 /*
4134 Got this error?
4135 error C2039: 'tdc_alt_context' : is not a member of 'T_TDC_FUNCTION_CONTEXT'
4136 you are violating the following rules:
4137
4138 "ON(...)...;" and "OTHERWISE()...;" must be inside an "ALT{...}"
4139
4140 TODO: test above statement
4141 */
4142 T_TDC_DYNAMIC_CONTEXT_DATA tdc_function_context; //this member name is contructed to give more info from error message
4143 T_TDC_FUNCTION_CONTEXT (char* file_, int line_);
4144 };
4145
4146 struct T_TDC_USER_ERROR_CASE_BASE
4147 {
4148 // for testing TDC only
4149 unsigned int failed;
4150 };
4151
4152 struct T_TDC_CASE
4153 {
4154 /** \struct T_TDC_CASE
4155 this type can not have constructor or member functions as it virolate 'extern "C"' in T_CASE macro
4156
4157 this type should only contain one member so that if returned from a function with '__declspec(dllexport)'
4158 it will be returned in the same way as if such a function returned int, returning an int is what tap2.exe
4159 expect
4160
4161 from an internal tdc point of view there is no difference between a function of type T_CASE and one of
4162 type T_TDC_CASE, this is used in some tdc_test test cases
4163
4164 founctions of type T_CASE (T_TDC_CASE) should not have explicit returns instead they should contain
4165 a BEGIN_CASE(...) which will make an implicit return (return is hidden inside macro);
4166 */
4167 unsigned int passed;
4168 };
4169
4170 struct T_TDC_CASE_CONTEXT:T_TDC_CONTEXT_BASE
4171 {
4172 T_TDC_DYNAMIC_CONTEXT_DATA tdc_not_alt_context;
4173 T_TDC_CASE_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA* parent_, char* file_, int line_, char* text_);
4174 void tdc_end_for ();
4175 bool tdc_do_return ();
4176 void prepare_exit (int exit_code, char *message);
4177 T_TDC_CASE tdc_return_value ();
4178 T_TDC_USER_ERROR_CASE_BASE tdc_user_error_return_value ();
4179 };
4180
4181 struct T_TDC_only_one__BEGIN_CASE__allowed_per_function:T_TDC_CONTEXT_BASE
4182 {
4183 /* TODO: wrong text type name should say it all
4184 Got this error?
4185 error C2039: 'tdc_alt_context' : is not a member of 'T_TDC__OTHERWISE__MUST_BE_LAST_IN_ALT'
4186
4187 you are violating one of the following rules:
4188 A)
4189 "ON(...)...;" cannot follow "OTHERWISE()...;"
4190
4191 B)
4192 "AWAIT(...)" is not allow in side "ALT{...}" enclose it with an "ON(...)"
4193 e.g. ALT{... ON(AWAIT(...))...; ...}
4194 C)
4195 "FAIL()", "PASS()", "SEND(...)" are not allowed inside "ALT{...}" they must be
4196 inside the body of an "ON(AWAIT(something))...;" or "OTHERWISE()...;"
4197
4198 remember to use curly parantheses "{...}" when the body contain more than one command
4199 */
4200 T_TDC_DYNAMIC_CONTEXT_DATA* parent;
4201 T_TDC_only_one__BEGIN_CASE__allowed_per_function (T_TDC_DYNAMIC_CONTEXT_DATA& parent_);
4202 };
4203
4204 /// return of a step
4205 struct T_STEP
4206 {
4207 T_STEP ()
4208 {
4209 //nothing
4210 }
4211 };
4212
4213 struct T_TDC_STEP_CONTEXT:T_TDC_CONTEXT_BASE
4214 {
4215 T_TDC_DYNAMIC_CONTEXT_DATA tdc_not_alt_context;
4216 T_TDC_STEP_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA* parent_, char* file_, int line_, char* text_);
4217 void tdc_end_for ();
4218 bool tdc_do_return ();
4219 T_STEP tdc_return_value ();
4220 };
4221
4222 struct T_TDC_only_one__BEGIN_STEP__allowed_per_function:T_TDC_CONTEXT_BASE
4223 {
4224 /* TODO: wrong text type name should say it all
4225 Got this error?
4226 error C2039: 'tdc_alt_context' : is not a member of 'T_TDC_only_one__BEGIN_STEP__allowed_per_function'
4227
4228 you are violating one of the following rules:
4229 A)
4230 "ON(...)...;" cannot follow "OTHERWISE()...;"
4231
4232 B)
4233 "AWAIT(...)" is not allow in side "ALT{...}" enclose it with an "ON(...)"
4234 e.g. ALT{... ON(AWAIT(...))...; ...}
4235 C)
4236 "FAIL()", "PASS()", "SEND(...)" are not allowed inside "ALT{...}" they must be
4237 inside the body of an "ON(AWAIT(something))...;" or "OTHERWISE()...;"
4238
4239 remember to use curly parantheses "{...}" when the body contain more than one command
4240 */
4241 T_TDC_DYNAMIC_CONTEXT_DATA* parent;
4242 T_TDC_only_one__BEGIN_STEP__allowed_per_function (T_TDC_DYNAMIC_CONTEXT_DATA& parent_);
4243 };
4244
4245 struct T_TDC_ALT_CONTEXT:T_TDC_CONTEXT_BASE
4246 {
4247 /*
4248 Got this error?
4249 error C2039: 'tdc_not_alt_context' : is not a member of 'T_TDC_ALT_CONTEXT'
4250
4251 you are violating one of the following rules:
4252 A)
4253 "AWAIT(...)" is not allow in side "ALT{...}" enclose it with an "ON(...)"
4254 e.g. ALT{... ON(AWAIT(...))...; ...}
4255 B)
4256 "FAIL()", "PASS()", "SEND(...)", "ALT{...}" are not allowed inside "ALT{...}" they must be
4257 inside the body of an "ON(AWAIT(something))...;" or "OTHERWISE()...;"
4258
4259 remember to use curly parantheses "{...}" when the body contain more than one command
4260 */
4261 T_TDC_DYNAMIC_CONTEXT_DATA tdc_alt_context;
4262 T_TDC_ALT_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent_, char* file_, int line_);
4263 void tdc_end_for();
4264 bool tdc_enter_for();
4265 };
4266
4267 struct T_TDC_ON_CONTEXT:T_TDC_CONTEXT_BASE
4268 {
4269 T_TDC_DYNAMIC_CONTEXT_DATA tdc_not_alt_context;
4270 T_TDC_ON_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent_, char* file_, int line_, char* text_);
4271 void tdc_end_for ();
4272 bool tdc_enter_for();
4273 bool tdc_on_expects_await(T_TDC_AWAIT& await_);
4274 };
4275
4276 struct T_TDC__OTHERWISE__MUST_BE_LAST_IN_ALT:T_TDC_CONTEXT_BASE
4277 {
4278 /*
4279 Got this error?
4280 error C2039: 'tdc_alt_context' : is not a member of 'T_TDC__OTHERWISE__MUST_BE_LAST_IN_ALT'
4281
4282 you are violating one of the following rules:
4283 A)
4284 "ON(...)...;" cannot follow "OTHERWISE()...;"
4285
4286 B)
4287 "AWAIT(...)" is not allow in side "ALT{...}" enclose it with an "ON(...)"
4288 e.g. ALT{... ON(AWAIT(...))...; ...}
4289 C)
4290 "FAIL()", "PASS()", "SEND(...)" are not allowed inside "ALT{...}" they must be
4291 inside the body of an "ON(AWAIT(something))...;" or "OTHERWISE()...;"
4292
4293 remember to use curly parantheses "{...}" when the body contain more than one command
4294 */
4295 T_TDC_DYNAMIC_CONTEXT_DATA* parent;
4296 T_TDC__OTHERWISE__MUST_BE_LAST_IN_ALT (T_TDC_DYNAMIC_CONTEXT_DATA& parent_);
4297 };
4298
4299 struct T_TDC_OTHERWISE_CONTEXT:T_TDC_CONTEXT_BASE
4300 {
4301 T_TDC_DYNAMIC_CONTEXT_DATA tdc_not_alt_context;
4302 T_TDC_OTHERWISE_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA* parent_, char* file_, int line_);
4303 void tdc_end_for ();
4304 bool tdc_enter_for ();
4305 };
4306
4307 struct T_TDC_TRAP_CONTEXT:T_TDC_CONTEXT_BASE
4308 {
4309 T_TDC_DYNAMIC_CONTEXT_DATA tdc_not_alt_context;
4310 T_TDC_TRAP_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent_, char* file_, int line_);
4311 void tdc_end_for ();
4312 bool tdc_trap_testing ();
4313 bool tdc_initial ();
4314 bool tdc_enter_for ();
4315 };
4316
4317 struct T_TDC_EVENT_CONTEXT:T_TDC_CONTEXT_BASE
4318 {
4319 T_TDC_EVENT_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* text_, char* primitive_);
4320 T_TDC_EVENT_CONTEXT ();
4321 };
4322
4323 //============================================================================
4324
4325 #ifdef TDC_PORT
4326 struct T_PORT
4327 {
4328 T_PORT operator +(T_PORT& port); // be aware: ("x->y","z") + ("a->b","c") != ("x;a->y;b","z;c")
4329 #if DOT_COMPLETE
4330 T_ON AWAIT (T_PRIMITIVE_UNION primitive){}
4331 void SEND (T_PRIMITIVE_UNION primitive){}
4332 #else//DOT_COMPLETE
4333 char* src_list;
4334 char* dst_list;
4335 char* sap_list;
4336 bool is_send_port; // -> or <-> was specified
4337 bool is_await_port;// <- or <-> was specified
4338 T_PORT* next; // used when 2 or more ports have been linked together with operator +
4339 void construct(char* src_and_dst_list, char* sap_list_);
4340 T_PORT (char* src_and_dst_list, char* sap_list_);
4341 T_PORT (char* src_and_dst_list);
4342 T_PORT (T_PORT& port,T_PORT* port2=0);
4343 ~T_PORT ();
4344 T_TDC_AWAIT_CONTEXT tdc_await_context(T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4345 T_TDC_SEND_CONTEXT tdc_send_context(T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4346 #endif//DOT_COMPLETE
4347 };
4348
4349 extern T_PORT DEFAULT_PORT;
4350 #endif
4351
4352 //============================================================================
4353 /// \defgroup AWAIT
4354 //\{
4355
4356 /// Special values that can be awaited for the sake of testing TDC
4357 enum T_TDC_AWAIT_TESTING {
4358 TDC_AWAIT_FAIL, /// Hardcode AWAIT to fail
4359 TDC_AWAIT_PASS, /// Hardcode AWAIT to pass
4360 TDC_AWAIT_FORCE_PASS,
4361 };
4362
4363 #if DOT_COMPLETE
4364 int TDC_AWAIT_FAIL;
4365 int TDC_AWAIT_PASS;
4366 int TDC_AWAIT_FORCE_PASS;
4367 #endif
4368
4369 ///What an AWAIT returns
4370 struct T_TDC_AWAIT
4371 {
4372 T_TDC_AWAIT();
4373 private:
4374 template<class T> T_TDC_AWAIT operator, (T)
4375 {
4376 tdc_user_error ("AWAIT can not be part of a comma expression"); // should be courth compiletime as this function is private
4377 return T_TDC_AWAIT ();
4378 }
4379 };
4380
4381 struct T_TDC_AWAIT_CONTEXT:T_TDC_EVENT_CONTEXT
4382 {
4383 friend T_TDC_AWAIT_CONTEXT tdc_await_context (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4384 #ifdef TDC_PORT
4385 T_TDC_AWAIT_CONTEXT (T_PORT* port_, T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4386 #else
4387 T_TDC_AWAIT_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4388 #endif
4389 ~T_TDC_AWAIT_CONTEXT ();
4390 T_TDC_AWAIT tdc_implement_await (T_TDC_AWAIT_TESTING pass_or_fail);
4391 T_TDC_AWAIT tdc_implement_await (const T_TDC_INSTANCE_PRIMITIVE_BASE& primitive);
4392 template<class T> T_TDC_AWAIT tdc_implement_await (T (*f) ())
4393 {
4394 T primitive = f ();
4395 return tdc_implement_await (primitive);
4396 }
4397 template<class T> T_TDC_AWAIT tdc_implement_await (void (*f) (T))
4398 {
4399 T primitive;
4400 f (primitive);
4401 return tdc_implement_await (primitive);
4402 }
4403 };
4404
4405 //\}
4406
4407 //----------------------------------------------------------------------------
4408 /// \defgroup SEND
4409 //\{
4410
4411 struct T_TDC_SEND_CONTEXT
4412 :T_TDC_EVENT_CONTEXT
4413 {
4414 friend T_TDC_SEND_CONTEXT tdc_send_context (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4415 #ifdef TDC_PORT
4416 T_TDC_SEND_CONTEXT (T_PORT* port_, T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4417 #else
4418 T_TDC_SEND_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_, char* primitive_);
4419 #endif
4420 ~T_TDC_SEND_CONTEXT ();
4421 void tdc_implement_send (T_TDC_AWAIT_TESTING pass_or_fail);
4422 void tdc_implement_send (const T_TDC_INSTANCE_PRIMITIVE_BASE& primitive);
4423 template<class T>void tdc_implement_send (T (*f) ())
4424 {
4425 T primitive = f ();
4426 return tdc_implement_send (primitive);
4427 }
4428 template<class T>void tdc_implement_send (void (*f) (T))
4429 {
4430 T primitive;
4431 f (primitive);
4432 return tdc_implement_send (primitive);
4433 }
4434 };
4435
4436 //\}
4437
4438 //----------------------------------------------------------------------------
4439 /// \defgroup COMMAND COMMAND
4440 //\{
4441
4442 ///What a COMMAND returns
4443 struct T_TDC_COMMAND
4444 {
4445 T_TDC_COMMAND ();
4446 private:
4447 ///Hides ',' operator for COMMANDS
4448 template<class T>
4449 T_TDC_COMMAND operator, (T)
4450 {
4451 tdc_user_error ("COMMAND can not be part of comma expression"); // should be courth compiletime as this function is private
4452 return T_TDC_COMMAND();
4453 }
4454 };
4455
4456 struct T_TDC_COMMAND_CONTEXT:T_TDC_EVENT_CONTEXT
4457 {
4458 T_TDC_COMMAND_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_,int line_, char* text_);
4459 T_TDC_COMMAND_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_,int line_, char* text_, char* command_);
4460 T_TDC_COMMAND_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_,int line_, char* text_, char* value_text_, long value_);
4461 T_TDC_COMMAND operator || (T_TDC_COMMAND& command_);
4462 };
4463
4464 //\}
4465
4466 /// \defgroup PARKING PARKING Command
4467 //\{
4468
4469 enum T_TDC_PARKING_ENUM /// Values should be indentical to those defined in tap_int.h
4470 {
4471 DISABLE = 0,
4472 SHORT_TERM = 1,
4473 LONG_TERM = 2,
4474 SHORT_TERM_FAIL = 3,
4475 LONG_TERM_FAIL = 4
4476 };
4477
4478 struct T_TDC_PARKING_CONTEXT:private T_TDC_COMMAND_CONTEXT
4479 {
4480 T_TDC_PARKING_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_,int line_, char* value_text_, T_TDC_PARKING_ENUM value_);
4481 T_TDC_PARKING_CONTEXT (T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_,int line_, char* value_text_, bool value_);
4482 T_TDC_PARKING_ENUM operator || (T_TDC_PARKING_ENUM value_);
4483 };
4484
4485 //\}
4486
4487 //============================================================================
4488
4489 extern T_TDC_FUNCTION_CONTEXT tdc_syntax_context;
4490
4491 extern T_TDC_DYNAMIC_CONTEXT_DATA* tdc_dynamic_context;
4492
4493 //----------------------------------------------------------------------------
4494
4495 extern void tdc_implement_fail(T_TDC_JMPRET jmpret);
4496
4497 extern void tdc_implement_user_fail(T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_);
4498
4499 extern void tdc_implement_pass();
4500
4501 extern void tdc_implement_user_pass(T_TDC_DYNAMIC_CONTEXT_DATA& parent, char* file_, int line_);
4502
4503 //----------------------------------------------------------------------------
4504
4505 extern T_TDC_COMMAND tdc_implement_command (const char* text);
4506
4507 extern T_TDC_COMMAND tdc_implement_timeout (int time);
4508
4509 extern T_TDC_COMMAND tdc_implement_mute (int time);
4510
4511 extern T_TDC_COMMAND tdc_implement_start_timeout (int time);
4512
4513 extern T_TDC_COMMAND tdc_implement_wait_timeout ();
4514
4515 extern T_TDC_PARKING_ENUM tdc_implement_parking (T_TDC_PARKING_ENUM enabled);
4516 extern T_TDC_PARKING_ENUM tdc_implement_parking (bool enabled);
4517
4518 //============================================================================
4519
4520 #endif //TDC_TESTING
4521
4522 //============================================================================
4523 /// \defgroup TryCatchProtection
4524 //\{
4525
4526 /**
4527 map try, catch and throw to our version that prevent the user from using them
4528 by having both a plain and a "tdc_implement_..." version it is faily simple
4529 temporary to disable the mapping through #undef when need be
4530 this is some thing that the user should never do, but tdc have to, so the debugger
4531 see our longjmps as exceptions
4532
4533 //TODO: do this stuff debugger see longjumps as exceptions
4534 */
4535
4536 /// try, catch and throw conflicts with longjmp in vc6, use TRAP
4537 #define try tdc_implement_try
4538 /// try, catch and throw conflicts with longjmp in vc6, use ELSE
4539 #define catch(exception) tdc_implement_catch(exception)
4540 /// try, catch and throw conflicts with longjmp in vc6, use FAIL or PASS
4541 #define throw tdc_implement_throw
4542
4543 /// try, catch and throw conflicts with longjmp in vc6, use TRAP
4544 #define tdc_implement_try while(tdc_try_disabled)
4545 /// try, catch and throw conflicts with longjmp in vc6, use ELSE
4546 #define tdc_implement_catch(exception) while(tdc_catch_disabled)
4547 /// try, catch and throw conflicts with longjmp in vc6, use FAIL or PASS
4548 #define tdc_implement_throw while(tdc_throw_disabled)throw
4549
4550 //\}
4551 //----------------------------------------------------------------------------
4552
4553 #if DOT_COMPLETE //DOT_COMPLETE_PROTOTYPES
4554 #ifndef M_TDC_DOC //we don't want theses to occour twice in the call graph
4555
4556 // dummy functions to generate hint in dot-complete (e.g. when pressing <ctrl-shift-space> )
4557 // remember that functions must have a body to be considered for dot-completion by Visual Studio
4558
4559 void FAIL (void){}
4560
4561 void PASS (void){}
4562
4563 void SEND (T_PRIMITIVE_UNION primitive){}
4564
4565 T_ON AWAIT (T_PRIMITIVE_UNION primitive){}
4566
4567 void COMMAND (char* command_string){}
4568
4569 void TIMEOUT (int timeout){}
4570
4571 void START_TIMEOUT (int timeout){}
4572
4573 void WAIT_TIMEOUT (){}
4574
4575 void MUTE (int timeout){}
4576
4577 T_TDC_PARKING_ENUM PARKING (T_TDC_PARKING_ENUM enable){}
4578
4579 T_similar_syntax_as_while_statement BEGIN_CASE (char* trace_comment){}
4580
4581 T_similar_syntax_as_while_statement BEGIN_STEP (char* trace_comment){}
4582
4583 T_similar_syntax_as_while_statement ON (T_AWAIT){}
4584
4585 T_similar_syntax_as_while_statement OTHERWISE (){}
4586
4587 #endif//M_TDC_DOC
4588 #else//DOT_COMPLETE_PROTOTYPES
4589
4590 // real implementation
4591
4592 /*
4593 special constructions used in these macros:
4594
4595 ensure that only a ; is allowed after this macro
4596 do {...} while(0)
4597
4598 make variable declared in for(...) private to the statements ({...} or ...;) after this macro
4599 if(0);else
4600
4601 make implicit return at exit of loop (x might be replace by more code in the actual macros)
4602 for (int x=0;;x=1) if (x) return ...; else
4603 */
4604
4605 #define FAIL() do {tdc_implement_user_fail (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__); } while (0)
4606
4607 #define PASS() do {tdc_implement_user_pass (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__); } while (0)
4608
4609 #define SEND(primitive) tdc_send_context(tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, #primitive).tdc_implement_send(T_PRIMITIVE_UNION(primitive))
4610
4611 #define AWAIT(primitive) tdc_await_context(tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, #primitive).tdc_implement_await(T_PRIMITIVE_UNION(primitive))
4612
4613 #define START_TIMEOUT(timeout) (T_TDC_COMMAND_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, "START_TIMEOUT", #timeout, timeout) || tdc_implement_start_timeout(timeout))
4614
4615 #ifdef WAIT_TIMEOUT
4616 #undef WAIT_TIMEOUT /* To avoid class with defined macro in winbase.h */
4617 #endif
4618 #define WAIT_TIMEOUT() (T_TDC_COMMAND_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, "WAIT_TIMEOUT") || tdc_implement_wait_timeout())
4619
4620 #define MUTE(timeout) (T_TDC_COMMAND_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, "MUTE", #timeout, timeout) || tdc_implement_mute(timeout))
4621
4622 #define COMMAND(command) (T_TDC_COMMAND_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, #command) || tdc_implement_command(command))
4623
4624 #define TIMEOUT(timeout) (T_TDC_COMMAND_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, #timeout) || tdc_implement_timeout(timeout))
4625
4626 #define PARKING(enable) (T_TDC_PARKING_CONTEXT (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__, #enable, enable) || tdc_implement_parking(enable))
4627
4628 // some short cuts where user forgot '()' after '_skip' etc.
4629
4630 #define _skip tdc_skip()
4631 #define _show tdc_show()
4632 #define _forbid tdc_forbid()
4633 #define _require tdc_require()
4634 #define _skip_to_end tdc_skip_to_end()
4635
4636 #define _SKIP tdc_skip()
4637 #define _SHOW tdc_show()
4638 #define _FORBID tdc_forbid()
4639 #define _REQUIRE tdc_require()
4640 #define _SKIP_TO_END tdc_skip_to_end()
4641
4642 #endif//DOT_COMPLETE_PROTOTYPES
4643
4644 #define M_TDC_COMMAND_MUST_BE_LAST_IN_SCOPE true
4645
4646 /** \defgroup BEGIN_CASE BEGIN_CASE(){}
4647 Usage:
4648 <pre>
4649 T_CASE casename ()
4650 {
4651 BEGIN_CASE ("trace_comment")
4652 {
4653 ...
4654 }
4655 }
4656 </pre>
4657 */
4658 //\{
4659
4660 /// return type for a test CASE
4661 #define T_CASE \
4662 extern "C" __declspec(dllexport) T_TDC_CASE
4663
4664 /** \def T_TDC_USER_ERROR_CASE
4665 Test cases defined with T_TDC_USER_ERROR_CASE
4666 are cases that passes when they fail and fails when they passes,
4667 this is only intended for testing TDC it self.
4668 T_TDC_USER_ERROR_CASE will not reverse the result of a syntax error.
4669
4670 <pre>
4671 Usage:
4672 T_TDC_USER_ERROR_CASE casename ()
4673 {
4674 TDC_BEGIN_USER_ERROR_CASE ("trace_comment")
4675 {
4676 ...
4677 }
4678 }
4679 </pre>
4680 */
4681
4682 /// return type for a test USER ERROR CASE
4683 #define T_TDC_USER_ERROR_CASE\
4684 extern "C" __declspec(dllexport) T_TDC_USER_ERROR_CASE_BASE
4685
4686 /// stuff common to BEGIN_CASE and TDC_BEGIN_USER_ERROR_CASE
4687 #define M_TDC_BEGIN_CASE_BASE(trace_comment,return_value)\
4688 T_TDC_only_one__BEGIN_CASE__allowed_per_function tdc_begin_case (tdc_syntax_context.tdc_function_context);\
4689 if(0);else/*hide tdc_syntax_context after for body*/\
4690 for (T_TDC_CASE_CONTEXT tdc_context (tdc_begin_case.parent,__FILE__,__LINE__,trace_comment),\
4691 &tdc_syntax_context = ((tdc_context.tdc_not_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_context.tdc_not_alt_context.mark))),tdc_context);\
4692 M_TDC_COMMAND_MUST_BE_LAST_IN_SCOPE;\
4693 tdc_context.tdc_end_for ())\
4694 if (tdc_context.tdc_do_return ())\
4695 return tdc_context.return_value ();\
4696 else
4697
4698 /// BEGIN_CASE should be the outermost scope in a CASE
4699 #define BEGIN_CASE(trace_comment)\
4700 M_TDC_BEGIN_CASE_BASE(trace_comment,tdc_return_value)
4701
4702 /// TDC_BEGIN_USER_ERROR_CASE a BEGIN_CASE for T_TDC_USER_ERROR_CASE
4703 #define TDC_BEGIN_USER_ERROR_CASE(trace_comment)\
4704 M_TDC_BEGIN_CASE_BASE(trace_comment,tdc_user_error_return_value)
4705
4706 //\}
4707
4708 /** \defgroup BEGIN_STEP BEGIN_STEP(){}
4709 <pre>
4710 Usage:
4711 T_STEP stepname (...)
4712 {
4713 BEGIN_STEP ("trace_comment")
4714 {
4715 ...
4716 }
4717 }
4718 </pre>
4719 */
4720 //\{
4721
4722 //TODO: move functionality from tdc_context to tdc_begin_step and delete tdc_context
4723 #define BEGIN_STEP(trace_comment)\
4724 T_TDC_only_one__BEGIN_STEP__allowed_per_function tdc_begin_step (tdc_syntax_context.tdc_function_context), &tdc_syntax_context = tdc_begin_step;\
4725 if (0); else\
4726 for (T_TDC_STEP_CONTEXT tdc_context (tdc_begin_step.parent,__FILE__,__LINE__,trace_comment),\
4727 &tdc_syntax_context = ((tdc_context.tdc_not_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_context.tdc_not_alt_context.mark))),tdc_context);\
4728 M_TDC_COMMAND_MUST_BE_LAST_IN_SCOPE;\
4729 tdc_context.tdc_end_for ())\
4730 if (tdc_context.tdc_do_return ())\
4731 return tdc_context.tdc_return_value ();\
4732 else
4733
4734 //\}
4735
4736 /** \defgroup TRAP_ONFAIL TRAP{} & ONFAIL{}
4737 <pre>
4738 Usage:
4739 TRAP
4740 {
4741 ...
4742 FAIL();
4743 }
4744 ONFAIL
4745 {
4746 ...
4747 }
4748 </pre>
4749 */
4750 //\{
4751
4752 #define TRAP\
4753 if (0); else\
4754 for (T_TDC_TRAP_CONTEXT tdc_context (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__);\
4755 tdc_context.tdc_initial () && \
4756 (tdc_context.tdc_not_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_context.tdc_not_alt_context.mark)),\
4757 tdc_context.tdc_enter_for ());\
4758 )\
4759 if (tdc_context.tdc_trap_testing ())\
4760 for (T_TDC_TRAP_CONTEXT &tdc_syntax_context = tdc_context; ; tdc_syntax_context.tdc_end_for())
4761
4762 #ifdef M_TDC_DOC
4763 #define ONFAIL() //Soure Insight will only draw call gaphs if "()" is present
4764 #else
4765 #define ONFAIL else // we don't want to do something special here, as we can't ensure warning on a plain else
4766 #endif
4767
4768 //\}
4769
4770 /** \defgroup ALT_ON_OTHERWISE ALT{}, ON() & OTHERWISE()
4771 <pre>
4772 Usage:
4773 ALT
4774 {
4775 ON (AWAIT (...)) ...;
4776 ON (AWAIT (...)) ...;
4777 ON (AWAIT (...)) ...;
4778 OTHERWISE () ...;
4779 }
4780 </pre>
4781 */
4782 //\{
4783
4784 #define ALT\
4785 if (0); else\
4786 for (T_TDC_ALT_CONTEXT tdc_context (tdc_syntax_context.tdc_not_alt_context, __FILE__, __LINE__), &tdc_syntax_context = tdc_context;\
4787 tdc_context.tdc_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_context.tdc_alt_context.mark)),\
4788 tdc_context.tdc_enter_for ();\
4789 tdc_context.tdc_end_for ())
4790
4791 #define ON(await)\
4792 if (0); else\
4793 for (T_TDC_ON_CONTEXT tdc_context (tdc_syntax_context.tdc_alt_context,__FILE__,__LINE__,#await), &tdc_syntax_context = tdc_context;\
4794 tdc_context.tdc_not_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_context.tdc_not_alt_context.mark)),\
4795 tdc_context.tdc_enter_for () && tdc_context.tdc_on_expects_await (await);\
4796 tdc_context.tdc_end_for ())
4797
4798 #define OTHERWISE()\
4799 T_TDC__OTHERWISE__MUST_BE_LAST_IN_ALT tdc_otherwise (tdc_syntax_context.tdc_alt_context), &tdc_syntax_context = tdc_otherwise;\
4800 if (0); else\
4801 for (T_TDC_OTHERWISE_CONTEXT tdc_syntax_context (tdc_otherwise.parent, __FILE__, __LINE__);\
4802 tdc_syntax_context.tdc_not_alt_context.jmpret = T_TDC_JMPRET (setjmp (tdc_syntax_context.tdc_not_alt_context.mark)),\
4803 tdc_syntax_context.tdc_enter_for (), M_TDC_COMMAND_MUST_BE_LAST_IN_SCOPE ;\
4804 tdc_syntax_context.tdc_end_for ())
4805
4806 //\}
4807
4808 //============================================================================
4809
4810 #if TDC_DEBUG_DOT_COMPLETE
4811 void F_TDC_DEBUG_DOT_COMPLETE__TDC_H_1Z()
4812 {
4813 T_TDC_DEBUG_DOT_COMPLETE__TDC_H_1 s;
4814 s.
4815 i;
4816 s->i0;
4817 T_TDC_INTERFACE_ARRAY<int> i;
4818 i.
4819 }
4820 #else
4821 #endif
4822
4823 //============================================================================
4824
4825 #endif //TDC_BASE_H
4826
4827