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|