INF.H
[目次 | 型・クラス・構造体 | マクロ]
- 1. インターフェイス (Inf)
- 2. [Inf 優先ヘッダ, Inf_FinishFunc]
- 3. エラーコード
- 4. ◆インターフェイス
- 5. [Inf_init] インターフェイス・ポインタの初期化
- 6. [INF_TYPEDEF] インターフェイス型宣言
- 7. [INF_MACRO_0, INF_MACRO_1] インターフェイス・マクロの定義
- 8. [INF_MACRO_2, INF_MACRO_3, INF_MACRO_4, INF_MACRO_5]
- 9. [INF_MACRO_6, INF_MACRO_7]
- 10. [INF_FUNC_0, INF_FUNC_1] インターフェイス関数の定義
- 11. [INF_FUNC_2, INF_FUNC_3, INF_FUNC_4, INF_FUNC_5]
- 12. [INF_FUNC_6, INF_FUNC_7]
- 13. [INF_FUNC_R0, INF_FUNC_R1, INF_FUNC_R2, INF_FUNC_R3]
- 14. [INF_FUNC_R4, INF_FUNC_R5, INF_FUNC_R6, INF_FUNC_R7]
- 15. [INF_FUNC_SR0, INF_FUNC_SR1, INF_FUNC_SR2, INF_FUNC_SR3]
- 16. [INF_FUNC_SR4, INF_FUNC_SR5, INF_FUNC_SR6, INF_FUNC_SR7]
- 17. [INF_FUNC_PR0, INF_FUNC_PR1, INF_FUNC_PR2, INF_FUNC_PR3]
- 18. [INF_FUNC_PR4, INF_FUNC_PR5, INF_FUNC_PR6, INF_FUNC_PR7]
- 19. ◆インプリメント・クラス
- 20. [INF_SUB_FUNC_START] インプリメント・クラスの関数定義の開始
- 21. [INF_SUB_FUNC_END] インプリメント・クラスの関数定義の終了
- 22. [INF_SUB_FUNC_OVERRIDE] 関連を継承する
- 23. [INF_SUB_FUNC_NULL] インターフェイスと関数を関連付けしない
- 24. [INF_SUB_FUNC_0] インターフェイスと関数の関連の記述(引数が0個の関数)
- 25. [INF_SUB_FUNC_1, INF_SUB_FUNC_2, INF_SUB_FUNC_3]
- 26. [INF_SUB_FUNC_4, INF_SUB_FUNC_5, INF_SUB_FUNC_6, INF_SUB_FUNC_7]
- 27. [INF_SUB_FUNC_R0, INF_SUB_FUNC_R1, INF_SUB_FUNC_R2, INF_SUB_FUNC_R3]
- 28. [INF_SUB_FUNC_R4, INF_SUB_FUNC_R5, INF_SUB_FUNC_R6, INF_SUB_FUNC_R7]
- 29. [INF_SUB_FUNC_SR0, INF_SUB_FUNC_SR1, INF_SUB_FUNC_SR2, INF_SUB_FUNC_SR3]
- 30. [INF_SUB_FUNC_SR4, INF_SUB_FUNC_SR5, INF_SUB_FUNC_SR6, INF_SUB_FUNC_SR7]
- 31. [INF_SUB_FUNC_PR0, INF_SUB_FUNC_PR1, INF_SUB_FUNC_PR2, INF_SUB_FUNC_PR3]
- 32. [INF_SUB_FUNC_PR4, INF_SUB_FUNC_PR5, INF_SUB_FUNC_PR6, INF_SUB_FUNC_PR7]
- 33. [INF_SUB_PACFUNC1] Inf_Pac を返す関数の定義
- 34. [INF_SUB_PACFUNC2] [INF_SUB_PACFUNC3] [INF_SUB_PACFUNC4]
- 35. [INF_SUB_PACFUNC4] [INF_SUB_PACFUNC6] [INF_SUB_PACFUNC7]
- 36. ◆メソッド・ポインタ
- 37. [Inf_Mp] メソッド・ポインタ
1|/**************************************************************************
2|* 1. <<< インターフェイス (Inf) >>>
3|***************************************************************************/
4|
5|#ifndef __INF_H
6|#define __INF_H
7|
8|/*----------------------------------------------------------------------
9|[Module Property]
10|name = Inf
11|title = インターフェイス
12|category = 基本型
13|src =
14|depend =
15|priority =
16|accord =
17|----------------------------------------------------------------------*/
18|
19|
20|
21|/*************************************************************************
22|* 2. <<< [Inf 優先ヘッダ, Inf_FinishFunc] >>>
23|**************************************************************************/
24|#ifndef USES_PRIORITY_HEADER
25|/*[START_OF_PRIORITY_HEADER]*/
26|
27|#ifndef USES_INF
28|#define USES_INF
29|
30|#define INF_TYPEDEF( _Inf, Inf ) \
31| \
32| typedef struct _Inf##_Sc Inf##_Sc; \
33| \
34| typedef struct _Inf { \
35| Inf##_Sc* sc; /* スキーマのアドレス */ \
36| void* obj; /* オブジェクトのアドレス */ \
37| } Inf; \
38| typedef struct _Inf##_Pac { \
39| Inf##_Sc* sc; /* スキーマのアドレス */ \
40| void* param; /* サブクラス・パラメータのアドレス */ \
41| } Inf##_Pac
42|
43|typedef void (*Inf_FinishFunc)( void* );
44|
45|typedef struct _Inf_Mp Inf_Mp;
46|
47|#endif
48|
49|/*[END_OF_PRIORITY_HEADER]*/
50|#endif
51|
52|
53|/*************************************************************************
54|* 3. <<< エラーコード >>>
55|**************************************************************************/
56|#define Inf_Err_WrongNumOfParam 5419
57|
58|/*-------------------------------------------------------------------*/
59|/* 4. <<< ◆インターフェイス >>> */
60|/*-------------------------------------------------------------------*/
61|
62|
63|/***********************************************************************
64|* 5. <<< [Inf_init] インターフェイス・ポインタの初期化 >>>
65|*【補足】
66|*・void Inf_init( Inf*, void* obj, void* sc );
67|*・本関数のみ、Inf 型の「ポインタ」を引数に取ります。
68|************************************************************************/
69|#define Inf_init( this, _obj, _sc ) \
70| ( (this)->obj = (_obj), (this)->sc = (_sc) )
71|
72|
73|/***********************************************************************
74|* 6. <<< [INF_TYPEDEF] インターフェイス型宣言 >>>
75|*【引数】
76|* ・_Inf; 内部構造体のタグ
77|* ・Inf; インターフェイスの型名
78|*【補足】
79|*・グローバル領域に INF_TYPEDEF( _Inf, Inf ); のように宣言することで、
80|* Inf 型のインターフェイス(ポインタ)を宣言できます。
81|*・実装は、Inf 優先ヘッダにあります。
82|*・インターフェイス・スキーマは、別途宣言する必要があります。
83|* ドキュメントの「インターフェイスのサンプル」を参考。
84|************************************************************************/
85|
86|/***********************************************************************
87|* 7. <<< [INF_MACRO_0, INF_MACRO_1] インターフェイス・マクロの定義 >>>
88|* 8. <<< [INF_MACRO_2, INF_MACRO_3, INF_MACRO_4, INF_MACRO_5] >>>
89|* 9. <<< [INF_MACRO_6, INF_MACRO_7] >>>
90|*【引数】
91|* ・Inf; インターフェイスの型名
92|* ・method; 内部関数ポインタ名
93|* ・type; 返り値の型
94|* ・func; メンバ関数名
95|* ・thisT; 引数の型
96|* ・argtX; 引数の型
97|* ・t,a,b..; 引数(引数名は t,a,b... をそのまま指定します)
98|*【補足】
99|*・インターフェイスのヘッダファイルのグローバル領域の #define 文の中に書きます。
100|* ただし、引数は、t から始まり、a,b,c,d,... と続けてください。★
101|*・INF_FUNC_0 などと同じ機能なので、マクロで条件分岐するなどして、
102|* どちらかのみ使用します。
103|*・マクロ版には、引数(アドレス)のエラーチェックがありません。
104|*・上記の Inf_Sample を参照
105|*【例】
106|* #ifdef NDEBUG
107|* #define InfType_method1(t) INF_MACRO_0( InfType, method1, int, InfType_method1, InfType,t )
108|* #define InfType_method2(t,a,b) INF_MACRO_2( InfType, method2, void, InfType_method2, InfType, int, char*,t,a,b )
109|* #define InfType_method3(t,a) INF_MACRO_1( InfType, method2, void, InfType_method3, InfType, int,t,a )
110|* #endif
111|************************************************************************/
112|#define INF_MACRO_R0 INF_MACRO_0
113|#define INF_MACRO_0( Inf, method, type, func, thisT,t ) \
114| ((Inf##_Sc*)(t).sc)->method( (t).obj )
115|#define INF_MACRO_SR0( Inf, method, type, func, thisScT, t ) \
116| ((t)->method( t )) \
117|
118|#define INF_MACRO_R1 INF_MACRO_1
119|#define INF_MACRO_1( Inf, method, type, func, thist, argt1,t,a ) \
120| ((Inf##_Sc*)(t).sc)->method( (t).obj, a )
121|#define INF_MACRO_SR1( Inf, method, type, func, thisScT, arg1T, t,a ) \
122| ((t)->method(t, a))
123|#define INF_MACRO_PR1( Inf, method, type, func, thisScT, arg1T, t,a ) \
124| ((t).sc->method( t,a ))
125|
126|#define INF_MACRO_R2 INF_MACRO_2
127|#define INF_MACRO_2( Inf, method, type, func, thist, argt1, argt2,t,a,b ) \
128| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b )
129|#define INF_MACRO_SR2( Inf, method, type, func, thisScT, arg1T, arg2T, t,a,b ) \
130| ((t)->method(t, a,b))
131|#define INF_MACRO_PR2( Inf, method, type, func, thisScT, arg1T, arg2T, t,a,b ) \
132| ((t).sc->method( t,a,b ))
133|
134|#define INF_MACRO_R3 INF_MACRO_3
135|#define INF_MACRO_3( Inf, method, type, func, thist, argt1, argt2, argt3,t,a,b,c ) \
136| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b, c )
137|#define INF_MACRO_SR3( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, t,a,b,c ) \
138| ((t)->method(t, a,b,c))
139|#define INF_MACRO_PR3( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, t,a,b,c ) \
140| ((t).sc->method( t,a,b,c ))
141|
142|#define INF_MACRO_R4 INF_MACRO_4
143|#define INF_MACRO_4( Inf, method, type, func, thist, argt1, argt2, argt3, argt4,t,a,b,c,d ) \
144| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b, c, d )
145|#define INF_MACRO_SR4( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, t,a,b,c,d ) \
146| ((t)->method(t, a,b,c,d))
147|#define INF_MACRO_PR4( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, t,a,b,c,d ) \
148| ((t).sc->method( t,a,b,c,d ))
149|
150|#define INF_MACRO_R5 INF_MACRO_5
151|#define INF_MACRO_5( Inf, method, type, func, thist, argt1, argt2, argt3, argt4, argt5,t,a,b,c,d,e ) \
152| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b, c, d, e )
153|#define INF_MACRO_SR5( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, t,a,b,c,d,e ) \
154| ((t)->method(t, a,b,c,d,e))
155|#define INF_MACRO_PR5( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, t,a,b,c,d,e ) \
156| ((t).sc->method( t,a,b,c,d,e ))
157|
158|#define INF_MACRO_R6 INF_MACRO_6
159|#define INF_MACRO_6( Inf, method, type, func, thist, argt1, argt2, argt3, argt4, argt5, arg6, t,a,b,c,d,e,f ) \
160| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b, c, d, e, f )
161|#define INF_MACRO_SR6( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, t,a,b,c,d,e,f ) \
162| ((t)->method(t, a,b,c,d,e,f))
163|#define INF_MACRO_PR6( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, t,a,b,c,d,e,f ) \
164| ((t).sc->method( t,a,b,c,d,e,f ))
165|
166|#define INF_MACRO_R7 INF_MACRO_7
167|#define INF_MACRO_7( Inf, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, argT6, argT7, t,a,b,c,d,e,f,g ) \
168| ((Inf##_Sc*)(t).sc)->method( (t).obj, a, b, c, d, e, f, g )
169|#define INF_MACRO_SR7( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, arg7T, t,a,b,c,d,e,f,g ) \
170| ((t)->method(t, a,b,c,d,e,f,g))
171|#define INF_MACRO_PR7( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, arg7T, t,a,b,c,d,e,f,g ) \
172| ((t).sc->method( t,a,b,c,d,e,f,g ))
173|
174|
175|
176|/***********************************************************************
177|* 10. <<< [INF_FUNC_0, INF_FUNC_1] インターフェイス関数の定義 >>>
178|* 11. <<< [INF_FUNC_2, INF_FUNC_3, INF_FUNC_4, INF_FUNC_5] >>>
179|* 12. <<< [INF_FUNC_6, INF_FUNC_7] >>>
180|* 13. <<< [INF_FUNC_R0, INF_FUNC_R1, INF_FUNC_R2, INF_FUNC_R3] >>>
181|* 14. <<< [INF_FUNC_R4, INF_FUNC_R5, INF_FUNC_R6, INF_FUNC_R7] >>>
182|* 15. <<< [INF_FUNC_SR0, INF_FUNC_SR1, INF_FUNC_SR2, INF_FUNC_SR3] >>>
183|* 16. <<< [INF_FUNC_SR4, INF_FUNC_SR5, INF_FUNC_SR6, INF_FUNC_SR7] >>>
184|* 17. <<< [INF_FUNC_PR0, INF_FUNC_PR1, INF_FUNC_PR2, INF_FUNC_PR3] >>>
185|* 18. <<< [INF_FUNC_PR4, INF_FUNC_PR5, INF_FUNC_PR6, INF_FUNC_PR7] >>>
186|*【引数】
187|* ・Inf; インターフェイスの型名
188|* ・method; 内部関数ポインタ名
189|* ・type; 返り値の型
190|* ・func; メンバ関数名
191|* ・thisT; 引数の型
192|* ・argtX; 引数の型
193|* ・thisScT; スキーマへのポインタ型、または Inf_Pac 型
194|*【補足】
195|*・インターフェイスのソースファイル(*.c)のグローバル領域に書きます。
196|*・INF_MACRO_0 などと同じ機能なので、マクロで条件分岐するなどして、
197|* どちらかのみ使用します。
198|*・関数に返り値がある場合、INF_FUNC_R0 などを使用します。(R=Return)
199|*・多態性を持った初期化のように第1引数がスキーマの場合は INF_FUNC_SR0
200|* などを使用します。(SR=Schema and Return)
201|*・第1引数が、サブクラス・パラメータに対応したパラメタライズド・クラス
202|* の場合は、INF_FUNC_PR0 などを使用します。(PR=Paramatorized class and Return)
203|*・関数版は、アドレスのエラーチェックを行います。
204|* エラーの場合、INF_SUB_SC_METHOD_NULL によって、
205|* インターフェイスが実行するインプリメント・クラスの関数が定義されていないか、
206|* インターフェイスが初期化されていない可能性があります。
207|************************************************************************/
208|#define INF_FUNC_0( Inf, method, type, func, thisT, t ) \
209| type func( thisT self ) \
210| { \
211| ASSERT( self.sc != NULL ); \
212| ASSERT( self.sc->method != NULL ); \
213| ((Inf##_Sc*)self.sc)->method( self.obj ); \
214| }
215|
216|#define INF_FUNC_1( Inf, method, type, func, thisT,arg1T, t,a ) \
217| type func( thisT self, arg1T arg1 ) \
218| { \
219| ASSERT( self.sc != NULL ); \
220| ASSERT( self.sc->method != NULL ); \
221| ((Inf##_Sc*)self.sc)->method( self.obj, arg1 ); \
222| }
223|
224|#define INF_FUNC_2( Inf, method, type, func, thisT,arg1T,arg2T, t,a,b ) \
225| type func( thisT self, arg1T arg1, arg2T arg2 ) \
226| { \
227| ASSERT( self.sc != NULL ); \
228| ASSERT( self.sc->method != NULL ); \
229| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2 ); \
230| }
231|
232|#define INF_FUNC_3( Inf, method, type, func, thisT,arg1T,arg2T,arg3T, t,a,b,c ) \
233| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3 ) \
234| { \
235| ASSERT( self.sc != NULL ); \
236| ASSERT( self.sc->method != NULL ); \
237| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3 ); \
238| }
239|
240|#define INF_FUNC_4( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T, t,a,b,c,d ) \
241| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4 ) \
242| { \
243| ASSERT( self.sc != NULL ); \
244| ASSERT( self.sc->method != NULL ); \
245| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4 ); \
246| }
247|
248|#define INF_FUNC_5( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T, t,a,b,c,d,e ) \
249| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5 ) \
250| { \
251| ASSERT( self.sc != NULL ); \
252| ASSERT( self.sc->method != NULL ); \
253| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5 ); \
254| }
255|
256|#define INF_FUNC_6( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T,arg6T, t,a,b,c,d,e,f ) \
257| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6 ) \
258| { \
259| ASSERT( self.sc != NULL ); \
260| ASSERT( self.sc->method != NULL ); \
261| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5, arg6 ); \
262| }
263|
264|#define INF_FUNC_7( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T,arg6T,arg7T, t,a,b,c,d,e,f,g ) \
265| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6, arg7T arg7 ) \
266| { \
267| ASSERT( self.sc != NULL ); \
268| ASSERT( self.sc->method != NULL ); \
269| ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); \
270| }
271|
272|#define INF_FUNC_R0( Inf, method, type, func, thisT, t ) \
273| type func( thisT self ) \
274| { \
275| ASSERT( self.sc != NULL ); \
276| ASSERT( self.sc->method != NULL ); \
277| return ((Inf##_Sc*)self.sc)->method( self.obj ); \
278| }
279|
280|#define INF_FUNC_R1( Inf, method, type, func, thisT, arg1T, t,a ) \
281| type func( thisT self, arg1T arg1 ) \
282| { \
283| ASSERT( self.sc != NULL ); \
284| ASSERT( self.sc->method != NULL ); \
285| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1 ); \
286| }
287|
288|#define INF_FUNC_R2( Inf, method, type, func, thisT, arg1T, arg2T, t,a,b ) \
289| type func( thisT self, arg1T arg1, arg2T arg2 ) \
290| { \
291| ASSERT( self.sc != NULL ); \
292| ASSERT( self.sc->method != NULL ); \
293| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2 ); \
294| }
295|
296|#define INF_FUNC_R3( Inf, method, type, func, thisT,arg1T,arg2T,arg3T, t,a,b,c ) \
297| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3 ) \
298| { \
299| ASSERT( self.sc != NULL ); \
300| ASSERT( self.sc->method != NULL ); \
301| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3 ); \
302| }
303|
304|#define INF_FUNC_R4( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T, t,a,b,c,d ) \
305| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4 ) \
306| { \
307| ASSERT( self.sc != NULL ); \
308| ASSERT( self.sc->method != NULL ); \
309| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4 ); \
310| }
311|
312|#define INF_FUNC_R5( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T, t,a,b,c,d,e ) \
313| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5 ) \
314| { \
315| ASSERT( self.sc != NULL ); \
316| ASSERT( self.sc->method != NULL ); \
317| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5 ); \
318| }
319|
320|#define INF_FUNC_R6( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T,arg6T, t,a,b,c,d,e,f ) \
321| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6 ) \
322| { \
323| ASSERT( self.sc != NULL ); \
324| ASSERT( self.sc->method != NULL ); \
325| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5, arg6 ); \
326| }
327|
328|#define INF_FUNC_R7( Inf, method, type, func, thisT,arg1T,arg2T,arg3T,arg4T,arg5T,arg6T,arg7T, t,a,b,c,d,e,f,g ) \
329| type func( thisT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6, arg7T arg7 ) \
330| { \
331| ASSERT( self.sc != NULL ); \
332| ASSERT( self.sc->method != NULL ); \
333| return ((Inf##_Sc*)self.sc)->method( self.obj, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); \
334| }
335|
336|
337|#define INF_FUNC_SR0( Inf, method, type, func, thisScT, t ) \
338| type func( thisScT self ) \
339| { \
340| ASSERT( self != NULL ); \
341| ASSERT( self->method != NULL ); \
342| return self->method( self ); \
343| }
344|
345|#define INF_FUNC_SR1( Inf, method, type, func, thisScT, arg1T, t,a ) \
346| type func( thisScT self, arg1T arg1 ) \
347| { \
348| ASSERT( self != NULL ); \
349| ASSERT( self->method != NULL ); \
350| return self->method(self, arg1); \
351| }
352|
353|#define INF_FUNC_SR2( Inf, method, type, func, thisScT, arg1T, arg2T, t,a,b ) \
354| type func( thisScT self, arg1T arg1, arg2T arg2 ) \
355| { \
356| ASSERT( self != NULL ); \
357| ASSERT( self->method != NULL ); \
358| return self->method(self, arg1, arg2); \
359| }
360|
361|#define INF_FUNC_SR3( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, t,a,b,c ) \
362| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3 ) \
363| { \
364| ASSERT( self != NULL ); \
365| ASSERT( self->method != NULL ); \
366| return self->method(self, arg1, arg2, arg3); \
367| }
368|
369|#define INF_FUNC_SR4( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, t,a,b,c,d ) \
370| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4 ) \
371| { \
372| ASSERT( self != NULL ); \
373| ASSERT( self->method != NULL ); \
374| return self->method(self, arg1, arg2, arg3, arg4); \
375| }
376|
377|#define INF_FUNC_SR5( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, t,a,b,c,d,e ) \
378| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5 ) \
379| { \
380| ASSERT( self != NULL ); \
381| ASSERT( self->method != NULL ); \
382| return self->method(self, arg1, arg2, arg3, arg4, arg5); \
383| }
384|
385|#define INF_FUNC_SR6( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, t,a,b,c,d,e,f ) \
386| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6 ) \
387| { \
388| ASSERT( self != NULL ); \
389| ASSERT( self->method != NULL ); \
390| return self->method(self, arg1, arg2, arg3, arg4, arg5, arg6); \
391| }
392|
393|#define INF_FUNC_SR7( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, arg7T, t,a,b,c,d,e,f,g ) \
394| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6, arg7T arg7 ) \
395| { \
396| ASSERT( self != NULL ); \
397| ASSERT( self->method != NULL ); \
398| return self->method(self, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
399| }
400|
401|
402|#define INF_FUNC_PR1( Inf, method, type, func, thisScT, arg1T, t,a ) \
403| type func( thisScT self, arg1T arg1 ) \
404| { \
405| ASSERT( self.sc->method != NULL ); \
406| return self.sc->method( self, arg1 ); \
407| }
408|
409|#define INF_FUNC_PR2( Inf, method, type, func, thisScT, arg1T, arg2T, t,a,b ) \
410| type func( thisScT self, arg1T arg1, arg2T arg2 ) \
411| { \
412| ASSERT(self.sc->method != NULL ); \
413| return self.sc->method(self, arg1, arg2); \
414| }
415|
416|#define INF_FUNC_PR3( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, t,a,b,c ) \
417| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3 ) \
418| { \
419| ASSERT(self.sc->method != NULL ); \
420| return self.sc->method(self, arg1, arg2, arg3); \
421| }
422|
423|#define INF_FUNC_PR4( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, t,a,b,c,d ) \
424| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4 ) \
425| { \
426| ASSERT(self.sc->method != NULL ); \
427| return self.sc->method(self, arg1, arg2, arg3, arg4); \
428| }
429|
430|#define INF_FUNC_PR5( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, t,a,b,c,d,e ) \
431| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5 ) \
432| { \
433| ASSERT(self.sc->method != NULL ); \
434| return self.sc->method(self, arg1, arg2, arg3, arg4, arg5); \
435| }
436|
437|#define INF_FUNC_PR6( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, t,a,b,c,d,e,f ) \
438| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6 ) \
439| { \
440| ASSERT(self.sc->method != NULL ); \
441| return self.sc->method(self, arg1, arg2, arg3, arg4, arg5, arg6); \
442| }
443|
444|#define INF_FUNC_PR7( Inf, method, type, func, thisScT, arg1T, arg2T, arg3T, arg4T, arg5T, arg6T, arg7T, t,a,b,c,d,e,f,g ) \
445| type func( thisScT self, arg1T arg1, arg2T arg2, arg3T arg3, arg4T arg4, arg5T arg5, arg6T arg6, arg7T arg7 ) \
446| { \
447| ASSERT(self.sc->method != NULL ); \
448| return self.sc->method(self, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
449| }
450|
451|/*-------------------------------------------------------------------*/
452|/* 19. <<< ◆インプリメント・クラス >>> */
453|/*-------------------------------------------------------------------*/
454|
455|/***********************************************************************
456|* 20. <<< [INF_SUB_FUNC_START] インプリメント・クラスの関数定義の開始 >>>
457|* 21. <<< [INF_SUB_FUNC_END] インプリメント・クラスの関数定義の終了 >>>
458|* 22. <<< [INF_SUB_FUNC_OVERRIDE] 関連を継承する >>>
459|* 23. <<< [INF_SUB_FUNC_NULL] インターフェイスと関数を関連付けしない >>>
460|* 24. <<< [INF_SUB_FUNC_0] インターフェイスと関数の関連の記述(引数が0個の関数)>>>
461|* 25. <<< [INF_SUB_FUNC_1, INF_SUB_FUNC_2, INF_SUB_FUNC_3] >>>
462|* 26. <<< [INF_SUB_FUNC_4, INF_SUB_FUNC_5, INF_SUB_FUNC_6, INF_SUB_FUNC_7] >>>
463|* 27. <<< [INF_SUB_FUNC_R0, INF_SUB_FUNC_R1, INF_SUB_FUNC_R2, INF_SUB_FUNC_R3] >>>
464|* 28. <<< [INF_SUB_FUNC_R4, INF_SUB_FUNC_R5, INF_SUB_FUNC_R6, INF_SUB_FUNC_R7] >>>
465|* 29. <<< [INF_SUB_FUNC_SR0, INF_SUB_FUNC_SR1, INF_SUB_FUNC_SR2, INF_SUB_FUNC_SR3] >>>
466|* 30. <<< [INF_SUB_FUNC_SR4, INF_SUB_FUNC_SR5, INF_SUB_FUNC_SR6, INF_SUB_FUNC_SR7] >>>
467|* 31. <<< [INF_SUB_FUNC_PR0, INF_SUB_FUNC_PR1, INF_SUB_FUNC_PR2, INF_SUB_FUNC_PR3] >>>
468|* 32. <<< [INF_SUB_FUNC_PR4, INF_SUB_FUNC_PR5, INF_SUB_FUNC_PR6, INF_SUB_FUNC_PR7] >>>
469|*【引数】
470|* ・Inf; インターフェイスの型名
471|* ・Sub; インプリメント・クラスの型名
472|* ・method; 内部関数ポインタ名
473|* ・type; 返り値の型
474|* ・func; メンバ関数名
475|* ・thisT; 引数の型
476|* ・argTX; 引数の型
477|*【補足】
478|*・このマクロによって、以下のものが定義されます。
479|* ・インプリメント・クラスのスキーマ・グローバル構造体
480|* Inf_Sc Sub_sc_Inf;
481|* ・インプリメント・クラスのスキーマを返す関数
482|* Inf_Sc* Sub_getSc_Inf_Sc(void);
483|* ・インプリメント・クラスの先頭アドレスからインターフェイスを返す関数
484|* Inf Sub_inf_Inf( SubType* );
485|* ・インターフェイスからインプリメント・クラスの先頭アドレスを返す関数
486|* Sub* Sub_by_Inf( Inf inf );
487|*・INF_SUB_FUNC_OVERRIDE は、既存のインターフェイスの差分のみを
488|* 記述するときに使用します。INF_SUB_FUNC_START の直後に記述します。
489|* その後に、インプリメントの関数が異なる関数のみ、INF_SUB_FUNC_...
490|* マクロを記述します。
491|*・INF_SUB_FUNC_R0 など末尾の数字の前に
492|* R が付いているマクロは、返り値を返すインターフェイスに使用します。
493|* SR が付いているマクロは、第1引数がスキーマのインターフェイスに使用します。
494|*・INF_SUB_FUNC_NULL で指定したインターフェイスは、そのインターフェイスが
495|* 内部的に持っている関数ポインタを NULL にします。デバッグバージョンでは、
496|* そのインターフェイスを用いた呼び出しを行うと、ASSERT にかかります。
497|*・INF_SUB_FUNC_... は、関数の内部で記述することもできます。
498|* INF_SUB_FUNC_... をプロセスが通ると、スキーマのメンバ変数の値が変化します。
499|* スキーマを返す関数(getSc)を流用して、一部をオーバーライドするときに使います。
500|*・NDEBUG マクロが定義されていない場合、エラーチェックをします。
501|* エラーの場合、インターフェイスが指しているインプリメント・クラスが、
502|* 指定のものと異なるか、インターフェイスが初期化されていない
503|* 可能性があります。
504|************************************************************************/
505|#define INF_SUB_FUNC_START( Inf, Sub ) \
506| Inf##_Sc Sub##_sc_##Inf; \
507| \
508| Inf##_Sc* Sub##_getSc_##Inf##_Sc() \
509| { \
510| static int initialized = 0; \
511| if ( ! initialized ) {
512|
513|
514|#define INF_SUB_FUNC_END( Inf, Sub ) \
515| initialized = 1; \
516| } \
517| return &Sub##_sc_##Inf; \
518| } \
519| \
520| Sub* Sub##_by_##Inf( Inf inf ) /* Sub が typedef されていないとここでエラー */ \
521| { \
522| ASSERT( inf.sc == &Sub##_sc_##Inf ); \
523| return (Sub*)inf.obj; \
524| } \
525| \
526| Inf Sub##_inf_##Inf( Sub* self ) \
527| { \
528| Inf inf; \
529| \
530| inf.sc = Sub##_getSc_##Inf##_Sc(); \
531| inf.obj = self; \
532| return inf; \
533| }
534|
535|
536|#define INF_SUB_FUNC_OVERRIDE( Inf, Sub, Super ) \
537| Sub##_sc_##Inf = *Super##_getSc_##Inf##_Sc();
538|
539|#define INF_SUB_FUNC_NULL( Inf, Sub, method ) \
540| Sub##_sc_##Inf.method = NULL;
541|
542|#define INF_SUB_FUNC_R0 INF_SUB_FUNC_0
543|#define INF_SUB_FUNC_0( Inf, Sub, method, type, func, thisT, t ) \
544| Sub##_sc_##Inf.method = (type(*)(void*)) func;
545|#define INF_SUB_FUNC_SR0( Inf, Sub, method, type, func, thisT, t ) \
546| Sub##_sc_##Inf.method = (type(*)(thisT)) func;
547|#define INF_SUB_FUNC_PR0 INF_SUB_FUNC_SR0
548|
549|#define INF_SUB_FUNC_R1 INF_SUB_FUNC_1
550|#define INF_SUB_FUNC_1( Inf, Sub, method, type, func, thisT, argT1, t,a ) \
551| Sub##_sc_##Inf.method = (type(*)(void*,argT1)) func;
552|#define INF_SUB_FUNC_SR1( Inf, Sub, method, type, func, thisT, argT1, t,a ) \
553| Sub##_sc_##Inf.method = (type(*)(thisT,argT1)) func;
554|#define INF_SUB_FUNC_PR1 INF_SUB_FUNC_SR1
555|
556|#define INF_SUB_FUNC_R2 INF_SUB_FUNC_2
557|#define INF_SUB_FUNC_2( Inf, Sub, method, type, func, thisT, argT1, argT2, t,a,b ) \
558| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2)) func;
559|#define INF_SUB_FUNC_SR2( Inf, Sub, method, type, func, thisT, argT1, argT2, t,a,b ) \
560| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2)) func;
561|#define INF_SUB_FUNC_PR2 INF_SUB_FUNC_SR2
562|
563|#define INF_SUB_FUNC_R3 INF_SUB_FUNC_3
564|#define INF_SUB_FUNC_3( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, t,a,b,c ) \
565| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2,argT3)) func;
566|#define INF_SUB_FUNC_SR3( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, t,a,b,c ) \
567| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2,argT3)) func;
568|#define INF_SUB_FUNC_PR3 INF_SUB_FUNC_SR3
569|
570|#define INF_SUB_FUNC_R4 INF_SUB_FUNC_4
571|#define INF_SUB_FUNC_4( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, t,a,b,c,d ) \
572| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2,argT3,argT4)) func;
573|#define INF_SUB_FUNC_SR4( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, t,a,b,c,d ) \
574| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2,argT3,argT4)) func;
575|#define INF_SUB_FUNC_PR4 INF_SUB_FUNC_SR4
576|
577|#define INF_SUB_FUNC_R5 INF_SUB_FUNC_5
578|#define INF_SUB_FUNC_5( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, t,a,b,c,d,e ) \
579| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2,argT3,argT4,argT5)) func;
580|#define INF_SUB_FUNC_SR5( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, t,a,b,c,d,e ) \
581| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2,argT3,argT4,argT5)) func;
582|#define INF_SUB_FUNC_PR5 INF_SUB_FUNC_SR5
583|
584|#define INF_SUB_FUNC_R6 INF_SUB_FUNC_6
585|#define INF_SUB_FUNC_6( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, argT6, t,a,b,c,d,e,f ) \
586| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2,argT3,argT4,argT5,argT6)) func;
587|#define INF_SUB_FUNC_SR6( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, argT6, t,a,b,c,d,e,f ) \
588| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2,argT3,argT4,argT5,argT6)) func;
589|#define INF_SUB_FUNC_PR6 INF_SUB_FUNC_SR6
590|
591|#define INF_SUB_FUNC_R7 INF_SUB_FUNC_7
592|#define INF_SUB_FUNC_7( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, argT6, argT7, t,a,b,c,d,e,f,g ) \
593| Sub##_sc_##Inf.method = (type(*)(void*,argT1,argT2,argT3,argT4,argT5,argT6,argT7)) func;
594|#define INF_SUB_FUNC_SR7( Inf, Sub, method, type, func, thisT, argT1, argT2, argT3, argT4, argT5, argT6, argT7, t,a,b,c,d,e,f,g ) \
595| Sub##_sc_##Inf.method = (type(*)(thisT,argT1,argT2,argT3,argT4,argT5,argT6,argT7)) func;
596|#define INF_SUB_FUNC_PR7 INF_SUB_FUNC_SR7
597|
598|
599|
600|/***********************************************************************
601|* 33. <<< [INF_SUB_PACFUNC1] Inf_Pac を返す関数の定義 >>>
602|* 34. <<< [INF_SUB_PACFUNC2] [INF_SUB_PACFUNC3] [INF_SUB_PACFUNC4] >>>
603|* 35. <<< [INF_SUB_PACFUNC4] [INF_SUB_PACFUNC6] [INF_SUB_PACFUNC7] >>>
604|*【引数】
605|* ・Inf; インターフェイスの型名
606|* ・Sub; インプリメント・クラスの型名
607|* ・paramT; サブクラス・パラメータ の構造体名、(サブクラス名)+ _Param
608|* ・argTX; 引数の型
609|* ・a,b,c... ; 構造体のメンバ変数名
610|*【補足】
611|*・本マクロは、INF_SUB_FUNC_END より後に宣言します。
612|*・このマクロによって、以下の関数が定義されます。
613|* Inf_Pac Sub_getPac_Inf( Sub_Param*, ... );
614|************************************************************************/
615|
616|#define INF_SUB_PACFUNC1( Inf, Sub, paramT, argT1, a ) \
617| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a ) \
618| { \
619| Inf##_Pac pac; \
620| \
621| pac.sc = Sub##_getSc_##Inf##_Sc(); \
622| pac.param = param; \
623| param->a = a; \
624| \
625| return pac; \
626|}
627|
628|
629|#define INF_SUB_PACFUNC2( Inf, Sub, paramT, argT1, a, argT2, b ) \
630| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a, argT2 b ) \
631| { \
632| Inf##_Pac pac; \
633| \
634| pac.sc = Sub##_getSc_##Inf##_Sc(); \
635| pac.param = param; \
636| param->a = a; \
637| param->b = b; \
638| \
639| return pac; \
640|}
641|
642|
643|#define INF_SUB_PACFUNC3( Inf, Sub, paramT, argT1, a, argT2, b, argT3, c ) \
644| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a, argT2 b, argT3 c ) \
645| { \
646| Inf##_Pac pac; \
647| \
648| pac.sc = Sub##_getSc_##Inf##_Sc(); \
649| pac.param = param; \
650| param->a = a; \
651| param->b = b; \
652| param->c = c; \
653| \
654| return pac; \
655|}
656|
657|
658|#define INF_SUB_PACFUNC4( Inf, Sub, paramT, argT1, a, argT2, b, argT3, c, argT4, d ) \
659| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a, argT2 b, argT3 c, argT4 d ) \
660| { \
661| Inf##_Pac pac; \
662| \
663| pac.sc = Sub##_getSc_##Inf##_Sc(); \
664| pac.param = param; \
665| param->a = a; \
666| param->b = b; \
667| param->c = c; \
668| param->d = d; \
669| \
670| return pac; \
671|}
672|
673|
674|#define INF_SUB_PACFUNC5( Inf, Sub, paramT, argT1, a, argT2, b, argT3, c, argT4, d, argT5, e ) \
675| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a, argT2 b, argT3 c, argT4 d, argT5 e ) \
676| { \
677| Inf##_Pac pac; \
678| \
679| pac.sc = Sub##_getSc_##Inf##_Sc(); \
680| pac.param = param; \
681| param->a = a; \
682| param->b = b; \
683| param->c = c; \
684| param->d = d; \
685| param->e = e; \
686| \
687| return pac; \
688|}
689|
690|
691|#define INF_SUB_PACFUNC6( Inf, Sub, paramT, argT1, a, argT2, b, argT3, c, argT4, d, argT5, e, argT6, f ) \
692| Inf##_Pac Sub##_getPac_##Inf( paramT param, argT1 a, argT2 b, argT3 c, argT4 d, argT5 e, argT6 f ) \
693| { \
694| Inf##_Pac pac; \
695| \
696| pac.sc = Sub##_getSc_##Inf##_Sc(); \
697| pac.param = param; \
698| param->a = a; \
699| param->b = b; \
700| param->c = c; \
701| param->d = d; \
702| param->e = e; \
703| param->f = f; \
704| \
705| return pac; \
706|}
707|
708|
709|#define INF_SUB_PACFUNC7( Inf, Sub, paramT, argT1, a, argT2, b, argT3, c, argT4, d, argT5, e, argT6, f, argT7, g ) \
710| Inf##_Pac Sub##_getPac_##Inf( paramT* param, argT1 a, argT2 b, argT3 c, argT4 d, argT5 e, argT6 f, argT7 g ) \
711| { \
712| Inf##_Pac pac; \
713| \
714| pac.sc = Sub##_getSc_##Inf##_Sc(); \
715| pac.param = param; \
716| param->a = a; \
717| param->b = b; \
718| param->c = c; \
719| param->d = d; \
720| param->e = e; \
721| param->f = f; \
722| param->g = g; \
723| \
724| return pac; \
725|}
726|
727|
728|
729|/*-------------------------------------------------------------------*/
730|/* 36. <<< ◆メソッド・ポインタ >>> */
731|/*-------------------------------------------------------------------*/
732|
733|/***********************************************************************
734|* 37. <<< [Inf_Mp] メソッド・ポインタ >>>
735|************************************************************************/
736|struct _Inf_Mp {
737| void* obj;
738| int (*func)();
739| #ifndef NDEBUG
740| int nArg;
741| #endif
742|};
743|
744|#ifdef NDEBUG
745|
746|#define Inf_Mp_init( this, _obj, _func, _nArg ) \
747| ( (this)->obj = _obj, (this)->func = _func )
748|
749|#define Inf_Mp_call0( this ) \
750| ( *(this)->func )( (this)->obj )
751|
752|#define Inf_Mp_call1( this, a ) \
753| ( *(this)->func )( (this)->obj, a )
754|
755|#define Inf_Mp_call2( this, a,b ) \
756| ( *(this)->func )( (this)->obj, a,b )
757|
758|#define Inf_Mp_call3( this, a,b,c ) \
759| ( *(this)->func )( (this)->obj, a,b,c )
760|
761|#define Inf_Mp_call4( this, a,b,c,d ) \
762| ( *(this)->func )( (this)->obj, a,b,c,d )
763|
764|#define Inf_Mp_call5( this, a,b,c,d,e ) \
765| ( *(this)->func )( (this)->obj, a,b,c,d,e )
766|
767|#define Inf_Mp_call6( this, a,b,c,d,e,f ) \
768| ( *(this)->func )( (this)->obj, a,b,c,d,e,f )
769|
770|#define Inf_Mp_call7( this, a,b,c,d,e,f,g ) \
771| ( *(this)->func )( (this)->obj, a,b,c,d,e,f,g )
772|
773|#else
774|
775|#define Inf_Mp_init( this, _obj, _func, _nArg ) \
776| ( (this)->obj = _obj, (this)->func = _func, (this)->nArg = _nArg )
777|
778|#define Inf_Mp_call0( this ) \
779| ( (this)->nArg == 0 ? (*(this)->func)( (this)->obj ) : \
780| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
781|
782|#define Inf_Mp_call1( this, a ) \
783| ( (this)->nArg == 1 ? (*(this)->func)( (this)->obj, a ) : \
784| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
785|
786|#define Inf_Mp_call2( this, a,b ) \
787| ( (this)->nArg == 2 ? (*(this)->func)( (this)->obj, a,b ) : \
788| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
789|
790|#define Inf_Mp_call3( this, a,b,c ) \
791| ( (this)->nArg == 3 ? (*(this)->func)( (this)->obj, a,b,c ) : \
792| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
793|
794|#define Inf_Mp_call4( this, a,b,c,d ) \
795| ( (this)->nArg == 4 ? (*(this)->func)( (this)->obj, a,b,c,d ) : \
796| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
797|
798|#define Inf_Mp_call5( this, a,b,c,d,e ) \
799| ( (this)->nArg == 5 ? (*(this)->func)( (this)->obj, a,b,c,d,e ) : \
800| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
801|
802|#define Inf_Mp_call6( this, a,b,c,d,e,f ) \
803| ( (this)->nArg == 6 ? (*(this)->func)( (this)->obj, a,b,c,d,e,f ) : \
804| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
805|
806|#define Inf_Mp_call7( this, a,b,c,d,e,f,g ) \
807| ( (this)->nArg == 7 ? (*(this)->func)( (this)->obj, a,b,c,d,e,f,g ) : \
808| error2_1( Inf_Err_WrongNumOfParam, "パラメータの数が違います(%d)", (this)->nArg ) , 0 )
809|
810|#endif
811|
812|#endif /* __INF_H */
813|
814|