offset.h

C:\home\SVGCats_src\src\offset.h

[目次 | 型・クラス・構造体 | マクロ]

目次

型・クラス・構造体一覧

マクロ一覧


   1|/**************************************************************************
   2|*  1. <<< メンバ変数のオフセット、抽象クラスのオフセット (Offset) >>> 
   3|***************************************************************************/
   4|
   5|#ifndef __OFFSET_H
   6|#define __OFFSET_H
   7|
   8|/* #define  OFFSET_USE_OLD */
   9|
  10|
  11| 
  12|/*************************************************************************
  13|*  2. <<< 優先ヘッダ >>> 
  14|**************************************************************************/
  15|#ifndef USES_PRIORITY_HEADER
  16|/*[START_OF_PRIORITY_HEADER]*/
  17|
  18|#ifndef  USES_OFFSET
  19|#define  USES_OFFSET
  20|typedef  int  Offset;
  21|typedef  struct _Offset_Key  Offset_Key;
  22|#define  STDLIBS_INCLUDE_STDDEF_H
  23|#define  STDLIBS_INCLUDE_STRING_H
  24|#endif
  25|
  26|/*[END_OF_PRIORITY_HEADER]*/
  27|#endif /* USES_PRIORITY_HEADER */
  28|
  29| 
  30|/*-----------------------------------------------------------------*/
  31|/* 3. <<< Interface Area ---------------------------------------- >>> */ 
  32|/*-----------------------------------------------------------------*/
  33|
  34| 
  35|/**************************************************************************
  36|*  4. <<< [Offset] メンバ変数のオフセット、抽象クラスのオフセット >>> 
  37|*【補足】
  38|*・メンバ変数のオフセットは、メンバ変数のアドレスと構造体の先頭アドレスの差です。
  39|*・抽象クラスを委譲したメンバ変数のオフセットが派生クラスで異なるときに使用します。
  40|***************************************************************************/
  41|/* (型は優先ヘッダで定義)*/
  42|
  43|/* int   Offset_init( type, member ); */
  44|/* type  Offset_ref( this, pStruct, member_type ); */
  45|int  Offset_chk( Offset offset );
  46|
  47|
  48|#ifdef  OFFSET_USE_OLD
  49|  /* Offset  OFFSET( void* obj, attr ); */
  50|  /* type  USE_OFFSET( void* obj, Offset offset, type ); */
  51|#endif
  52|
  53|
  54| 
  55|/******************************************************************
  56|*  5. <<< [Offset_Key] キー情報 >>> 
  57|*【補足】
  58|*・検索したりソートする対象となるキーについての情報です。
  59|*・キーの型の識別子は次の通りです。
  60|*  ・Offset_Int         int 型
  61|*  ・Offset_Double      double 型
  62|*  ・Offset_CString     char[] 型、要素(構造体)に文字が格納されている
  63|*  ・Offset_CStringP    char*  型、要素(構造体)にポインタが格納されている
  64|*  ・Offset_CStringPI   大文字と小文字を区別しない CStringP
  65|*  ・Offset_CStringPW   ワイルドカード付き CStringP(ワールド〜はデータベースに指定)
  66|*  ・Offset_StrV        StrV 型、大文字小文字区別
  67|*・キーのソート方向の識別子は次の通りです。
  68|*  ・Offset_Up 昇順、 Offset_Down 降順、 Offset_NoDirec ソートしない
  69|*******************************************************************/
  70|struct _Offset_Key {
  71|  Offset  offset;  /* 要素(構造体)中のキーのバイト位置 */
  72|  int     type;    /* キーの型(→補足) */
  73|  int     direc;   /* ソート方向(→補足) */
  74|};
  75|
  76|/* キーの型 */
  77|enum { Offset_Int, Offset_Double, Offset_CString, Offset_CStringP,
  78|  Offset_CStringPI, Offset_CStringPW, Offset_StrV };
  79|
  80|/* ソート方向 */
  81|enum { Offset_Up = -1, Offset_Down = +1, Offset_NoDirec = 0 };
  82|
  83|/* void  Offset_Key_init( Offset_Key*, table_type, key_name, int key_type, int direc ); */
  84|int   Offset_Key_chk( Offset_Key* );
  85|bool  Offset_Key_isHit( Offset_Key*, const void* elem, const void* key );
  86|int   Offset_Key_cmp( Offset_Key*, void* data1, void* data2 );
  87|void  Offset_Key_print( Offset_Key*, const char* title );
  88|void  Offset_Key_printData( Offset_Key*, void* data, const char* title );
  89|
  90|
  91| 
  92|/*-----------------------------------------------------------------*/
  93|/* 6. <<< Mapping Area ------------------------------------------ >>> */ 
  94|/*-----------------------------------------------------------------*/
  95|
  96| 
  97|/**************************************************************************
  98|*  7. <<< [Offset_init] メンバ変数のオフセットを返す(型から) >>> 
  99|*【引数】
 100|*  ・struct_type;     構造体の型名
 101|*  ・member_name;     メンバ変数名
 102|*  ・Offset  返り値;  メンバ変数のオフセット
 103|*【内部補足】
 104|*・標準ライブラリの stddef.h がインクルードしてあること
 105|***************************************************************************/
 106|#define  Offset_init( struct_type, member_name ) \
 107|   offsetof( struct_type, member_name )
 108| 
 109|/**************************************************************************
 110|*  8. <<< [Offset_init2] メンバ変数のオフセットを返す(ポインタから) >>> 
 111|*【引数】
 112|*  ・type*  struct_ptr;   構造体のポインタ(具象クラスの構造体であること)
 113|*  ・member_name;         メンバ変数名
 114|*  ・Offset  返り値;      メンバ変数のオフセット
 115|***************************************************************************/
 116|#define  Offset_init2( struct_ptr, member_name ) \
 117|    ( (char*)&((struct_ptr)->member_name) - (char*)(struct_ptr) )
 118| 
 119|/**************************************************************************
 120|*  9. <<< [Offset_ref] メンバ変数にアクセスする >>> 
 121|*【引数】
 122|*  ・void*  struct_adr;    構造体の先頭アドレス
 123|*  ・member_type;          メンバ変数の型
 124|*  ・member_type  返り値;  メンバ変数の値
 125|*【補足】
 126|*・メンバ変数に代入することもできます。
 127|*    Offset_ref( this, obj, int ) = 1;
 128|*・メンバ変数のアドレスを取得するには次のようにします。
 129|*    &Offset_ref( this, obj, int )
 130|***************************************************************************/
 131|#define  Offset_ref( this, struct_adr, member_type ) \
 132|  ( *(member_type*)((char*)(struct_adr) + (this)) )
 133| 
 134|/**************************************************************************
 135|*  10. <<< [Offset_chk] 正規チェック >>> 
 136|***************************************************************************/
 137|#define  Offset_chk( offset )   ( (offset) >= 0 )
 138|
 139|
 140| 
 141|/**************************************************************************
 142|*  11. <<< 構造体のメンバへのオフセットを得る [OFFSET] >>> 
 143|*【引数】
 144|*  ・void* obj;       ある構造体変数のアドレス
 145|*  ・attr;            メンバ変数名
 146|*  ・Offset  返り値;  オフセット値
 147|***************************************************************************/
 148|#ifdef  OFFSET_USE_OLD
 149|
 150|#define  OFFSET( obj, attr ) \
 151|  ( (char*)&((obj)->attr) - (char*)(obj) )
 152|
 153|#endif
 154|
 155| 
 156|/**************************************************************************
 157|*  12. <<< オフセットを用いて構造体のメンバへアクセスする [USE_OFFSET] >>> 
 158|*【引数】
 159|*  ・void* obj;          ある構造体変数のアドレス
 160|*  ・Offset  offset;     オフセット値
 161|*  ・attr_type;          メンバ変数の型
 162|*  ・attr_type  返り値;  メンバ変数の値
 163|*【補足】
 164|*・&USE_OFFSET( obj, offset, int ) とすると、そのメンバ変数へのアドレスを
 165|*  取得することが出来ます。
 166|***************************************************************************/
 167|#ifdef  OFFSET_USE_OLD
 168|
 169|#define  USE_OFFSET( obj, offset, attr_type ) \
 170|  ( *(attr_type*)((char*)(obj) + (offset)) )
 171|
 172|#endif
 173| 
 174|/**************************************************************************
 175|*  13. <<< [Offset_Key_init] キー情報を初期化する >>> 
 176|*  14. <<< [Offset_Key_initForBasicType] 基本型をテーブルとしたキー情報を初期化する >>>
 177|*【引数】
 178|*  ・table_type;      構造体の型名
 179|*  ・key_name;        キーにするメンバ変数名
 180|*  ・int  key_type;   キーにするタイプ識別子(Offset_Int など。→Offset_Key の補足)
 181|*  ・int  direc;      ソート方向(Offset_Up など。→Offset_Key の補足)
 182|***************************************************************************/
 183|#define  Offset_Key_init( this, table_type, key_name, key_type, _direc ) \
 184|  ( (this)->offset = Offset_init( table_type, key_name ), \
 185|    (this)->type = key_type, (this)->direc = _direc )
 186|
 187|
 188|#define  Offset_Key_initForBasicType( this, key_type, _direc ) \
 189|  ( (this)->offset = 0, (this)->type = key_type, (this)->direc = _direc )
 190| 
 191|#endif /* __OFFSET_H */ 
 192| 
 193|