Salome HOME
985bce1c1d1538459cdba35d7f6df8acfc934df3
[modules/shaper.git] / src / ModelHighAPI / ModelHighAPI_Macro.h
1 // Copyright (C) 2014-2022  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
21 #define SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
22
23 //--------------------------------------------------------------------------------------
24 #include <GeomDataAPI_Dir.h>
25 #include <GeomDataAPI_Point.h>
26 #include <GeomDataAPI_Point2D.h>
27 //--------------------------------------------------------------------------------------
28 #include <ModelAPI_AttributeBoolean.h>
29 #include <ModelAPI_AttributeDocRef.h>
30 #include <ModelAPI_AttributeDouble.h>
31 #include <ModelAPI_AttributeIntArray.h>
32 #include <ModelAPI_AttributeInteger.h>
33 #include <ModelAPI_AttributeRefAttr.h>
34 #include <ModelAPI_AttributeRefAttrList.h>
35 #include <ModelAPI_AttributeReference.h>
36 #include <ModelAPI_AttributeRefList.h>
37 #include <ModelAPI_AttributeSelection.h>
38 #include <ModelAPI_AttributeSelectionList.h>
39 #include <ModelAPI_AttributeString.h>
40 #include <ModelAPI_Feature.h>
41
42 //--------------------------------------------------------------------------------------
43 #define VAR_NAME(NAME) my##NAME
44
45 //--------------------------------------------------------------------------------------
46 #define TO_STRING_(NAME) #NAME
47 #define TO_STRING(NAME) TO_STRING_(NAME)
48
49 //--------------------------------------------------------------------------------------
50 // Used in INTERFACE_N for create variable and getter
51 #define DEFINE_ATTRIBUTE(NAME, TYPE, COMMENT) \
52     COMMENT \
53     virtual std::shared_ptr<TYPE> NAME() const { return VAR_NAME(NAME); } \
54   protected: \
55     std::shared_ptr<TYPE> VAR_NAME(NAME); \
56   public:
57
58 //--------------------------------------------------------------------------------------
59 // Used in INTERFACE_N inside START_INIT/END_INIT for
60 // set variable with attribute received from feature
61 #define SET_ATTRIBUTE(NAME, TYPE, ATT_NAME) \
62   VAR_NAME(NAME) = std::dynamic_pointer_cast<TYPE>(feature()->attribute(ATT_NAME)); \
63   if (!VAR_NAME(NAME)) \
64     return false; \
65   myAttrGetter[ATT_NAME] = TO_STRING(NAME);
66
67 //--------------------------------------------------------------------------------------
68 #define INTERFACE_COMMON(KIND) \
69   static std::string ID() { return KIND; }\
70   virtual std::string getID() { return ID(); }
71
72 //--------------------------------------------------------------------------------------
73 #define START_INIT() \
74   bool initialize() { \
75     if (!feature()) { \
76       throwException(ID() + " exception: The feature is NULL."); \
77       return false; \
78     } \
79     if (getKind() != getID()) { \
80       throwException(ID() + " exception: Wrong feature kind."); \
81       return false; \
82     }
83
84 //--------------------------------------------------------------------------------------
85 #define END_INIT() \
86     return true; \
87   }
88
89 //--------------------------------------------------------------------------------------
90 #define INTERFACE_0(KIND) \
91   public: \
92     INTERFACE_COMMON(KIND) \
93   protected: \
94     START_INIT() \
95     END_INIT() \
96   public:
97
98 //--------------------------------------------------------------------------------------
99 #define INTERFACE_1(KIND, \
100                     N_0, AN_0, T_0, C_0) \
101   public: \
102     INTERFACE_COMMON(KIND) \
103     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
104   protected: \
105     START_INIT() \
106       SET_ATTRIBUTE(N_0, T_0, AN_0) \
107     END_INIT() \
108   public:
109
110 //--------------------------------------------------------------------------------------
111 #define INTERFACE_2(KIND, \
112                     N_0, AN_0, T_0, C_0, \
113                     N_1, AN_1, T_1, C_1) \
114   public: \
115     INTERFACE_COMMON(KIND) \
116     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
117     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
118   protected: \
119     START_INIT() \
120       SET_ATTRIBUTE(N_0, T_0, AN_0) \
121       SET_ATTRIBUTE(N_1, T_1, AN_1) \
122     END_INIT() \
123   public:
124
125 //--------------------------------------------------------------------------------------
126 #define INTERFACE_3(KIND, \
127                     N_0, AN_0, T_0, C_0, \
128                     N_1, AN_1, T_1, C_1, \
129                     N_2, AN_2, T_2, C_2) \
130   public: \
131     INTERFACE_COMMON(KIND) \
132     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
133     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
134     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
135   protected: \
136     START_INIT() \
137       SET_ATTRIBUTE(N_0, T_0, AN_0) \
138       SET_ATTRIBUTE(N_1, T_1, AN_1) \
139       SET_ATTRIBUTE(N_2, T_2, AN_2) \
140     END_INIT() \
141   public:
142
143 //--------------------------------------------------------------------------------------
144 #define INTERFACE_4(KIND, \
145                     N_0, AN_0, T_0, C_0, \
146                     N_1, AN_1, T_1, C_1, \
147                     N_2, AN_2, T_2, C_2, \
148                     N_3, AN_3, T_3, C_3) \
149   public: \
150     INTERFACE_COMMON(KIND) \
151     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
152     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
153     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
154     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
155   protected: \
156     START_INIT() \
157       SET_ATTRIBUTE(N_0, T_0, AN_0) \
158       SET_ATTRIBUTE(N_1, T_1, AN_1) \
159       SET_ATTRIBUTE(N_2, T_2, AN_2) \
160       SET_ATTRIBUTE(N_3, T_3, AN_3) \
161     END_INIT() \
162   public:
163
164 //--------------------------------------------------------------------------------------
165 #define INTERFACE_5(KIND, \
166                     N_0, AN_0, T_0, C_0, \
167                     N_1, AN_1, T_1, C_1, \
168                     N_2, AN_2, T_2, C_2, \
169                     N_3, AN_3, T_3, C_3, \
170                     N_4, AN_4, T_4, C_4) \
171   public: \
172     INTERFACE_COMMON(KIND) \
173     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
174     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
175     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
176     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
177     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
178   protected: \
179     START_INIT() \
180       SET_ATTRIBUTE(N_0, T_0, AN_0) \
181       SET_ATTRIBUTE(N_1, T_1, AN_1) \
182       SET_ATTRIBUTE(N_2, T_2, AN_2) \
183       SET_ATTRIBUTE(N_3, T_3, AN_3) \
184       SET_ATTRIBUTE(N_4, T_4, AN_4) \
185     END_INIT() \
186   public:
187
188 //--------------------------------------------------------------------------------------
189 #define INTERFACE_6(KIND, \
190                     N_0, AN_0, T_0, C_0, \
191                     N_1, AN_1, T_1, C_1, \
192                     N_2, AN_2, T_2, C_2, \
193                     N_3, AN_3, T_3, C_3, \
194                     N_4, AN_4, T_4, C_4, \
195                     N_5, AN_5, T_5, C_5) \
196   public: \
197     INTERFACE_COMMON(KIND) \
198     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
199     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
200     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
201     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
202     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
203     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
204   protected: \
205     START_INIT() \
206       SET_ATTRIBUTE(N_0, T_0, AN_0) \
207       SET_ATTRIBUTE(N_1, T_1, AN_1) \
208       SET_ATTRIBUTE(N_2, T_2, AN_2) \
209       SET_ATTRIBUTE(N_3, T_3, AN_3) \
210       SET_ATTRIBUTE(N_4, T_4, AN_4) \
211       SET_ATTRIBUTE(N_5, T_5, AN_5) \
212     END_INIT() \
213   public:
214
215 //--------------------------------------------------------------------------------------
216 #define INTERFACE_7(KIND, \
217                     N_0, AN_0, T_0, C_0, \
218                     N_1, AN_1, T_1, C_1, \
219                     N_2, AN_2, T_2, C_2, \
220                     N_3, AN_3, T_3, C_3, \
221                     N_4, AN_4, T_4, C_4, \
222                     N_5, AN_5, T_5, C_5, \
223                     N_6, AN_6, T_6, C_6) \
224   public: \
225     INTERFACE_COMMON(KIND) \
226     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
227     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
228     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
229     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
230     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
231     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
232     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
233   protected: \
234     START_INIT() \
235       SET_ATTRIBUTE(N_0, T_0, AN_0) \
236       SET_ATTRIBUTE(N_1, T_1, AN_1) \
237       SET_ATTRIBUTE(N_2, T_2, AN_2) \
238       SET_ATTRIBUTE(N_3, T_3, AN_3) \
239       SET_ATTRIBUTE(N_4, T_4, AN_4) \
240       SET_ATTRIBUTE(N_5, T_5, AN_5) \
241       SET_ATTRIBUTE(N_6, T_6, AN_6) \
242     END_INIT() \
243   public:
244
245 //--------------------------------------------------------------------------------------
246 #define INTERFACE_8(KIND, \
247                     N_0, AN_0, T_0, C_0, \
248                     N_1, AN_1, T_1, C_1, \
249                     N_2, AN_2, T_2, C_2, \
250                     N_3, AN_3, T_3, C_3, \
251                     N_4, AN_4, T_4, C_4, \
252                     N_5, AN_5, T_5, C_5, \
253                     N_6, AN_6, T_6, C_6, \
254                     N_7, AN_7, T_7, C_7) \
255   public: \
256     INTERFACE_COMMON(KIND) \
257     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
258     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
259     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
260     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
261     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
262     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
263     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
264     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
265   protected: \
266     START_INIT() \
267       SET_ATTRIBUTE(N_0, T_0, AN_0) \
268       SET_ATTRIBUTE(N_1, T_1, AN_1) \
269       SET_ATTRIBUTE(N_2, T_2, AN_2) \
270       SET_ATTRIBUTE(N_3, T_3, AN_3) \
271       SET_ATTRIBUTE(N_4, T_4, AN_4) \
272       SET_ATTRIBUTE(N_5, T_5, AN_5) \
273       SET_ATTRIBUTE(N_6, T_6, AN_6) \
274       SET_ATTRIBUTE(N_7, T_7, AN_7) \
275     END_INIT() \
276   public:
277
278 //--------------------------------------------------------------------------------------
279 #define INTERFACE_9(KIND, \
280                     N_0, AN_0, T_0, C_0, \
281                     N_1, AN_1, T_1, C_1, \
282                     N_2, AN_2, T_2, C_2, \
283                     N_3, AN_3, T_3, C_3, \
284                     N_4, AN_4, T_4, C_4, \
285                     N_5, AN_5, T_5, C_5, \
286                     N_6, AN_6, T_6, C_6, \
287                     N_7, AN_7, T_7, C_7, \
288                     N_8, AN_8, T_8, C_8) \
289   public: \
290     INTERFACE_COMMON(KIND) \
291     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
292     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
293     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
294     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
295     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
296     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
297     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
298     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
299     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
300   protected: \
301     START_INIT() \
302       SET_ATTRIBUTE(N_0, T_0, AN_0) \
303       SET_ATTRIBUTE(N_1, T_1, AN_1) \
304       SET_ATTRIBUTE(N_2, T_2, AN_2) \
305       SET_ATTRIBUTE(N_3, T_3, AN_3) \
306       SET_ATTRIBUTE(N_4, T_4, AN_4) \
307       SET_ATTRIBUTE(N_5, T_5, AN_5) \
308       SET_ATTRIBUTE(N_6, T_6, AN_6) \
309       SET_ATTRIBUTE(N_7, T_7, AN_7) \
310       SET_ATTRIBUTE(N_8, T_8, AN_8) \
311     END_INIT() \
312   public:
313
314 //--------------------------------------------------------------------------------------
315 #define INTERFACE_10(KIND, \
316                      N_0, AN_0, T_0, C_0, \
317                      N_1, AN_1, T_1, C_1, \
318                      N_2, AN_2, T_2, C_2, \
319                      N_3, AN_3, T_3, C_3, \
320                      N_4, AN_4, T_4, C_4, \
321                      N_5, AN_5, T_5, C_5, \
322                      N_6, AN_6, T_6, C_6, \
323                      N_7, AN_7, T_7, C_7, \
324                      N_8, AN_8, T_8, C_8, \
325                      N_9, AN_9, T_9, C_9) \
326   public: \
327     INTERFACE_COMMON(KIND) \
328     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
329     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
330     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
331     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
332     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
333     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
334     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
335     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
336     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
337     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
338   protected: \
339     START_INIT() \
340       SET_ATTRIBUTE(N_0, T_0, AN_0) \
341       SET_ATTRIBUTE(N_1, T_1, AN_1) \
342       SET_ATTRIBUTE(N_2, T_2, AN_2) \
343       SET_ATTRIBUTE(N_3, T_3, AN_3) \
344       SET_ATTRIBUTE(N_4, T_4, AN_4) \
345       SET_ATTRIBUTE(N_5, T_5, AN_5) \
346       SET_ATTRIBUTE(N_6, T_6, AN_6) \
347       SET_ATTRIBUTE(N_7, T_7, AN_7) \
348       SET_ATTRIBUTE(N_8, T_8, AN_8) \
349       SET_ATTRIBUTE(N_9, T_9, AN_9) \
350     END_INIT() \
351   public:
352
353 //--------------------------------------------------------------------------------------
354 #define INTERFACE_11(KIND, \
355                      N_0, AN_0, T_0, C_0, \
356                      N_1, AN_1, T_1, C_1, \
357                      N_2, AN_2, T_2, C_2, \
358                      N_3, AN_3, T_3, C_3, \
359                      N_4, AN_4, T_4, C_4, \
360                      N_5, AN_5, T_5, C_5, \
361                      N_6, AN_6, T_6, C_6, \
362                      N_7, AN_7, T_7, C_7, \
363                      N_8, AN_8, T_8, C_8, \
364                      N_9, AN_9, T_9, C_9, \
365                      N_10, AN_10, T_10, C_10) \
366   public: \
367     INTERFACE_COMMON(KIND) \
368     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
369     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
370     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
371     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
372     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
373     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
374     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
375     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
376     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
377     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
378     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
379   protected: \
380     START_INIT() \
381       SET_ATTRIBUTE(N_0, T_0, AN_0) \
382       SET_ATTRIBUTE(N_1, T_1, AN_1) \
383       SET_ATTRIBUTE(N_2, T_2, AN_2) \
384       SET_ATTRIBUTE(N_3, T_3, AN_3) \
385       SET_ATTRIBUTE(N_4, T_4, AN_4) \
386       SET_ATTRIBUTE(N_5, T_5, AN_5) \
387       SET_ATTRIBUTE(N_6, T_6, AN_6) \
388       SET_ATTRIBUTE(N_7, T_7, AN_7) \
389       SET_ATTRIBUTE(N_8, T_8, AN_8) \
390       SET_ATTRIBUTE(N_9, T_9, AN_9) \
391       SET_ATTRIBUTE(N_10, T_10, AN_10) \
392     END_INIT() \
393   public:
394
395 //--------------------------------------------------------------------------------------
396 #define INTERFACE_12(KIND, \
397                      N_0, AN_0, T_0, C_0, \
398                      N_1, AN_1, T_1, C_1, \
399                      N_2, AN_2, T_2, C_2, \
400                      N_3, AN_3, T_3, C_3, \
401                      N_4, AN_4, T_4, C_4, \
402                      N_5, AN_5, T_5, C_5, \
403                      N_6, AN_6, T_6, C_6, \
404                      N_7, AN_7, T_7, C_7, \
405                      N_8, AN_8, T_8, C_8, \
406                      N_9, AN_9, T_9, C_9, \
407                      N_10, AN_10, T_10, C_10, \
408                      N_11, AN_11, T_11, C_11) \
409   public: \
410     INTERFACE_COMMON(KIND) \
411     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
412     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
413     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
414     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
415     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
416     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
417     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
418     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
419     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
420     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
421     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
422     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
423   protected: \
424     START_INIT() \
425       SET_ATTRIBUTE(N_0, T_0, AN_0) \
426       SET_ATTRIBUTE(N_1, T_1, AN_1) \
427       SET_ATTRIBUTE(N_2, T_2, AN_2) \
428       SET_ATTRIBUTE(N_3, T_3, AN_3) \
429       SET_ATTRIBUTE(N_4, T_4, AN_4) \
430       SET_ATTRIBUTE(N_5, T_5, AN_5) \
431       SET_ATTRIBUTE(N_6, T_6, AN_6) \
432       SET_ATTRIBUTE(N_7, T_7, AN_7) \
433       SET_ATTRIBUTE(N_8, T_8, AN_8) \
434       SET_ATTRIBUTE(N_9, T_9, AN_9) \
435       SET_ATTRIBUTE(N_10, T_10, AN_10) \
436       SET_ATTRIBUTE(N_11, T_11, AN_11) \
437     END_INIT() \
438   public:
439
440 //--------------------------------------------------------------------------------------
441 #define INTERFACE_13(KIND, \
442                      N_0, AN_0, T_0, C_0, \
443                      N_1, AN_1, T_1, C_1, \
444                      N_2, AN_2, T_2, C_2, \
445                      N_3, AN_3, T_3, C_3, \
446                      N_4, AN_4, T_4, C_4, \
447                      N_5, AN_5, T_5, C_5, \
448                      N_6, AN_6, T_6, C_6, \
449                      N_7, AN_7, T_7, C_7, \
450                      N_8, AN_8, T_8, C_8, \
451                      N_9, AN_9, T_9, C_9, \
452                      N_10, AN_10, T_10, C_10, \
453                      N_11, AN_11, T_11, C_11, \
454                      N_12, AN_12, T_12, C_12) \
455   public: \
456     INTERFACE_COMMON(KIND) \
457     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
458     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
459     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
460     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
461     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
462     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
463     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
464     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
465     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
466     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
467     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
468     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
469     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
470   protected: \
471     START_INIT() \
472       SET_ATTRIBUTE(N_0, T_0, AN_0) \
473       SET_ATTRIBUTE(N_1, T_1, AN_1) \
474       SET_ATTRIBUTE(N_2, T_2, AN_2) \
475       SET_ATTRIBUTE(N_3, T_3, AN_3) \
476       SET_ATTRIBUTE(N_4, T_4, AN_4) \
477       SET_ATTRIBUTE(N_5, T_5, AN_5) \
478       SET_ATTRIBUTE(N_6, T_6, AN_6) \
479       SET_ATTRIBUTE(N_7, T_7, AN_7) \
480       SET_ATTRIBUTE(N_8, T_8, AN_8) \
481       SET_ATTRIBUTE(N_9, T_9, AN_9) \
482       SET_ATTRIBUTE(N_10, T_10, AN_10) \
483       SET_ATTRIBUTE(N_11, T_11, AN_11) \
484       SET_ATTRIBUTE(N_12, T_12, AN_12) \
485     END_INIT() \
486   public:
487
488 //--------------------------------------------------------------------------------------
489 #define INTERFACE_14(KIND, \
490                      N_0, AN_0, T_0, C_0, \
491                      N_1, AN_1, T_1, C_1, \
492                      N_2, AN_2, T_2, C_2, \
493                      N_3, AN_3, T_3, C_3, \
494                      N_4, AN_4, T_4, C_4, \
495                      N_5, AN_5, T_5, C_5, \
496                      N_6, AN_6, T_6, C_6, \
497                      N_7, AN_7, T_7, C_7, \
498                      N_8, AN_8, T_8, C_8, \
499                      N_9, AN_9, T_9, C_9, \
500                      N_10, AN_10, T_10, C_10, \
501                      N_11, AN_11, T_11, C_11, \
502                      N_12, AN_12, T_12, C_12, \
503                      N_13, AN_13, T_13, C_13) \
504   public: \
505     INTERFACE_COMMON(KIND) \
506     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
507     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
508     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
509     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
510     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
511     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
512     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
513     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
514     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
515     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
516     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
517     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
518     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
519     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
520   protected: \
521     START_INIT() \
522       SET_ATTRIBUTE(N_0, T_0, AN_0) \
523       SET_ATTRIBUTE(N_1, T_1, AN_1) \
524       SET_ATTRIBUTE(N_2, T_2, AN_2) \
525       SET_ATTRIBUTE(N_3, T_3, AN_3) \
526       SET_ATTRIBUTE(N_4, T_4, AN_4) \
527       SET_ATTRIBUTE(N_5, T_5, AN_5) \
528       SET_ATTRIBUTE(N_6, T_6, AN_6) \
529       SET_ATTRIBUTE(N_7, T_7, AN_7) \
530       SET_ATTRIBUTE(N_8, T_8, AN_8) \
531       SET_ATTRIBUTE(N_9, T_9, AN_9) \
532       SET_ATTRIBUTE(N_10, T_10, AN_10) \
533       SET_ATTRIBUTE(N_11, T_11, AN_11) \
534       SET_ATTRIBUTE(N_12, T_12, AN_12) \
535       SET_ATTRIBUTE(N_13, T_13, AN_13) \
536     END_INIT() \
537   public:
538 //--------------------------------------------------------------------------------------
539 #define INTERFACE_15(KIND, \
540                      N_0, AN_0, T_0, C_0, \
541                      N_1, AN_1, T_1, C_1, \
542                      N_2, AN_2, T_2, C_2, \
543                      N_3, AN_3, T_3, C_3, \
544                      N_4, AN_4, T_4, C_4, \
545                      N_5, AN_5, T_5, C_5, \
546                      N_6, AN_6, T_6, C_6, \
547                      N_7, AN_7, T_7, C_7, \
548                      N_8, AN_8, T_8, C_8, \
549                      N_9, AN_9, T_9, C_9, \
550                      N_10, AN_10, T_10, C_10, \
551                      N_11, AN_11, T_11, C_11, \
552                      N_12, AN_12, T_12, C_12, \
553                      N_13, AN_13, T_13, C_13, \
554                      N_14, AN_14, T_14, C_14) \
555   public: \
556     INTERFACE_COMMON(KIND) \
557     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
558     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
559     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
560     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
561     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
562     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
563     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
564     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
565     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
566     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
567     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
568     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
569     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
570     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
571     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
572   protected: \
573     START_INIT() \
574       SET_ATTRIBUTE(N_0, T_0, AN_0) \
575       SET_ATTRIBUTE(N_1, T_1, AN_1) \
576       SET_ATTRIBUTE(N_2, T_2, AN_2) \
577       SET_ATTRIBUTE(N_3, T_3, AN_3) \
578       SET_ATTRIBUTE(N_4, T_4, AN_4) \
579       SET_ATTRIBUTE(N_5, T_5, AN_5) \
580       SET_ATTRIBUTE(N_6, T_6, AN_6) \
581       SET_ATTRIBUTE(N_7, T_7, AN_7) \
582       SET_ATTRIBUTE(N_8, T_8, AN_8) \
583       SET_ATTRIBUTE(N_9, T_9, AN_9) \
584       SET_ATTRIBUTE(N_10, T_10, AN_10) \
585       SET_ATTRIBUTE(N_11, T_11, AN_11) \
586       SET_ATTRIBUTE(N_12, T_12, AN_12) \
587       SET_ATTRIBUTE(N_13, T_13, AN_13) \
588       SET_ATTRIBUTE(N_14, T_14, AN_14) \
589     END_INIT() \
590   public:
591
592 //--------------------------------------------------------------------------------------
593 #define INTERFACE_16(KIND, \
594                      N_0, AN_0, T_0, C_0, \
595                      N_1, AN_1, T_1, C_1, \
596                      N_2, AN_2, T_2, C_2, \
597                      N_3, AN_3, T_3, C_3, \
598                      N_4, AN_4, T_4, C_4, \
599                      N_5, AN_5, T_5, C_5, \
600                      N_6, AN_6, T_6, C_6, \
601                      N_7, AN_7, T_7, C_7, \
602                      N_8, AN_8, T_8, C_8, \
603                      N_9, AN_9, T_9, C_9, \
604                      N_10, AN_10, T_10, C_10, \
605                      N_11, AN_11, T_11, C_11, \
606                      N_12, AN_12, T_12, C_12, \
607                      N_13, AN_13, T_13, C_13, \
608                      N_14, AN_14, T_14, C_14, \
609                      N_15, AN_15, T_15, C_15) \
610   public: \
611     INTERFACE_COMMON(KIND) \
612     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
613     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
614     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
615     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
616     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
617     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
618     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
619     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
620     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
621     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
622     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
623     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
624     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
625     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
626     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
627     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
628   protected: \
629     START_INIT() \
630       SET_ATTRIBUTE(N_0, T_0, AN_0) \
631       SET_ATTRIBUTE(N_1, T_1, AN_1) \
632       SET_ATTRIBUTE(N_2, T_2, AN_2) \
633       SET_ATTRIBUTE(N_3, T_3, AN_3) \
634       SET_ATTRIBUTE(N_4, T_4, AN_4) \
635       SET_ATTRIBUTE(N_5, T_5, AN_5) \
636       SET_ATTRIBUTE(N_6, T_6, AN_6) \
637       SET_ATTRIBUTE(N_7, T_7, AN_7) \
638       SET_ATTRIBUTE(N_8, T_8, AN_8) \
639       SET_ATTRIBUTE(N_9, T_9, AN_9) \
640       SET_ATTRIBUTE(N_10, T_10, AN_10) \
641       SET_ATTRIBUTE(N_11, T_11, AN_11) \
642       SET_ATTRIBUTE(N_12, T_12, AN_12) \
643       SET_ATTRIBUTE(N_13, T_13, AN_13) \
644       SET_ATTRIBUTE(N_14, T_14, AN_14) \
645       SET_ATTRIBUTE(N_15, T_15, AN_15) \
646     END_INIT() \
647   public:
648
649 //--------------------------------------------------------------------------------------
650 #define INTERFACE_18(KIND, \
651                      N_0, AN_0, T_0, C_0, \
652                      N_1, AN_1, T_1, C_1, \
653                      N_2, AN_2, T_2, C_2, \
654                      N_3, AN_3, T_3, C_3, \
655                      N_4, AN_4, T_4, C_4, \
656                      N_5, AN_5, T_5, C_5, \
657                      N_6, AN_6, T_6, C_6, \
658                      N_7, AN_7, T_7, C_7, \
659                      N_8, AN_8, T_8, C_8, \
660                      N_9, AN_9, T_9, C_9, \
661                      N_10, AN_10, T_10, C_10, \
662                      N_11, AN_11, T_11, C_11, \
663                      N_12, AN_12, T_12, C_12, \
664                      N_13, AN_13, T_13, C_13, \
665                      N_14, AN_14, T_14, C_14, \
666                      N_15, AN_15, T_15, C_15, \
667                      N_16, AN_16, T_16, C_16, \
668                      N_17, AN_17, T_17, C_17) \
669   public: \
670     INTERFACE_COMMON(KIND) \
671     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
672     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
673     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
674     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
675     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
676     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
677     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
678     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
679     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
680     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
681     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
682     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
683     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
684     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
685     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
686     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
687     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
688     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
689   protected: \
690     START_INIT() \
691       SET_ATTRIBUTE(N_0, T_0, AN_0) \
692       SET_ATTRIBUTE(N_1, T_1, AN_1) \
693       SET_ATTRIBUTE(N_2, T_2, AN_2) \
694       SET_ATTRIBUTE(N_3, T_3, AN_3) \
695       SET_ATTRIBUTE(N_4, T_4, AN_4) \
696       SET_ATTRIBUTE(N_5, T_5, AN_5) \
697       SET_ATTRIBUTE(N_6, T_6, AN_6) \
698       SET_ATTRIBUTE(N_7, T_7, AN_7) \
699       SET_ATTRIBUTE(N_8, T_8, AN_8) \
700       SET_ATTRIBUTE(N_9, T_9, AN_9) \
701       SET_ATTRIBUTE(N_10, T_10, AN_10) \
702       SET_ATTRIBUTE(N_11, T_11, AN_11) \
703       SET_ATTRIBUTE(N_12, T_12, AN_12) \
704       SET_ATTRIBUTE(N_13, T_13, AN_13) \
705       SET_ATTRIBUTE(N_14, T_14, AN_14) \
706       SET_ATTRIBUTE(N_15, T_15, AN_15) \
707       SET_ATTRIBUTE(N_16, T_16, AN_16) \
708       SET_ATTRIBUTE(N_17, T_17, AN_17) \
709     END_INIT() \
710   public:
711
712 //--------------------------------------------------------------------------------------
713 #define INTERFACE_20(KIND, \
714                      N_0, AN_0, T_0, C_0, \
715                      N_1, AN_1, T_1, C_1, \
716                      N_2, AN_2, T_2, C_2, \
717                      N_3, AN_3, T_3, C_3, \
718                      N_4, AN_4, T_4, C_4, \
719                      N_5, AN_5, T_5, C_5, \
720                      N_6, AN_6, T_6, C_6, \
721                      N_7, AN_7, T_7, C_7, \
722                      N_8, AN_8, T_8, C_8, \
723                      N_9, AN_9, T_9, C_9, \
724                      N_10, AN_10, T_10, C_10, \
725                      N_11, AN_11, T_11, C_11, \
726                      N_12, AN_12, T_12, C_12, \
727                      N_13, AN_13, T_13, C_13, \
728                      N_14, AN_14, T_14, C_14, \
729                      N_15, AN_15, T_15, C_15, \
730                      N_16, AN_16, T_16, C_16, \
731                      N_17, AN_17, T_17, C_17, \
732                      N_18, AN_18, T_18, C_18, \
733                      N_19, AN_19, T_19, C_19) \
734   public: \
735     INTERFACE_COMMON(KIND) \
736     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
737     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
738     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
739     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
740     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
741     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
742     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
743     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
744     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
745     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
746     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
747     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
748     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
749     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
750     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
751     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
752     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
753     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
754     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
755     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
756   protected: \
757     START_INIT() \
758       SET_ATTRIBUTE(N_0, T_0, AN_0) \
759       SET_ATTRIBUTE(N_1, T_1, AN_1) \
760       SET_ATTRIBUTE(N_2, T_2, AN_2) \
761       SET_ATTRIBUTE(N_3, T_3, AN_3) \
762       SET_ATTRIBUTE(N_4, T_4, AN_4) \
763       SET_ATTRIBUTE(N_5, T_5, AN_5) \
764       SET_ATTRIBUTE(N_6, T_6, AN_6) \
765       SET_ATTRIBUTE(N_7, T_7, AN_7) \
766       SET_ATTRIBUTE(N_8, T_8, AN_8) \
767       SET_ATTRIBUTE(N_9, T_9, AN_9) \
768       SET_ATTRIBUTE(N_10, T_10, AN_10) \
769       SET_ATTRIBUTE(N_11, T_11, AN_11) \
770       SET_ATTRIBUTE(N_12, T_12, AN_12) \
771       SET_ATTRIBUTE(N_13, T_13, AN_13) \
772       SET_ATTRIBUTE(N_14, T_14, AN_14) \
773       SET_ATTRIBUTE(N_15, T_15, AN_15) \
774       SET_ATTRIBUTE(N_16, T_16, AN_16) \
775       SET_ATTRIBUTE(N_17, T_17, AN_17) \
776       SET_ATTRIBUTE(N_18, T_18, AN_18) \
777       SET_ATTRIBUTE(N_19, T_19, AN_19) \
778     END_INIT() \
779   public:
780
781 //--------------------------------------------------------------------------------------
782 #define INTERFACE_21(KIND, \
783                      N_0, AN_0, T_0, C_0, \
784                      N_1, AN_1, T_1, C_1, \
785                      N_2, AN_2, T_2, C_2, \
786                      N_3, AN_3, T_3, C_3, \
787                      N_4, AN_4, T_4, C_4, \
788                      N_5, AN_5, T_5, C_5, \
789                      N_6, AN_6, T_6, C_6, \
790                      N_7, AN_7, T_7, C_7, \
791                      N_8, AN_8, T_8, C_8, \
792                      N_9, AN_9, T_9, C_9, \
793                      N_10, AN_10, T_10, C_10, \
794                      N_11, AN_11, T_11, C_11, \
795                      N_12, AN_12, T_12, C_12, \
796                      N_13, AN_13, T_13, C_13, \
797                      N_14, AN_14, T_14, C_14, \
798                      N_15, AN_15, T_15, C_15, \
799                      N_16, AN_16, T_16, C_16, \
800                      N_17, AN_17, T_17, C_17, \
801                      N_18, AN_18, T_18, C_18, \
802                      N_19, AN_19, T_19, C_19, \
803                      N_20, AN_20, T_20, C_20) \
804   public: \
805     INTERFACE_COMMON(KIND) \
806     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
807     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
808     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
809     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
810     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
811     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
812     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
813     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
814     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
815     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
816     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
817     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
818     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
819     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
820     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
821     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
822     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
823     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
824     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
825     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
826     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
827   protected: \
828     START_INIT() \
829       SET_ATTRIBUTE(N_0, T_0, AN_0) \
830       SET_ATTRIBUTE(N_1, T_1, AN_1) \
831       SET_ATTRIBUTE(N_2, T_2, AN_2) \
832       SET_ATTRIBUTE(N_3, T_3, AN_3) \
833       SET_ATTRIBUTE(N_4, T_4, AN_4) \
834       SET_ATTRIBUTE(N_5, T_5, AN_5) \
835       SET_ATTRIBUTE(N_6, T_6, AN_6) \
836       SET_ATTRIBUTE(N_7, T_7, AN_7) \
837       SET_ATTRIBUTE(N_8, T_8, AN_8) \
838       SET_ATTRIBUTE(N_9, T_9, AN_9) \
839       SET_ATTRIBUTE(N_10, T_10, AN_10) \
840       SET_ATTRIBUTE(N_11, T_11, AN_11) \
841       SET_ATTRIBUTE(N_12, T_12, AN_12) \
842       SET_ATTRIBUTE(N_13, T_13, AN_13) \
843       SET_ATTRIBUTE(N_14, T_14, AN_14) \
844       SET_ATTRIBUTE(N_15, T_15, AN_15) \
845       SET_ATTRIBUTE(N_16, T_16, AN_16) \
846       SET_ATTRIBUTE(N_17, T_17, AN_17) \
847       SET_ATTRIBUTE(N_18, T_18, AN_18) \
848       SET_ATTRIBUTE(N_19, T_19, AN_19) \
849       SET_ATTRIBUTE(N_20, T_20, AN_20) \
850     END_INIT() \
851   public:
852
853 //--------------------------------------------------------------------------------------
854 #define INTERFACE_24(KIND, \
855                      N_0, AN_0, T_0, C_0, \
856                      N_1, AN_1, T_1, C_1, \
857                      N_2, AN_2, T_2, C_2, \
858                      N_3, AN_3, T_3, C_3, \
859                      N_4, AN_4, T_4, C_4, \
860                      N_5, AN_5, T_5, C_5, \
861                      N_6, AN_6, T_6, C_6, \
862                      N_7, AN_7, T_7, C_7, \
863                      N_8, AN_8, T_8, C_8, \
864                      N_9, AN_9, T_9, C_9, \
865                      N_10, AN_10, T_10, C_10, \
866                      N_11, AN_11, T_11, C_11, \
867                      N_12, AN_12, T_12, C_12, \
868                      N_13, AN_13, T_13, C_13, \
869                      N_14, AN_14, T_14, C_14, \
870                      N_15, AN_15, T_15, C_15, \
871                      N_16, AN_16, T_16, C_16, \
872                      N_17, AN_17, T_17, C_17, \
873                      N_18, AN_18, T_18, C_18, \
874                      N_19, AN_19, T_19, C_19, \
875                      N_20, AN_20, T_20, C_20, \
876                      N_21, AN_21, T_21, C_21, \
877                      N_22, AN_22, T_22, C_22, \
878                      N_23, AN_23, T_23, C_23) \
879   public: \
880     INTERFACE_COMMON(KIND) \
881     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
882     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
883     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
884     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
885     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
886     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
887     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
888     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
889     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
890     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
891     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
892     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
893     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
894     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
895     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
896     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
897     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
898     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
899     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
900     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
901     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
902     DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
903     DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
904     DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
905   protected: \
906     START_INIT() \
907       SET_ATTRIBUTE(N_0, T_0, AN_0) \
908       SET_ATTRIBUTE(N_1, T_1, AN_1) \
909       SET_ATTRIBUTE(N_2, T_2, AN_2) \
910       SET_ATTRIBUTE(N_3, T_3, AN_3) \
911       SET_ATTRIBUTE(N_4, T_4, AN_4) \
912       SET_ATTRIBUTE(N_5, T_5, AN_5) \
913       SET_ATTRIBUTE(N_6, T_6, AN_6) \
914       SET_ATTRIBUTE(N_7, T_7, AN_7) \
915       SET_ATTRIBUTE(N_8, T_8, AN_8) \
916       SET_ATTRIBUTE(N_9, T_9, AN_9) \
917       SET_ATTRIBUTE(N_10, T_10, AN_10) \
918       SET_ATTRIBUTE(N_11, T_11, AN_11) \
919       SET_ATTRIBUTE(N_12, T_12, AN_12) \
920       SET_ATTRIBUTE(N_13, T_13, AN_13) \
921       SET_ATTRIBUTE(N_14, T_14, AN_14) \
922       SET_ATTRIBUTE(N_15, T_15, AN_15) \
923       SET_ATTRIBUTE(N_16, T_16, AN_16) \
924       SET_ATTRIBUTE(N_17, T_17, AN_17) \
925       SET_ATTRIBUTE(N_18, T_18, AN_18) \
926       SET_ATTRIBUTE(N_19, T_19, AN_19) \
927       SET_ATTRIBUTE(N_20, T_20, AN_20) \
928       SET_ATTRIBUTE(N_21, T_21, AN_21) \
929       SET_ATTRIBUTE(N_22, T_22, AN_22) \
930       SET_ATTRIBUTE(N_23, T_23, AN_23) \
931     END_INIT() \
932   public:
933
934 //--------------------------------------------------------------------------------------
935 #define INTERFACE_25(KIND, \
936                      N_0, AN_0, T_0, C_0, \
937                      N_1, AN_1, T_1, C_1, \
938                      N_2, AN_2, T_2, C_2, \
939                      N_3, AN_3, T_3, C_3, \
940                      N_4, AN_4, T_4, C_4, \
941                      N_5, AN_5, T_5, C_5, \
942                      N_6, AN_6, T_6, C_6, \
943                      N_7, AN_7, T_7, C_7, \
944                      N_8, AN_8, T_8, C_8, \
945                      N_9, AN_9, T_9, C_9, \
946                      N_10, AN_10, T_10, C_10, \
947                      N_11, AN_11, T_11, C_11, \
948                      N_12, AN_12, T_12, C_12, \
949                      N_13, AN_13, T_13, C_13, \
950                      N_14, AN_14, T_14, C_14, \
951                      N_15, AN_15, T_15, C_15, \
952                      N_16, AN_16, T_16, C_16, \
953                      N_17, AN_17, T_17, C_17, \
954                      N_18, AN_18, T_18, C_18, \
955                      N_19, AN_19, T_19, C_19, \
956                      N_20, AN_20, T_20, C_20, \
957                      N_21, AN_21, T_21, C_21, \
958                      N_22, AN_22, T_22, C_22, \
959                      N_23, AN_23, T_23, C_23, \
960                      N_24, AN_24, T_24, C_24) \
961   public: \
962     INTERFACE_COMMON(KIND) \
963     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
964     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
965     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
966     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
967     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
968     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
969     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
970     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
971     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
972     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
973     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
974     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
975     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
976     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
977     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
978     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
979     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
980     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
981     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
982     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
983     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
984     DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
985     DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
986     DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
987     DEFINE_ATTRIBUTE(N_24, T_24, C_24) \
988   protected: \
989     START_INIT() \
990       SET_ATTRIBUTE(N_0, T_0, AN_0) \
991       SET_ATTRIBUTE(N_1, T_1, AN_1) \
992       SET_ATTRIBUTE(N_2, T_2, AN_2) \
993       SET_ATTRIBUTE(N_3, T_3, AN_3) \
994       SET_ATTRIBUTE(N_4, T_4, AN_4) \
995       SET_ATTRIBUTE(N_5, T_5, AN_5) \
996       SET_ATTRIBUTE(N_6, T_6, AN_6) \
997       SET_ATTRIBUTE(N_7, T_7, AN_7) \
998       SET_ATTRIBUTE(N_8, T_8, AN_8) \
999       SET_ATTRIBUTE(N_9, T_9, AN_9) \
1000       SET_ATTRIBUTE(N_10, T_10, AN_10) \
1001       SET_ATTRIBUTE(N_11, T_11, AN_11) \
1002       SET_ATTRIBUTE(N_12, T_12, AN_12) \
1003       SET_ATTRIBUTE(N_13, T_13, AN_13) \
1004       SET_ATTRIBUTE(N_14, T_14, AN_14) \
1005       SET_ATTRIBUTE(N_15, T_15, AN_15) \
1006       SET_ATTRIBUTE(N_16, T_16, AN_16) \
1007       SET_ATTRIBUTE(N_17, T_17, AN_17) \
1008       SET_ATTRIBUTE(N_18, T_18, AN_18) \
1009       SET_ATTRIBUTE(N_19, T_19, AN_19) \
1010       SET_ATTRIBUTE(N_20, T_20, AN_20) \
1011       SET_ATTRIBUTE(N_21, T_21, AN_21) \
1012       SET_ATTRIBUTE(N_22, T_22, AN_22) \
1013       SET_ATTRIBUTE(N_23, T_23, AN_23) \
1014       SET_ATTRIBUTE(N_24, T_24, AN_24) \
1015     END_INIT() \
1016   public:
1017
1018
1019 //--------------------------------------------------------------------------------------
1020 #define INTERFACE_27(KIND, \
1021                      N_0, AN_0, T_0, C_0, \
1022                      N_1, AN_1, T_1, C_1, \
1023                      N_2, AN_2, T_2, C_2, \
1024                      N_3, AN_3, T_3, C_3, \
1025                      N_4, AN_4, T_4, C_4, \
1026                      N_5, AN_5, T_5, C_5, \
1027                      N_6, AN_6, T_6, C_6, \
1028                      N_7, AN_7, T_7, C_7, \
1029                      N_8, AN_8, T_8, C_8, \
1030                      N_9, AN_9, T_9, C_9, \
1031                      N_10, AN_10, T_10, C_10, \
1032                      N_11, AN_11, T_11, C_11, \
1033                      N_12, AN_12, T_12, C_12, \
1034                      N_13, AN_13, T_13, C_13, \
1035                      N_14, AN_14, T_14, C_14, \
1036                      N_15, AN_15, T_15, C_15, \
1037                      N_16, AN_16, T_16, C_16, \
1038                      N_17, AN_17, T_17, C_17, \
1039                      N_18, AN_18, T_18, C_18, \
1040                      N_19, AN_19, T_19, C_19, \
1041                      N_20, AN_20, T_20, C_20, \
1042                      N_21, AN_21, T_21, C_21, \
1043                      N_22, AN_22, T_22, C_22, \
1044                      N_23, AN_23, T_23, C_23, \
1045                      N_24, AN_24, T_24, C_24, \
1046                      N_25, AN_25, T_25, C_25, \
1047                      N_26, AN_26, T_26, C_26) \
1048   public: \
1049     INTERFACE_COMMON(KIND) \
1050     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
1051     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
1052     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
1053     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
1054     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
1055     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
1056     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
1057     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
1058     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
1059     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
1060     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
1061     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
1062     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
1063     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
1064     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
1065     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
1066     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
1067     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
1068     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
1069     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
1070     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
1071     DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
1072     DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
1073     DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
1074     DEFINE_ATTRIBUTE(N_24, T_24, C_24) \
1075     DEFINE_ATTRIBUTE(N_25, T_25, C_25) \
1076     DEFINE_ATTRIBUTE(N_26, T_26, C_26) \
1077   protected: \
1078     START_INIT() \
1079       SET_ATTRIBUTE(N_0, T_0, AN_0) \
1080       SET_ATTRIBUTE(N_1, T_1, AN_1) \
1081       SET_ATTRIBUTE(N_2, T_2, AN_2) \
1082       SET_ATTRIBUTE(N_3, T_3, AN_3) \
1083       SET_ATTRIBUTE(N_4, T_4, AN_4) \
1084       SET_ATTRIBUTE(N_5, T_5, AN_5) \
1085       SET_ATTRIBUTE(N_6, T_6, AN_6) \
1086       SET_ATTRIBUTE(N_7, T_7, AN_7) \
1087       SET_ATTRIBUTE(N_8, T_8, AN_8) \
1088       SET_ATTRIBUTE(N_9, T_9, AN_9) \
1089       SET_ATTRIBUTE(N_10, T_10, AN_10) \
1090       SET_ATTRIBUTE(N_11, T_11, AN_11) \
1091       SET_ATTRIBUTE(N_12, T_12, AN_12) \
1092       SET_ATTRIBUTE(N_13, T_13, AN_13) \
1093       SET_ATTRIBUTE(N_14, T_14, AN_14) \
1094       SET_ATTRIBUTE(N_15, T_15, AN_15) \
1095       SET_ATTRIBUTE(N_16, T_16, AN_16) \
1096       SET_ATTRIBUTE(N_17, T_17, AN_17) \
1097       SET_ATTRIBUTE(N_18, T_18, AN_18) \
1098       SET_ATTRIBUTE(N_19, T_19, AN_19) \
1099       SET_ATTRIBUTE(N_20, T_20, AN_20) \
1100       SET_ATTRIBUTE(N_21, T_21, AN_21) \
1101       SET_ATTRIBUTE(N_22, T_22, AN_22) \
1102       SET_ATTRIBUTE(N_23, T_23, AN_23) \
1103       SET_ATTRIBUTE(N_24, T_24, AN_24) \
1104       SET_ATTRIBUTE(N_25, T_25, AN_25) \
1105       SET_ATTRIBUTE(N_26, T_26, AN_26) \
1106     END_INIT() \
1107   public:
1108
1109 //--------------------------------------------------------------------------------------
1110 #endif /* SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_ */