Salome HOME
Merge remote-tracking branch 'remotes/origin/HighLevelDump'
[modules/shaper.git] / src / ModelHighAPI / ModelHighAPI_Macro.h
1 // Name   : ModelHighAPI_Macro.h
2 // Purpose:
3 //
4 // History:
5 // 27/05/16 - Sergey POKHODENKO - Creation of the file
6
7 #ifndef SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
8 #define SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_
9
10 //--------------------------------------------------------------------------------------
11 #include <GeomDataAPI_Dir.h>
12 #include <GeomDataAPI_Point.h>
13 #include <GeomDataAPI_Point2D.h>
14 //--------------------------------------------------------------------------------------
15 #include <ModelAPI_AttributeBoolean.h>
16 #include <ModelAPI_AttributeDocRef.h>
17 #include <ModelAPI_AttributeDouble.h>
18 #include <ModelAPI_AttributeIntArray.h>
19 #include <ModelAPI_AttributeInteger.h>
20 #include <ModelAPI_AttributeRefAttr.h>
21 #include <ModelAPI_AttributeRefAttrList.h>
22 #include <ModelAPI_AttributeReference.h>
23 #include <ModelAPI_AttributeRefList.h>
24 #include <ModelAPI_AttributeSelection.h>
25 #include <ModelAPI_AttributeSelectionList.h>
26 #include <ModelAPI_AttributeString.h>
27 #include <ModelAPI_Feature.h>
28
29 //--------------------------------------------------------------------------------------
30 #define VAR_NAME(NAME) my##NAME
31
32 //--------------------------------------------------------------------------------------
33 #define TO_STRING_(NAME) #NAME
34 #define TO_STRING(NAME) TO_STRING_(NAME)
35
36 //--------------------------------------------------------------------------------------
37 // Used in INTERFACE_N for create variable and getter
38 #define DEFINE_ATTRIBUTE(NAME, TYPE, COMMENT) \
39     COMMENT \
40     std::shared_ptr<TYPE> NAME() const { return VAR_NAME(NAME); } \
41   protected: \
42     std::shared_ptr<TYPE> VAR_NAME(NAME); \
43   public:
44
45 //--------------------------------------------------------------------------------------
46 // Used in INTERFACE_N inside START_INIT/END_INIT for set variable with attribute received from feature
47 #define SET_ATTRIBUTE(NAME, TYPE, ATT_NAME) \
48   VAR_NAME(NAME) = std::dynamic_pointer_cast<TYPE>(feature()->attribute(ATT_NAME)); \
49   if (!VAR_NAME(NAME)) \
50     return false; \
51   myAttrGetter[ATT_NAME] = TO_STRING(NAME);
52
53 //--------------------------------------------------------------------------------------
54 #define INTERFACE_COMMON(KIND) \
55   static std::string ID() { return KIND; }\
56   virtual std::string getID() { return ID(); }
57
58 //--------------------------------------------------------------------------------------
59 #define START_INIT() \
60   bool initialize() { \
61     if (!feature()) { \
62       throwException(ID() + " exception: The feature is NULL."); \
63       return false; \
64     } \
65     if (getKind() != getID()) { \
66       throwException(ID() + " exception: Wrong feature kind."); \
67       return false; \
68     }
69
70 //--------------------------------------------------------------------------------------
71 #define END_INIT() \
72     return true; \
73   }
74
75 //--------------------------------------------------------------------------------------
76 #define INTERFACE_0(KIND) \
77   public: \
78     INTERFACE_COMMON(KIND) \
79   protected: \
80     START_INIT() \
81     END_INIT() \
82   public:
83
84 //--------------------------------------------------------------------------------------
85 #define INTERFACE_1(KIND, \
86                     N_0, AN_0, T_0, C_0) \
87   public: \
88     INTERFACE_COMMON(KIND) \
89     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
90   protected: \
91     START_INIT() \
92       SET_ATTRIBUTE(N_0, T_0, AN_0) \
93     END_INIT() \
94   public:
95
96 //--------------------------------------------------------------------------------------
97 #define INTERFACE_2(KIND, \
98                     N_0, AN_0, T_0, C_0, \
99                     N_1, AN_1, T_1, C_1) \
100   public: \
101     INTERFACE_COMMON(KIND) \
102     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
103     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
104   protected: \
105     START_INIT() \
106       SET_ATTRIBUTE(N_0, T_0, AN_0) \
107       SET_ATTRIBUTE(N_1, T_1, AN_1) \
108     END_INIT() \
109   public:
110
111 //--------------------------------------------------------------------------------------
112 #define INTERFACE_3(KIND, \
113                     N_0, AN_0, T_0, C_0, \
114                     N_1, AN_1, T_1, C_1, \
115                     N_2, AN_2, T_2, C_2) \
116   public: \
117     INTERFACE_COMMON(KIND) \
118     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
119     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
120     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
121   protected: \
122     START_INIT() \
123       SET_ATTRIBUTE(N_0, T_0, AN_0) \
124       SET_ATTRIBUTE(N_1, T_1, AN_1) \
125       SET_ATTRIBUTE(N_2, T_2, AN_2) \
126     END_INIT() \
127   public:
128
129 //--------------------------------------------------------------------------------------
130 #define INTERFACE_4(KIND, \
131                     N_0, AN_0, T_0, C_0, \
132                     N_1, AN_1, T_1, C_1, \
133                     N_2, AN_2, T_2, C_2, \
134                     N_3, AN_3, T_3, C_3) \
135   public: \
136     INTERFACE_COMMON(KIND) \
137     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
138     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
139     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
140     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
141   protected: \
142     START_INIT() \
143       SET_ATTRIBUTE(N_0, T_0, AN_0) \
144       SET_ATTRIBUTE(N_1, T_1, AN_1) \
145       SET_ATTRIBUTE(N_2, T_2, AN_2) \
146       SET_ATTRIBUTE(N_3, T_3, AN_3) \
147     END_INIT() \
148   public:
149
150 //--------------------------------------------------------------------------------------
151 #define INTERFACE_5(KIND, \
152                     N_0, AN_0, T_0, C_0, \
153                     N_1, AN_1, T_1, C_1, \
154                     N_2, AN_2, T_2, C_2, \
155                     N_3, AN_3, T_3, C_3, \
156                     N_4, AN_4, T_4, C_4) \
157   public: \
158     INTERFACE_COMMON(KIND) \
159     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
160     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
161     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
162     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
163     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
164   protected: \
165     START_INIT() \
166       SET_ATTRIBUTE(N_0, T_0, AN_0) \
167       SET_ATTRIBUTE(N_1, T_1, AN_1) \
168       SET_ATTRIBUTE(N_2, T_2, AN_2) \
169       SET_ATTRIBUTE(N_3, T_3, AN_3) \
170       SET_ATTRIBUTE(N_4, T_4, AN_4) \
171     END_INIT() \
172   public:
173
174 //--------------------------------------------------------------------------------------
175 #define INTERFACE_6(KIND, \
176                     N_0, AN_0, T_0, C_0, \
177                     N_1, AN_1, T_1, C_1, \
178                     N_2, AN_2, T_2, C_2, \
179                     N_3, AN_3, T_3, C_3, \
180                     N_4, AN_4, T_4, C_4, \
181                     N_5, AN_5, T_5, C_5) \
182   public: \
183     INTERFACE_COMMON(KIND) \
184     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
185     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
186     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
187     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
188     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
189     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
190   protected: \
191     START_INIT() \
192       SET_ATTRIBUTE(N_0, T_0, AN_0) \
193       SET_ATTRIBUTE(N_1, T_1, AN_1) \
194       SET_ATTRIBUTE(N_2, T_2, AN_2) \
195       SET_ATTRIBUTE(N_3, T_3, AN_3) \
196       SET_ATTRIBUTE(N_4, T_4, AN_4) \
197       SET_ATTRIBUTE(N_5, T_5, AN_5) \
198     END_INIT() \
199   public:
200
201 //--------------------------------------------------------------------------------------
202 #define INTERFACE_7(KIND, \
203                     N_0, AN_0, T_0, C_0, \
204                     N_1, AN_1, T_1, C_1, \
205                     N_2, AN_2, T_2, C_2, \
206                     N_3, AN_3, T_3, C_3, \
207                     N_4, AN_4, T_4, C_4, \
208                     N_5, AN_5, T_5, C_5, \
209                     N_6, AN_6, T_6, C_6) \
210   public: \
211     INTERFACE_COMMON(KIND) \
212     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
213     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
214     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
215     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
216     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
217     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
218     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
219   protected: \
220     START_INIT() \
221       SET_ATTRIBUTE(N_0, T_0, AN_0) \
222       SET_ATTRIBUTE(N_1, T_1, AN_1) \
223       SET_ATTRIBUTE(N_2, T_2, AN_2) \
224       SET_ATTRIBUTE(N_3, T_3, AN_3) \
225       SET_ATTRIBUTE(N_4, T_4, AN_4) \
226       SET_ATTRIBUTE(N_5, T_5, AN_5) \
227       SET_ATTRIBUTE(N_6, T_6, AN_6) \
228     END_INIT() \
229   public:
230
231 //--------------------------------------------------------------------------------------
232 #define INTERFACE_8(KIND, \
233                     N_0, AN_0, T_0, C_0, \
234                     N_1, AN_1, T_1, C_1, \
235                     N_2, AN_2, T_2, C_2, \
236                     N_3, AN_3, T_3, C_3, \
237                     N_4, AN_4, T_4, C_4, \
238                     N_5, AN_5, T_5, C_5, \
239                     N_6, AN_6, T_6, C_6, \
240                     N_7, AN_7, T_7, C_7) \
241   public: \
242     INTERFACE_COMMON(KIND) \
243     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
244     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
245     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
246     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
247     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
248     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
249     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
250     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
251   protected: \
252     START_INIT() \
253       SET_ATTRIBUTE(N_0, T_0, AN_0) \
254       SET_ATTRIBUTE(N_1, T_1, AN_1) \
255       SET_ATTRIBUTE(N_2, T_2, AN_2) \
256       SET_ATTRIBUTE(N_3, T_3, AN_3) \
257       SET_ATTRIBUTE(N_4, T_4, AN_4) \
258       SET_ATTRIBUTE(N_5, T_5, AN_5) \
259       SET_ATTRIBUTE(N_6, T_6, AN_6) \
260       SET_ATTRIBUTE(N_7, T_7, AN_7) \
261     END_INIT() \
262   public:
263
264 //--------------------------------------------------------------------------------------
265 #define INTERFACE_9(KIND, \
266                     N_0, AN_0, T_0, C_0, \
267                     N_1, AN_1, T_1, C_1, \
268                     N_2, AN_2, T_2, C_2, \
269                     N_3, AN_3, T_3, C_3, \
270                     N_4, AN_4, T_4, C_4, \
271                     N_5, AN_5, T_5, C_5, \
272                     N_6, AN_6, T_6, C_6, \
273                     N_7, AN_7, T_7, C_7, \
274                     N_8, AN_8, T_8, C_8) \
275   public: \
276     INTERFACE_COMMON(KIND) \
277     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
278     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
279     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
280     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
281     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
282     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
283     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
284     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
285     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
286   protected: \
287     START_INIT() \
288       SET_ATTRIBUTE(N_0, T_0, AN_0) \
289       SET_ATTRIBUTE(N_1, T_1, AN_1) \
290       SET_ATTRIBUTE(N_2, T_2, AN_2) \
291       SET_ATTRIBUTE(N_3, T_3, AN_3) \
292       SET_ATTRIBUTE(N_4, T_4, AN_4) \
293       SET_ATTRIBUTE(N_5, T_5, AN_5) \
294       SET_ATTRIBUTE(N_6, T_6, AN_6) \
295       SET_ATTRIBUTE(N_7, T_7, AN_7) \
296       SET_ATTRIBUTE(N_8, T_8, AN_8) \
297     END_INIT() \
298   public:
299
300 //--------------------------------------------------------------------------------------
301 #define INTERFACE_10(KIND, \
302                      N_0, AN_0, T_0, C_0, \
303                      N_1, AN_1, T_1, C_1, \
304                      N_2, AN_2, T_2, C_2, \
305                      N_3, AN_3, T_3, C_3, \
306                      N_4, AN_4, T_4, C_4, \
307                      N_5, AN_5, T_5, C_5, \
308                      N_6, AN_6, T_6, C_6, \
309                      N_7, AN_7, T_7, C_7, \
310                      N_8, AN_8, T_8, C_8, \
311                      N_9, AN_9, T_9, C_9) \
312   public: \
313     INTERFACE_COMMON(KIND) \
314     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
315     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
316     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
317     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
318     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
319     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
320     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
321     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
322     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
323     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
324   protected: \
325     START_INIT() \
326       SET_ATTRIBUTE(N_0, T_0, AN_0) \
327       SET_ATTRIBUTE(N_1, T_1, AN_1) \
328       SET_ATTRIBUTE(N_2, T_2, AN_2) \
329       SET_ATTRIBUTE(N_3, T_3, AN_3) \
330       SET_ATTRIBUTE(N_4, T_4, AN_4) \
331       SET_ATTRIBUTE(N_5, T_5, AN_5) \
332       SET_ATTRIBUTE(N_6, T_6, AN_6) \
333       SET_ATTRIBUTE(N_7, T_7, AN_7) \
334       SET_ATTRIBUTE(N_8, T_8, AN_8) \
335       SET_ATTRIBUTE(N_9, T_9, AN_9) \
336     END_INIT() \
337   public:
338
339 //--------------------------------------------------------------------------------------
340 #define INTERFACE_11(KIND, \
341                      N_0, AN_0, T_0, C_0, \
342                      N_1, AN_1, T_1, C_1, \
343                      N_2, AN_2, T_2, C_2, \
344                      N_3, AN_3, T_3, C_3, \
345                      N_4, AN_4, T_4, C_4, \
346                      N_5, AN_5, T_5, C_5, \
347                      N_6, AN_6, T_6, C_6, \
348                      N_7, AN_7, T_7, C_7, \
349                      N_8, AN_8, T_8, C_8, \
350                      N_9, AN_9, T_9, C_9, \
351                      N_10, AN_10, T_10, C_10) \
352   public: \
353     INTERFACE_COMMON(KIND) \
354     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
355     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
356     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
357     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
358     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
359     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
360     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
361     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
362     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
363     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
364     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
365   protected: \
366     START_INIT() \
367       SET_ATTRIBUTE(N_0, T_0, AN_0) \
368       SET_ATTRIBUTE(N_1, T_1, AN_1) \
369       SET_ATTRIBUTE(N_2, T_2, AN_2) \
370       SET_ATTRIBUTE(N_3, T_3, AN_3) \
371       SET_ATTRIBUTE(N_4, T_4, AN_4) \
372       SET_ATTRIBUTE(N_5, T_5, AN_5) \
373       SET_ATTRIBUTE(N_6, T_6, AN_6) \
374       SET_ATTRIBUTE(N_7, T_7, AN_7) \
375       SET_ATTRIBUTE(N_8, T_8, AN_8) \
376       SET_ATTRIBUTE(N_9, T_9, AN_9) \
377       SET_ATTRIBUTE(N_10, T_10, AN_10) \
378     END_INIT() \
379   public:
380
381 //--------------------------------------------------------------------------------------
382 #define INTERFACE_14(KIND, \
383                      N_0, AN_0, T_0, C_0, \
384                      N_1, AN_1, T_1, C_1, \
385                      N_2, AN_2, T_2, C_2, \
386                      N_3, AN_3, T_3, C_3, \
387                      N_4, AN_4, T_4, C_4, \
388                      N_5, AN_5, T_5, C_5, \
389                      N_6, AN_6, T_6, C_6, \
390                      N_7, AN_7, T_7, C_7, \
391                      N_8, AN_8, T_8, C_8, \
392                      N_9, AN_9, T_9, C_9, \
393                      N_10, AN_10, T_10, C_10, \
394                      N_11, AN_11, T_11, C_11, \
395                      N_12, AN_12, T_12, C_12, \
396                      N_13, AN_13, T_13, C_13) \
397   public: \
398     INTERFACE_COMMON(KIND) \
399     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
400     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
401     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
402     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
403     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
404     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
405     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
406     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
407     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
408     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
409     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
410     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
411     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
412     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
413   protected: \
414     START_INIT() \
415       SET_ATTRIBUTE(N_0, T_0, AN_0) \
416       SET_ATTRIBUTE(N_1, T_1, AN_1) \
417       SET_ATTRIBUTE(N_2, T_2, AN_2) \
418       SET_ATTRIBUTE(N_3, T_3, AN_3) \
419       SET_ATTRIBUTE(N_4, T_4, AN_4) \
420       SET_ATTRIBUTE(N_5, T_5, AN_5) \
421       SET_ATTRIBUTE(N_6, T_6, AN_6) \
422       SET_ATTRIBUTE(N_7, T_7, AN_7) \
423       SET_ATTRIBUTE(N_8, T_8, AN_8) \
424       SET_ATTRIBUTE(N_9, T_9, AN_9) \
425       SET_ATTRIBUTE(N_10, T_10, AN_10) \
426       SET_ATTRIBUTE(N_11, T_11, AN_11) \
427       SET_ATTRIBUTE(N_12, T_12, AN_12) \
428       SET_ATTRIBUTE(N_13, T_13, AN_13) \
429     END_INIT() \
430   public:
431
432 //--------------------------------------------------------------------------------------
433 #define INTERFACE_20(KIND, \
434                      N_0, AN_0, T_0, C_0, \
435                      N_1, AN_1, T_1, C_1, \
436                      N_2, AN_2, T_2, C_2, \
437                      N_3, AN_3, T_3, C_3, \
438                      N_4, AN_4, T_4, C_4, \
439                      N_5, AN_5, T_5, C_5, \
440                      N_6, AN_6, T_6, C_6, \
441                      N_7, AN_7, T_7, C_7, \
442                      N_8, AN_8, T_8, C_8, \
443                      N_9, AN_9, T_9, C_9, \
444                      N_10, AN_10, T_10, C_10, \
445                      N_11, AN_11, T_11, C_11, \
446                      N_12, AN_12, T_12, C_12, \
447                      N_13, AN_13, T_13, C_13, \
448                      N_14, AN_14, T_14, C_14, \
449                      N_15, AN_15, T_15, C_15, \
450                      N_16, AN_16, T_16, C_16, \
451                      N_17, AN_17, T_17, C_17, \
452                      N_18, AN_18, T_18, C_18, \
453                      N_19, AN_19, T_19, C_19) \
454   public: \
455     INTERFACE_COMMON(KIND) \
456     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
457     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
458     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
459     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
460     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
461     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
462     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
463     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
464     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
465     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
466     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
467     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
468     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
469     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
470     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
471     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
472     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
473     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
474     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
475     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
476   protected: \
477     START_INIT() \
478       SET_ATTRIBUTE(N_0, T_0, AN_0) \
479       SET_ATTRIBUTE(N_1, T_1, AN_1) \
480       SET_ATTRIBUTE(N_2, T_2, AN_2) \
481       SET_ATTRIBUTE(N_3, T_3, AN_3) \
482       SET_ATTRIBUTE(N_4, T_4, AN_4) \
483       SET_ATTRIBUTE(N_5, T_5, AN_5) \
484       SET_ATTRIBUTE(N_6, T_6, AN_6) \
485       SET_ATTRIBUTE(N_7, T_7, AN_7) \
486       SET_ATTRIBUTE(N_8, T_8, AN_8) \
487       SET_ATTRIBUTE(N_9, T_9, AN_9) \
488       SET_ATTRIBUTE(N_10, T_10, AN_10) \
489       SET_ATTRIBUTE(N_11, T_11, AN_11) \
490       SET_ATTRIBUTE(N_12, T_12, AN_12) \
491       SET_ATTRIBUTE(N_13, T_13, AN_13) \
492       SET_ATTRIBUTE(N_14, T_14, AN_14) \
493       SET_ATTRIBUTE(N_15, T_15, AN_15) \
494       SET_ATTRIBUTE(N_16, T_16, AN_16) \
495       SET_ATTRIBUTE(N_17, T_17, AN_17) \
496       SET_ATTRIBUTE(N_18, T_18, AN_18) \
497       SET_ATTRIBUTE(N_19, T_19, AN_19) \
498     END_INIT() \
499   public:
500
501 //--------------------------------------------------------------------------------------
502 #define INTERFACE_21(KIND, \
503                      N_0, AN_0, T_0, C_0, \
504                      N_1, AN_1, T_1, C_1, \
505                      N_2, AN_2, T_2, C_2, \
506                      N_3, AN_3, T_3, C_3, \
507                      N_4, AN_4, T_4, C_4, \
508                      N_5, AN_5, T_5, C_5, \
509                      N_6, AN_6, T_6, C_6, \
510                      N_7, AN_7, T_7, C_7, \
511                      N_8, AN_8, T_8, C_8, \
512                      N_9, AN_9, T_9, C_9, \
513                      N_10, AN_10, T_10, C_10, \
514                      N_11, AN_11, T_11, C_11, \
515                      N_12, AN_12, T_12, C_12, \
516                      N_13, AN_13, T_13, C_13, \
517                      N_14, AN_14, T_14, C_14, \
518                      N_15, AN_15, T_15, C_15, \
519                      N_16, AN_16, T_16, C_16, \
520                      N_17, AN_17, T_17, C_17, \
521                      N_18, AN_18, T_18, C_18, \
522                      N_19, AN_19, T_19, C_19, \
523                      N_20, AN_20, T_20, C_20) \
524   public: \
525     INTERFACE_COMMON(KIND) \
526     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
527     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
528     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
529     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
530     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
531     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
532     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
533     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
534     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
535     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
536     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
537     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
538     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
539     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
540     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
541     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
542     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
543     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
544     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
545     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
546     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
547   protected: \
548     START_INIT() \
549       SET_ATTRIBUTE(N_0, T_0, AN_0) \
550       SET_ATTRIBUTE(N_1, T_1, AN_1) \
551       SET_ATTRIBUTE(N_2, T_2, AN_2) \
552       SET_ATTRIBUTE(N_3, T_3, AN_3) \
553       SET_ATTRIBUTE(N_4, T_4, AN_4) \
554       SET_ATTRIBUTE(N_5, T_5, AN_5) \
555       SET_ATTRIBUTE(N_6, T_6, AN_6) \
556       SET_ATTRIBUTE(N_7, T_7, AN_7) \
557       SET_ATTRIBUTE(N_8, T_8, AN_8) \
558       SET_ATTRIBUTE(N_9, T_9, AN_9) \
559       SET_ATTRIBUTE(N_10, T_10, AN_10) \
560       SET_ATTRIBUTE(N_11, T_11, AN_11) \
561       SET_ATTRIBUTE(N_12, T_12, AN_12) \
562       SET_ATTRIBUTE(N_13, T_13, AN_13) \
563       SET_ATTRIBUTE(N_14, T_14, AN_14) \
564       SET_ATTRIBUTE(N_15, T_15, AN_15) \
565       SET_ATTRIBUTE(N_16, T_16, AN_16) \
566       SET_ATTRIBUTE(N_17, T_17, AN_17) \
567       SET_ATTRIBUTE(N_18, T_18, AN_18) \
568       SET_ATTRIBUTE(N_19, T_19, AN_19) \
569       SET_ATTRIBUTE(N_20, T_20, AN_20) \
570     END_INIT() \
571   public:
572
573 //--------------------------------------------------------------------------------------
574 #endif /* SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_ */