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