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| 
  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|