C:\home\SVGCats_src\src\arrx.h
1|/**************************************************************** 2| 1. <<< 固定要素数配列 (ArrX) >>> 3|*****************************************************************/ 4| 5|#ifndef __ARRX_H 6|#define __ARRX_H 7| 8| 9| 10|/**************************************************************** 11| 2. <<< モジュール設定/優先ヘッダ >>> 12|【補足】 13|・ここに記述してある内容は、本ヘッダファイルより前にインクルード 14| されるファイル(*.ah$ ファイル、または *-all.h ファイルなど) 15| にコピーされます。 16|*****************************************************************/ 17|#ifndef USES_PRIORITY_HEADER 18|/*[START_OF_PRIORITY_HEADER]*/ 19| 20|#ifndef USES_ARRX 21|#define USES_ARRX 22| 23|typedef struct _ArrX ArrX; 24|typedef struct _ArrX_Buf ArrX_Buf; 25|typedef struct _ArrX_Able ArrX_Able; 26|#ifdef __cplusplus 27| typedef bool ArrX_AbleElem; 28|#else 29| typedef char ArrX_AbleElem; 30|#endif 31|typedef struct _ArrX_AbleElemP ArrX_AbleElemP; 32|#define ArrX_St void* ArrX_St_imp /* 最後の配列要素の次のアドレス */ 33|typedef struct _ArrX_StList ArrX_StList; 34|typedef struct _ArrX_Sort ArrX_Sort; 35|typedef struct _ArrX_Dic ArrX_Dic; 36|typedef struct _ArrX_DicIter ArrX_DicIter; 37| 38| /* #define ARRX_OPTI_SIZE */ /* サイズ最適化 */ 39| 40|#ifndef STDLIBS_INCLUDE 41| #define STDLIBS_INCLUDE 42|#endif 43|#ifndef STDLIBS_INCLUDE_STDDEF_H 44| #define STDLIBS_INCLUDE_STDDEF_H 45|#endif 46|#ifndef STDLIBS_INCLUDE_SETJMP_H 47| #define STDLIBS_INCLUDE_SETJMP_H 48|#endif 49| 50| 51|#endif 52| 53|/*[END_OF_PRIORITY_HEADER]*/ 54|#endif 55| 56| 57| 58|/************************************************************************* 59| 3. <<< エラーコード, リターンコード >>> 60|**************************************************************************/ 61| 62|#define ArrX_Err_Full 901 /* [Compone_GID:Errors_Code] */ 63| 64|/*-----------------------------------------------------------------*/ 65|/* 4. <<< Interface Area ---------------------------------------- >>> */ 66|/*-----------------------------------------------------------------*/ 67| 68|#ifdef __cplusplus 69|extern "C" { 70|#endif 71| 72|/****************************************************************** 73| 5. <<< [ArrX_C] C言語配列 >>> 74|*******************************************************************/ 75|/* int ArrX_C_getN( arr, type ); */ 76|void ArrX_C_shaffle( void* arr_adr, int elem_size, int nElem, int seed ); 77| 78| 79| 80|/****************************************************************** 81| 6. <<< [ArrX] 最小固定要素配列 >>> 82|【補足】 83|・集合を定義します。 84|・すでに配列として値が入っているものに適しています。 85|・全ての要素を走査することが出来ます。 86|・メモリサイズは、以下の式で計算します。 87| size = sizeof(ArrX) + sizeof(配列要素) * 配列要素数の最大 88|*******************************************************************/ 89|struct _ArrX { 90| void* first; /* 配列の先頭要素のアドレス(型は要素の型のポインタ型)*/ 91| void* last; /* 配列の末尾要素の次のアドレス */ 92| ERRORS_INITCHK_VAR 93|}; 94| 95|void ArrX_init( ArrX*, void* first, int arr_sizeof ); 96|void ArrX_init2( ArrX*, void* first, void* over ); 97|void ArrX_initByStr( ArrX*, char* ); 98|void ArrX_init_byBuf1( ArrX*, ArrX_Buf* ); 99|void ArrX_init_byBuf2( ArrX*, ArrX_Buf* ); 100|/*void ArrX_initPtrArr( ArrX*, ArrX_Buf*, ArrX*, type );*/ 101| 102|/* int ArrX_getN( ArrX*, type ); */ 103|int ArrX_getSize( ArrX* ); 104|/* type* ArrX_get( ArrX*, int i, type ); */ 105|ArrX* ArrX_castFrom_ArrX_Buf( ArrX* arr, ArrX_Buf* buf ); 106|int ArrX_chk( ArrX* ); 107|/* ArrX_forEach( arrx, pp, type ) */ 108|void ArrX_setStrs( ArrX*, ... ); 109|/*void ArrX_memrot( void* ball, void* target, type );*/ 110| 111|#ifdef USES_ERRORS 112|#ifndef ERRORS_CUT_DEBUG_TOOL 113|void ArrX_print( ArrX*, char* types ); 114|#endif 115|#endif 116| 117|#ifdef USES_OFFSET 118|/*type* ArrX_search_i( ArrX*, Offset_Key* key, int val, type );*/ 119|/*type* ArrX_search_d( ArrX*, Offset_Key* key, double val, type );*/ 120|/*type* ArrX_search_s( ArrX*, Offset_Key* key, char* val, type );*/ 121|/*type* ArrX_search_ps( ArrX*, Offset_Key* key, char* val, type );*/ 122|#endif /* USES_OFFSET */ 123| 124|#ifdef USES_SYM 125| bool ArrX_doLoopFunc( Sym_Ref* container, Sym_Ref* elem ); 126| extern Sym_Struct* ArrX_registSymStruct( Sym* ); 127| extern Sym_Struct ArrX_symStruct; 128| #define ArrX_SymElem_new( container_type, elem_type ) sizeof(elem_type) 129| #define ArrX_SymElem_delete NULL 130|#endif 131| 132|/* 内部用 */ 133|void ArrX_initPtrArr_imp( ArrX*, ArrX_Buf*, ArrX*, int ); 134|ArrX* ArrX_castFrom_ArrX_Buf_imp( ArrX* arr, ArrX_Buf* buf ); 135|int ArrX_getN_imp( ArrX*, int size ); 136|void* ArrX_get_imp( ArrX*, int i, int size ); 137|void ArrX_memrot_imp( void* ball, void* target, void* work, int ball_size ); 138| 139|#ifdef USES_OFFSET 140|void* ArrX_search_i_imp( ArrX*, Offset_Key* key, int val, 141| int elem_sizeof ); 142|void* ArrX_search_d_imp( ArrX*, Offset_Key* key, double val, 143| int elem_sizeof ); 144|void* ArrX_search_s_imp( ArrX*, Offset_Key* key, const char* val, 145| int elem_sizeof ); 146|void* ArrX_search_ps_imp( ArrX*, Offset_Key* key, const char* val ); 147|#endif /* USES_OFFSET */ 148| 149| 150|/****************************************************************** 151| 7. <<< [ArrX_Buf] 配列を使用したバッファ >>> 152|【補足】 153|・集合を作成していくときに用いる配列兼スタック領域です。 154|・スタックなので開放する順番に制限があります。その制限を無くしたい場合は、 155| それぞれの開放単位ごとにスタック領域(ArrX_Buf)を用意する必要があります。 156|・双方向リストを使用したバッファは DList2_Buf を用います。 157|・メモリサイズは、以下の式で計算します。 158| size = sizeof(ArrX_Buf) + sizeof(配列要素) * 配列要素数の最大 159| 160| 8. <<< [ArrX_Buf を用いたツリー用スタック領域] >>> 161| 162|・ツリー構造の領域として使う場合、それぞれのレベル(型)ごとの 163| ArrX_Buf を『メンバ』に持つ構造体を用意します。ユーザに公開する関数は、 164| 以下のものを用意するとよいでしょう。 165| ・ArrX_Buf_getMemSize を用いた [St_getMemSize 関数] 166| ・各メンバに ArrX_Buf_inits を用いた [St_init 関数] 167| ・各メンバに ArrX_Buf_toEmpty を用いた [St_reset 関数] 168| ・各メンバに ArrX_Buf_setMark(予定)を用いた [St_alloc 関数] 169| ・各メンバに ArrX_Buf_freeToMark(予定)を用いた [St_free 関数] 170|・こうすることで、以下の図のように開放単位の要素ごとにプッシュ(alloc)・ 171| ポップ(free)することができます(開放単位ごとに色分しています)。 172| また、開放単位の要素を(2つの)グループに分け、それらはスタックの 173| 制限無く開放(reset)することができます。どのようにグループ分けするかは、 174| エンドユーザに任せたほうがよいでしょう。 175| ↓次の図は無くしてしまいました (^^; 176| <IMG src="arrx6.gif"> 177|*******************************************************************/ 178|struct _ArrX_Buf { 179| void* first; /* 配列の先頭要素のアドレス */ 180| void* last; /* 使用状態にある末尾要素の次のアドレス */ 181| void* bufLast; /* バッファの末尾の次のアドレス */ 182| ERRORS_INITCHK_VAR 183|}; 184| 185|void ArrX_Buf_init( ArrX_Buf*, void* mem, int mem_sizeof ); 186|void* ArrX_Buf_inits( void* mem, int* mp, int n, ... ); 187|int ArrX_Buf_getMemSize( int* ms, int n, ... ); 188|/*int ArrX_Buf_getLeftSize( ArrX_Buf*, type ); */ 189|int ArrX_Buf_chk( ArrX_Buf* ); 190|/* ArrX_Buf_forEach( arrx, pp, type ) */ 191|/* ArrX_Buf_forEachReverse( arrx, pp, type ) */ 192|void ArrX_Buf_toEmpty( ArrX_Buf* ); 193|/* bool ArrX_Buf_isEmpty( ArrX_Buf* ); */ 194|/* int ArrX_Buf_getN( ArrX_Buf*, type ); */ 195|/* type* ArrX_Buf_get( ArrX_Buf*, int i, type ); */ 196|/*type* ArrX_Buf_alloc( ArrX_Buf*, type );*/ 197|/*type* ArrX_Buf_allocs( ArrX_Buf*, type, int nElem );*/ 198|void ArrX_Buf_addCopy( ArrX_Buf*, ArrX* plus ); 199|void ArrX_Buf_addChr( ArrX_Buf*, unsigned char c ); 200|void ArrX_Buf_addStr( ArrX_Buf*, const char* s ); 201|void ArrX_Buf_addMem( ArrX_Buf*, const void* s, int s_size ); 202|void ArrX_Buf_addEndOfC( ArrX_Buf* ); 203|/*type* ArrX_Buf_getLast( ArrX_Buf*, type ); */ 204|/*void ArrX_Buf_free( ArrX_Buf*, void* p, type );*/ 205|#ifdef USES_OFFSET 206|/*type* ArrX_Buf_search_i( ArrX_Buf*, Offset_Key* key, int val, type );*/ 207|/*type* ArrX_Buf_search_d( ArrX_Buf*, Offset_Key* key, double val, type );*/ 208|/*type* ArrX_Buf_search_s( ArrX_Buf*, Offset_Key* key, const char* val, type );*/ 209|#endif /* USES_OFFSET */ 210|/*void ArrX_Buf_print( ArrX_Buf*, const char* title );*/ 211|/*void ArrX_Buf_printElem( ArrX_Buf*, type, const char* title );*/ 212|#if defined(USES_ERRORS) && ! defined(ERRORS_CUT_DEBUG_TOOL) 213|void ArrX_Buf_print2( ArrX_Buf*, char* types ); 214|#endif 215| 216|#ifdef USES_SYM 217| bool ArrX_Buf_doLoopFunc( Sym_Ref* container, Sym_Ref* elem ); 218| extern Sym_Struct* ArrX_Buf_registSymStruct( Sym* ); 219| extern Sym_Struct ArrX_Buf_symStruct; 220| #define ArrX_Buf_SymElem_new( container_type, elem_type ) sizeof(elem_type) 221| #define ArrX_Buf_SymElem_delete NULL 222|#endif 223| 224|/* 内部用 */ 225|void* ArrX_Buf_get_imp( ArrX_Buf*, int i, int size ); 226|void* ArrX_Buf_alloc_imp( ArrX_Buf*, int alloc_sizeof ); 227|void* ArrX_Buf_allocs_imp( ArrX_Buf*, int alloc_sizeof, int nElem ); 228|void ArrX_Buf_free_imp( ArrX_Buf*, void* p, int free_sizeof ); 229|void* ArrX_Buf_getLast_f_imp( ArrX_Buf*, int size ); 230| 231|#ifdef USES_OFFSET 232|void* ArrX_Buf_search_i_imp( ArrX_Buf*, Offset_Key* key, int val, 233| int elem_sizeof ); 234|void* ArrX_Buf_search_d_imp( ArrX_Buf*, Offset_Key* key, double val, 235| int elem_sizeof ); 236|void* ArrX_Buf_search_s_imp( ArrX_Buf*, Offset_Key* key, const char* val, 237| int elem_sizeof ); 238|void* ArrX_Buf_search_ps_imp( ArrX_Buf*, Offset_Key* key, const char* val ); 239|#endif /* USES_OFFSET */ 240| 241|void ArrX_Buf_print_imp( ArrX_Buf*, const char* title ); 242|void ArrX_Buf_printElem_imp( ArrX_Buf*, int elem_size, const char* title ); 243| 244|/****************************************************************** 245| 9. <<< [ArrX_Able] 有効フラグ付き配列 >>> 246| 10. <<< [有効フラグ] >>> 247|【役割】 248|・配列の各要素に有効フラグを付けて、有効無効の管理を行います。 249|・配列の要素は、有効フラグは(次に示すメンバ変数)を持つ必要があります。 250| ArrX_AbleElem inherit_ArrX_AbleElem; 251|・メモリサイズは、以下の式で計算します。 252| size = sizeof(ArrX_Able) + sizeof(配列要素) * 配列要素数の最大 253| 254| 11. <<< [ArrX_AbleElem] 有効フラグ付き配列の要素(抽象クラス) >>> 255|【補足】 256|・COOL の多重継承をサポートしています。 257| 258| 12. <<< [ArrX_AbleElemP] 有効フラグ付きポインタ配列の要素 >>> 259|******************************************************************/ 260|#ifdef USES_OFFSET 261| 262|struct _ArrX_Able { 263| ArrX arr; /* extend */ 264| ERRORS_INITCHK_VAR 265|}; 266| 267|struct _ArrX_AbleElemP { 268| ArrX_AbleElem inherit_ArrX_AbleElem; 269| void* p; 270|}; 271| 272|/* void ArrX_Able_init( ArrX_Able*, void* arr_adr, int arr_size, type ); */ 273|void ArrX_Able_getMem( ArrX_Able* ); 274|/* int ArrX_Able_getN( ArrX_Able*, type ); */ 275|/* int ArrX_Able_getM( ArrX_Able*, type ); */ 276|/* int ArrX_Able_getI( ArrX_Able*, type*, type ); */ 277|/* type* ArrX_Able_get( ArrX_Able*, int i, type ); */ 278|/* type* ArrX_Able_getFirst( ArrX_Able*, type ); */ 279| void* ArrX_Able_getOver( ArrX_Able* ); 280|/* type* ArrX_Able_getNext( ArrX_Able*, type* base, type ); */ 281|/* type* ArrX_Able_getFirstDisabled( ArrX_Able*, type ); */ 282|#ifdef USES_OFFSET 283| /*type* ArrX_Able_search_s( ArrX_Able*, Offset_Key* key, const char* val, type );*/ 284| /* ArrX_Able_forEach( ArrX_Able*, type**, type ); */ 285| /* ArrX_Able_forEachDisabled( ArrX_Able*, type**, type ); */ 286| /* ArrX_Able_forEachAll( ArrX_Able*, type**, type ); */ 287|#endif /* USES_OFFSET */ 288|/* bool ArrX_Able_getAble( ArrX_Able*, int i, type ); */ 289|/* void ArrX_Able_setAble( ArrX_Able*, int i, bool flag, type ); */ 290|/* void ArrX_Able_setAbleAll( ArrX_Able*, bool flag, type ); */ 291| 292| 293|void ArrX_AbleElem_setAble( ArrX_AbleElem*, bool flag ); 294|bool ArrX_AbleElem_getAble( ArrX_AbleElem* ); 295|void ArrX_AbleElem_print( ArrX_AbleElem* ); 296| 297|/* 内部用 */ 298|void ArrX_Able_init_imp( ArrX_Able*, void* arr_adr, int arr_size, 299| int elem_size, Offset ofsFlag ); 300|#ifdef USES_OFFSET 301|void ArrX_Able_forEach_imp( void* pp, int size, Offset ofs, void* over ); 302|void ArrX_Able_forEachDisabled_imp( void* pp, int size, Offset ofs, void* over ); 303|#endif 304|int ArrX_Able_getN_imp( ArrX_Able*, int elem_size, Offset ofsFlag ); 305|void* ArrX_Able_getFirst_imp( ArrX_Able*, int elem_size, Offset ofsFlag ); 306|void* ArrX_Able_getFirstDis_imp( ArrX_Able*, int elem_size, Offset ofsFlag ); 307|void* ArrX_Able_getNext_imp( ArrX_Able*, void* base, int elem_size, 308| Offset elem_inherit ); 309|#ifdef USES_OFFSET 310| void* ArrX_Able_search_s_imp( ArrX_Able*, Offset_Key* key, const char* val, 311| int elem_sizeof, Offset elem_ofs ); 312|#endif /* USES_OFFSET */ 313| 314| 315|#endif /* USES_OFFSET */ 316| 317| 318|/*********************************************************************** 319| 13. <<< [ArrX_St] 構造体内配列 >>> 320| 14. <<< [可変長構造体, 構造体内配列] >>> 321|【役割】 322|・構造体の末尾に任意要素数の配列を作成し管理します。 323|【補足】 324|・次のように構造体の末尾に ArrX_St を記述して宣言します。 325| メンバ変数名は必要ありません。配列要素の型は、関数の引数に 326| 随時指定する必要があるので、コメントしておくとよいでしょう。 327| struct { // 可変長構造体(構造体内配列を持つ配列) 328| int member; 329| int member2; 330| ArrX_St; // 〜型の任意要素数の配列 331| }; 332| (ArrX_St の定義は、優先ヘッダの中にあります。) 333|・可変長構造体のサイズは、sizeof 演算子で取得することができません。 334| ArrX_St_getSize マクロで取得します。 335|・メモリの配置は次のようになっています。 336| <IMG src="arrx4.gif"> 337|・配列に対する操作の関数の第1引数は、ArrX_St メンバのアドレスではなく、 338| 可変長構造体の先頭アドレスを指定します。 339|・文字列の集合は、StrX_Mem だけでもできます。 340|************************************************************************/ 341|void ArrX_St_initSub( void* ); /* ArrX_St のみの初期化 */ 342|/* void ArrX_St_setSubN( void*, int n, type ); */ 343|/* int ArrX_St_getSubN( void*, type ); */ 344|/* type* ArrX_St_getSub( void*, int i, type ); */ 345|/* ArrX_St_forEachSub( void*, type** ptr, type ); */ 346|int ArrX_St_getSize( void* ); 347|/* int ArrX_St_getSizeN( void*, int n, type ); */ 348|void* ArrX_St_getNext( void* ); 349| 350| 351|/****************************************************************** 352| 15. <<< [ArrX_Sort] ソート・バッファ >>> 353|【補足】 354|・ソートされた順番を求めるときに用います。 355|・ソート・バッファは、要素へのポインタの配列です。つまり、 356| 集合としての配列とは別に、ソート・バッファの配列が必要になります。 357|*******************************************************************/ 358|#ifdef USES_OFFSET 359|struct _ArrX_Sort { 360| void** first; /* ソート・バッファの先頭アドレス */ 361| void** last; /* ポインタが格納されている末尾の次のアドレス */ 362| void** bufLast; /* ソート・バッファの末尾の次のアドレス */ 363| Offset_Key* key; /* キー、Offset_Key 型の配列 */ 364| ERRORS_INITCHK_VAR 365|}; 366|void ArrX_Sort_init( ArrX_Sort*, void** mem, int mem_sizeof, 367| Offset_Key* key ); 368|int ArrX_Sort_chk( ArrX_Sort* ); 369|void ArrX_Sort_print( ArrX_Sort*, const char* title ); 370|void ArrX_Sort_toEmpty( ArrX_Sort* ); 371|int ArrX_Sort_isEmpty( ArrX_Sort* ); 372|void ArrX_Sort_pushPQ( ArrX_Sort*, void* plus ); 373|void* ArrX_Sort_popPQ( ArrX_Sort* ); 374| 375|#endif /* USES_OFFSET */ 376| 377| 378| 379|/************************************************************************** 380| 16. <<< [ArrX_Dic] ハッシュテーブルを用いた辞書 >>> 381|【補足】 382|・任意の型の構造体(データ)配列から、配列要素を検索します。 383|・検索キーは、その構造体に含まれる文字列型の要素です。 384| その検索キーを内部でハッシュ値に変換してハッシュテーブルにデータを 385| 分配しています。 386|・ハッシュテーブルは次のような構成になっています。 387| <IMG src="arrx2.gif"> 388|・サブ辞書 subDics は、要素数が width の ArrX_Buf 型の固定長配列です。 389|・配列(辞書要素)は、任意の構造体(データ)を格納する固定長配列です。 390| ただし、内部で指定した固定長配列を、それぞれのサブ辞書に等分に分配します。 391|***************************************************************************/ 392|#ifdef USES_OFFSET 393|#ifdef USES_STRX 394|struct _ArrX_Dic { 395| ArrX_Buf* subDics; /* ArrX_Buf 型配列の先頭アドレス */ 396| int width; /* ハッシュテーブルの幅 */ 397| Offset_Key* key; /* キー、Offset_Key 型のアドレス */ 398|}; 399| 400|void ArrX_Dic_init( ArrX_Dic*, 401| int width, ArrX_Buf* subDics, int subDics_sizeof, 402| Offset_Key* key, void* elems, int elems_sizeof ); 403|/*type ArrX_Dic_search( ArrX_Dic*, const char* word, type );*/ 404|/*type ArrX_Dic_alloc( ArrX_Dic*, const char* word, type );*/ 405|void ArrX_Dic_allocFromFile( ArrX_Dic*, 406| const char* path, StrX_Mem* mem ); 407| 408|void ArrX_Dic_print( ArrX_Dic* m, const char* title, int elem_size, 409| void (*elem_print)(void*,const char*) ); 410| 411| 412|/* 内部 */ 413|void* ArrX_Dic_search_imp( ArrX_Dic*, const char* word, 414| int elem_sizeof ); 415|void* ArrX_Dic_alloc_imp( ArrX_Dic*, const char* word, 416| int alloc_sizeof ); 417| 418|#endif /* USES_STRX */ 419|#endif /* USES_OFFSET */ 420| 421| 422| 423|/************************************************************************** 424| 17. <<< [ArrX_DicIter] ハッシュテーブルを用いた辞書の走査子 >>> 425|***************************************************************************/ 426|#ifdef USES_OFFSET 427|#ifdef USES_STRX 428|struct _ArrX_DicIter { 429| ArrX_Dic* dic; /* 走査対象の辞書 */ 430| ArrX_Buf* curBuf; /* 現在のサブ辞書 */ 431| void* curData; /* 現在のデータのアドレス */ 432| int iBuf; /* サブ辞書の配列番号 */ 433| int size; /* 辞書要素のサイズ */ 434|}; 435|/*void ArrX_DicIter_init( ArrX_DicIter*, ArrX_Dic*, type );*/ 436|int ArrX_DicIter_next( ArrX_DicIter* ); 437|/*type* ArrX_DicIter_ref( ArrX_DicIter*, type );*/ 438| 439|/* 内部用 */ 440|void ArrX_DicIter_init_imp( ArrX_DicIter*, ArrX_Dic* dic, int size ); 441| 442|#endif /* USES_STRX */ 443|#endif /* USES_OFFSET */ 444| 445|/****************************************************************** 446| 18. <<< [Offset_Key] キー >>> 447|【補足】 448|・検索したりソートしたりする際に対象となるキーについての情報です。 449|・キーの型の意味は次の通りです。 450| ・ArrX_Key_Int int 型 451| ・ArrX_Key_Double double 型 452| ・ArrX_Key_CString char[] 型、要素(構造体)に文字が格納されている 453| ・ArrX_Key_CStringP char* 型、要素(構造体)にポインタが格納されている 454| ・ArrX_Key_CStringPI 大文字と小文字を区別しない CStringP 455| ・ArrX_Key_CStringPW ワイルドカード付き CStringP 456|*******************************************************************/ 457|#ifdef USES_OFFSET 458|struct _ArrX_Key { 459| Offset ofs; /* 要素(構造体)中のキーのバイト位置 */ 460| int type; /* キーの型、下記の ArrX_Key_... 定数 */ 461| int direc; /* ソート方向, 下記の ArrX_Key_... 定数 */ 462| ERRORS_INITCHK_VAR 463|}; 464|enum { ArrX_Key_Int, ArrX_Key_Double, ArrX_Key_CString, ArrX_Key_CStringP, 465| ArrX_Key_CStringPI, ArrX_Key_CStringPW, ArrX_Key_StrV }; 466|enum { ArrX_Key_Up = -1, ArrX_Key_Down = +1, ArrX_Key_NoDirec = 0 }; 467| 468|void ArrX_Key_init( Offset_Key*, Offset ofs, int type, int direc ); 469|int ArrX_Key_chk( Offset_Key* ); 470|int ArrX_Key_cmp( Offset_Key*, void* data1, void* data2 ); 471|void ArrX_Key_print( Offset_Key*, const char* title ); 472|void ArrX_Key_printData( Offset_Key*, void* data, const char* title ); 473| 474|#endif /* USES_OFFSET */ 475| 476| 477|/*********************************************************************** 478| 19. <<< [ArrX_Attr] 構造体配列のメンバ変数アクセス・ツール >>> 479|【補足】 480|・構造体の配列があるとき、すべての配列要素構造体のメンバ変数を走査する 481| ポインタを管理します。 482|【例】 483| ArrX points; // XYZ 型構造体の配列 484| ArrX_Attr xpp; // メンバ変数アクセス・ツール 485| int* xp; // メンバ変数(int x;)へのポインタ 486| xp = ArrX_Attr_init_byArrX( &xpp, &points, x, XYZ ); 487| while ( ArrX_Attr_isContinue( &xpp, xp ) ) { 488| // do something using xp 489| xp = ArrX_Attr_next( &xpp, xp ); // xp++; の代わり 490| } 491|************************************************************************/ 492|typedef struct _ArrX_Attr ArrX_Attr; 493|struct _ArrX_Attr { 494| void* over; 495| int size; 496|}; 497| 498|/* void* ArrX_Attr_init_byArrX( ArrX_Attr*, ArrX* arrx, 499| attr, arrx_type ); */ 500|bool ArrX_Attr_isContinue( ArrX_Attr*, void* adr ); 501|void ArrX_Attr_next( ArrX_Attr*, void* adr ); 502| 503| 504| 505|/*********************************************************************** 506| 20. <<< [ArrX_ArrsPtrI] int 型配列のはしごポインタ >>> 507|【役割】 508|・メモリ的につながっていない複数の int 型配列の要素を走査します。 509|【補足】 510|・ArrX_ArrsPtrI は、Arrays Pointer on Integer の略です。 511|************************************************************************/ 512|typedef struct { 513| int* p; /* ポインタ, *this->p として参照可能 */ 514| int* pOver; /* p が arr[iArr] より外のアドレス */ 515| int iArr; /* arr の配列番号 */ 516| int** arr; /* p が走査する配列へのポインタの配列 */ 517| int* arr_n; /* p が走査する配列の要素数の配列 */ 518| int nArr; /* p が走査する配列の数 */ 519|} ArrX_ArrsPtrI; 520| 521|void ArrX_ArrsPtrI_init( ArrX_ArrsPtrI*, int* arr[], int arr_n[], int nArr, 522| int iArr, int p ); 523|void ArrX_ArrsPtrI_set( ArrX_ArrsPtrI*, int iArr, int p ); 524|void ArrX_ArrsPtrI_plus( ArrX_ArrsPtrI*, unsigned int plus ); 525| 526| 527|/****************************************************************** 528| 21. <<< [ArrX_Imp, ArrX_CmpF] 実装 >>> 529|【役割】 530|・内部用 531|・他のモジュールを使わないで基本型のみを用いた機能の実現 532|・ArrX_CmpF は、比較に用いる関数ポインタの型です。 533| 返り値は、標準関数の strcmp と同じです。 534| a は、配列要素へのアドレスです。b は、キーのアドレスです。 535| (ArrX_Imp_linearSearchF 関数を参照) 536|*******************************************************************/ 537|typedef int (*ArrX_CmpF)( void* a, void* b, void* param ); 538| 539|void* ArrX_Imp_linearSearch( void* start, void* last, int elem_size, 540| const void* key, int key_offset, int key_type, int key_size ); 541|void* ArrX_Imp_linearSearchF( void* start, void* last, int elem_size, 542| const void* key, int key_offset, void* param, ArrX_CmpF func ); 543|void* ArrX_Imp_linearSearchP( void** start, void** last, 544| const void* key, int key_offset, int key_type, int key_size ); 545|void* ArrX_Imp_linearSearchPF( void** start, void** last, 546| const void* key, int key_offset, void* param, ArrX_CmpF func ); 547|int ArrX_Imp_cmpMatchMask( char** a, char* b, void* dummy ); 548|int ArrX_Imp_cmpIStr( char** a, char* b, void* dummy ); 549| 550|#ifdef __cplusplus 551|} 552|#endif 553| 554|/*-----------------------------------------------------------------*/ 555|/* 22. <<< Mapping Area ------------------------------------------ >>> */ 556|/*-----------------------------------------------------------------*/ 557| 558|/**************************************************************** 559| 23. <<< [ArrX_C_getN] 要素数を返す >>> 560|*****************************************************************/ 561|#define ArrX_C_getN( arr, type ) \ 562| ( sizeof( arr ) / sizeof( type ) ) 563| 564| 565| 566|/*-------------------------------------------------------------------------*/ 567|/* 24. <<<< ◆(ArrX) 最小固定要素配列 >>>> */ 568|/*-------------------------------------------------------------------------*/ 569| 570| 571| 572|/*********************************************************************** 573| 24-1. <<< [ArrX_init_byBuf1, ArrX_init_byBuf2] ArrX_Buf から初期化する >>> 574|【引数】 575| ・ArrX* arrx; 初期化する固定要素数配列 576| ・ArrX_Buf* buf; 配列領域の元 577|【補足】 578|・ArrX_init_byBuf1 と ArrX_init_byBuf2 の間で、buf から取得した 579| (例:ArrX_Buf_alloc など)配列領域を arrx に設定します。 580|************************************************************************/ 581|#define ArrX_init_byBuf1( arrx, buf ) \ 582| (arrx)->first = (buf)->last 583| 584|#define ArrX_init_byBuf2( arrx, buf ) \ 585| { (arrx)->last = (buf)->last; \ 586| ERRORS_INITCHK( arrx, 0 ); } 587| 588| 589| 590| 591| 592|/*********************************************************************** 593| 24-2. <<< [ArrX_initPtrArr] ポインタ配列を作る >>> 594|【補足】 595|・type 型の配列 arr に格納されているすべての要素のアドレスを 596| ポインタ配列 this に格納します。ただし、メモリ領域は buf から 597| 取得します。 598|************************************************************************/ 599|#define ArrX_initPtrArr( this, buf, arr, type ) \ 600| ArrX_initPtrArr_imp( this, buf, arr, sizeof(type) ) 601| 602| 603|/*********************************************************************** 604| 24-3. <<< [ArrX_forEach] 全ての要素を走査する >>> 605|【補足】 606|・for 文の中に入れてください(下記の例を参照) 607|【例】 608| Any* p; ArrX arrx; 609| for ( ArrX_forEach( arrx, &p, Any ) ) { 610| // for 内では、p を要素へのポインタとして使用可能 611| } 612|************************************************************************/ 613|#define ArrX_forEach( arrx, pp, type ) \ 614| *(pp) = (type*)(arrx)->first; *(pp) < (type*)(arrx)->last; (*(pp))++ 615| 616| 617| 618|/**************************************************************** 619| 24-4. <<< [ArrX_getN] 要素数を返す >>> 620|*****************************************************************/ 621|#ifdef NDEBUG 622| #define ArrX_getN( arr, type ) \ 623| ( ( (char*)(arr)->last - (char*)(arr)->first ) / sizeof(type) ) 624|#else 625| #define ArrX_getN( arr, type ) \ 626| ArrX_getN_imp( arr, sizeof(type) ) 627|#endif 628| 629| 630| 631|/**************************************************************** 632| 24-5. <<< [ArrX_getSize] 要素サイズ(バイト)を返す >>> 633|*****************************************************************/ 634|#define ArrX_getSize( this ) \ 635| ( (char*)(this)->last - (char*)(this)->first ) 636| 637|/**************************************************************** 638| 24-6. <<< [ArrX_get] 配列番号から要素を返す >>> 639|【引数】 640| ・ArrX* this; 配列 641| ・int i; 配列番号 642| ・type; 配列の型 643|【補足】 644|・デバッグ時は、関数版 ArrX_get_imp を呼び出します。 645|*****************************************************************/ 646|#ifdef NDEBUG 647| #define ArrX_get( this, i, type ) \ 648| ( (type*)((this)->first) + (i) ) 649|#else 650| #define ArrX_get( this, i, type ) \ 651| ( (type*)ArrX_get_imp( this, i, sizeof(type) ) ) 652|#endif 653| 654| 655| 656|/**************************************************************** 657| 24-7. <<< [ArrX_castFrom_ArrX_Buf] ArrX 型にキャストする >>> 658|【補足】 659|・buf が参照される間、arr が存在するようにしてください。 660|・NDEBUG が define されている場合、arr は変数宣言する必要は、 661| ありません。(引数にダミーは指定しておいてください) 662|*****************************************************************/ 663|#ifdef NDEBUG 664| #define ArrX_castFrom_ArrX_Buf( arr, buf ) ((ArrX*)(buf)) 665|#else 666| #define ArrX_castFrom_ArrX_Buf( arr, buf ) \ 667| ArrX_castFrom_ArrX_Buf_imp( arr, buf ) 668|#endif 669| 670|/*********************************************************************** 671| 24-8. <<< [ArrX_memrot] 配列の要素をローテーションする >>> 672|【引数】 673| ・void* ball; ローテーションする配列要素へのアドレス 674| ・void* target; 移動先のアドレス 675| ・type; 配列要素の型 676|【補足】 677|・<IMG src="arrx3.gif"> 678|・移動は右方向にも左方向にもできます。 679|・ArrX 型の変数は必要ありません。 680|************************************************************************/ 681|#define ArrX_memrot( ball, target, type ) \ 682| {\ 683| type work; \ 684| ArrX_memrot_imp( ball, target, &work, sizeof(type) ); \ 685| } 686| 687| 688| 689|/**************************************************************** 690| 24-9. <<< [ArrX_search_i] int 型のキーで要素を検索する >>> 691|*****************************************************************/ 692|#define ArrX_search_i( this, key, val, type ) \ 693| ( (type*)ArrX_search_i_imp(this, key, val, sizeof(type)) ) 694| 695| 696|/**************************************************************** 697| 24-10. <<< [ArrX_search_d] double 型のキーで要素を検索する >>> 698|*****************************************************************/ 699|#define ArrX_search_d( this, key, val, type ) \ 700| ( (type*)ArrX_search_d_imp(this, key, val, sizeof(type)) ) 701| 702| 703|/**************************************************************** 704| 24-11. <<< [ArrX_search_s] 文字列型のキーで要素を検索する >>> 705|【引数】 706| ・ArrX* this; 配列 707| ・Offset_Key* key; 要素中のキーのタイプ 708| ・char* val; 検索するキー値 709| ・type; 要素の型 710| ・type* 返り値; 見つかった要素、または NULL 711|*****************************************************************/ 712|#define ArrX_search_s( this, key, val, type ) \ 713| ( (type*)ArrX_search_s_imp(this, key, val, sizeof(type)) ) 714| 715| 716|/**************************************************************** 717| 24-12. <<< [ArrX_search_ps] 文字列型のキーでポインタ配列の要素を検索する >>> 718|【引数】 719| ・ArrX* this; ポインタ配列 720| ・Offset_Key* key; 要素中のキーのタイプ 721| ・char* val; 検索するキー値 722| ・type; 要素の型 723| ・type* 返り値; 見つかった要素、または NULL 724|*****************************************************************/ 725|#define ArrX_search_ps( this, key, val, type ) \ 726| ( (type**)ArrX_search_ps_imp(this, key, val ) ) 727| 728| 729|/*-------------------------------------------------------------------------*/ 730|/* 25. <<<< ◆(ArrX_Buf) バッファ >>>> */ 731|/*-------------------------------------------------------------------------*/ 732| 733| 734| 735|/**************************************************************** 736| 25-1. <<< [ArrX_Buf_getLeftSize] 残りのメモリサイズを返す >>> 737|【引数】 738| ・ArrX* this; ポインタ配列 739| ・Offset_Key* key; 要素中のキーのタイプ 740| ・char* val; 検索するキー値 741| ・type; 要素の型 742| ・type* 返り値; 見つかった要素、または NULL 743|*****************************************************************/ 744|#define ArrX_Buf_getLeftSize( this, type ) \ 745| ((type*)(this)->bufLast - (type*)(this)->last) 746| 747| 748| 749|/*********************************************************************** 750| 25-2. <<< [ArrX_Buf_forEach] 全ての要素を走査する >>> 751|【補足】 752|・for 文の中に入れてください(下記の例を参照) 753|【例】 754| Any* p; ArrX_Buf arrx; 755| for ( ArrX_Buf_forEach( arrx, &p, Any ) ) { 756| // for 内では、p を要素へのポインタとして使用可能 757| } 758|************************************************************************/ 759|#define ArrX_Buf_forEach( arrx, pp, type ) \ 760| *(pp) = (type*)(arrx)->first; *(pp) < (type*)(arrx)->last; (*(pp))++ 761| 762| 763| 764|/*********************************************************************** 765| 25-3. <<< [ArrX_Buf_forEach_imp] パラメータ化された型の全ての要素を走査する >>> 766|【引数】 767| ・void** pp; ループポインタ変数のアドレス 768| ・int size; 配列要素のサイズ 769|************************************************************************/ 770|#define ArrX_Buf_forEach_imp( m, pp, type_size ) \ 771| *(pp) = (m)->first; \ 772| (char*)*(pp) < (char*)(m)->last; \ 773| *(pp) = (void*)( (char*)*(pp) + (type_size) ) 774| 775|/*********************************************************************** 776| 25-4. <<< [ArrX_Buf_forEachReverse] 全ての要素を逆順で走査する >>> 777|【補足】 778|・for 文の中に入れてください(下記の例を参照) 779|【例】 780| Any* p; ArrX_Buf arrx; 781| for ( ArrX_Buf_forEachReverse( arrx, &p, Any ) ) { 782| // for 内では、p を要素へのポインタとして使用可能 783| } 784|************************************************************************/ 785|#define ArrX_Buf_forEachReverse( arrx, pp, type ) \ 786| *(pp) = (type*)(arrx)->last - 1; *(pp) >= (type*)(arrx)->first; (*(pp))-- 787| 788|/**************************************************************** 789| 25-5. <<< [ArrX_Buf_toEmpty] バッファを空にする >>> 790|*****************************************************************/ 791|#define ArrX_Buf_toEmpty( this ) \ 792| ((this)->last = (this)->first) 793| 794| 795|/**************************************************************** 796| 25-6. <<< [ArrX_Buf_isEmpty] バッファを空かどうかを返す >>> 797|*****************************************************************/ 798|#define ArrX_Buf_isEmpty( this ) \ 799| ((this)->first == (this)->last) 800| 801|/**************************************************************** 802| 25-7. <<< [ArrX_Buf_getN] 要素数を返す >>> 803|*****************************************************************/ 804|#define ArrX_Buf_getN( arr, type ) \ 805| ( ( (char*)(arr)->last - (char*)(arr)->first ) / sizeof(type) ) 806| 807| 808|/**************************************************************** 809| 25-8. <<< [ArrX_Buf_getN_imp] パラメータ化された型の要素数を返す >>> 810|*****************************************************************/ 811|#define ArrX_Buf_getN_imp( arr, type_size ) \ 812| ( ( (char*)(arr)->last - (char*)(arr)->first ) / type_size ) 813| 814| 815|/**************************************************************** 816| 25-9. <<< [ArrX_Buf_get] 配列番号から要素を返す >>> 817|【引数】 818| ・ArrX_Buf* this; 配列 819| ・int i; 配列番号 820| ・type; 配列の型 821|【補足】 822|・デバッグ時は、関数版 ArrX_Buf_get_imp を呼び出します。 823|*****************************************************************/ 824|#ifdef NDEBUG 825| #define ArrX_Buf_get( this, i, type ) \ 826| ( (type*)((this)->first) + (i) ) 827|#else 828| #define ArrX_Buf_get( this, i, type ) \ 829| ( (type*)ArrX_Buf_get_imp( this, i, sizeof(type) ) ) 830|#endif 831| 832| 833| 834|/********************************************************************** 835| 25-10. <<< [ArrX_Buf_alloc] 指定サイズのバッファをアロケートする >>> 836|【補足】 837|・末尾の有効な要素の次に追加します。 838|***********************************************************************/ 839|#ifdef ARRX_OPTI_SIZE 840| #define ArrX_Buf_alloc( this, type ) \ 841| ( (type*)ArrX_Buf_allocs_imp( this, sizeof(type), 1 ) ) 842|#else 843| #define ArrX_Buf_alloc( this, type ) \ 844| ( (type*)ArrX_Buf_alloc_imp( this, sizeof(type) ) ) 845|#endif 846| 847| 848|/********************************************************************** 849| 25-11. <<< [ArrX_Buf_allocs] 指定サイズのバッファを複数アロケートする >>> 850|【補足】 851|・末尾の有効な要素の次に追加します。 852|***********************************************************************/ 853|#define ArrX_Buf_allocs( this, type, nElem ) \ 854| ( (type*)ArrX_Buf_allocs_imp( this, sizeof(type), nElem ) ) 855| 856| 857|/********************************************************************** 858| 25-12. <<< [ArrX_Buf_getLast] 末尾の要素を返す >>> 859| 25-13. <<< [ArrX_Buf_getLast_m, ArrX_Buf_getLast_f] >>> 860|【補足】 861|・type* ArrX_Buf_getLast( ArrX_Buf*, type ) 862|・要素が1つも無いときは、ASSERT に引っかかります。 863|***********************************************************************/ 864|#ifdef NDEBUG 865| #define ArrX_Buf_getLast ArrX_Buf_getLast_m 866|#else 867| #define ArrX_Buf_getLast ArrX_Buf_getLast_f 868|#endif 869| 870|#define ArrX_Buf_getLast_m( this, type ) \ 871| ( ((type*)(this)->last) - 1 ) 872| 873|#define ArrX_Buf_getLast_f( this, type ) \ 874| ( (type*)ArrX_Buf_getLast_f_imp( this, sizeof(type) ) ) 875| 876|/********************************************************************** 877| 25-14. <<< [ArrX_Buf_free] 指定サイズのバッファを解放する >>> 878|【補足】 879|・参照:ArrX_Buf_free_imp 880|***********************************************************************/ 881|#define ArrX_Buf_free( this, p, type ) \ 882| ArrX_Buf_free_imp( this, p, sizeof(type) ) 883| 884| 885|/**************************************************************** 886| 25-15. <<< [ArrX_Buf_search_i] int 型のキーで要素を検索する >>> 887|*****************************************************************/ 888|#define ArrX_Buf_search_i( this, key, val, type ) \ 889| ((type*)ArrX_Buf_search_i_imp( this, key, val, sizeof(type) )) 890| 891| 892|/**************************************************************** 893| 25-16. <<< [ArrX_Buf_search_d] double 型のキーで要素を検索する >>> 894|*****************************************************************/ 895|#define ArrX_Buf_search_d( this, key, val, type ) \ 896| ((type*)ArrX_Buf_search_d_imp( this, key, val, sizeof(type) )) 897| 898| 899|/**************************************************************** 900| 25-17. <<< [ArrX_Buf_search_s] 文字列型のキーで要素を検索する >>> 901|【引数】 902| ・ArrX_Buf* this; 配列 903| ・Offset_Key* key; 要素中のキーのタイプ 904| ・char* val; 検索するキー値 905| ・type; 要素の型 906| ・type* 返り値; 見つかった要素、または NULL 907|*****************************************************************/ 908|#define ArrX_Buf_search_s( this, key, val, type ) \ 909| ((type*)ArrX_Buf_search_s_imp( this, key, val, sizeof(type) )) 910| 911| 912|/**************************************************************** 913| 25-18. <<< [ArrX_Buf_print] デバッグ表示 >>> 914|*****************************************************************/ 915|#define ArrX_Buf_print( this, title ) \ 916| ArrX_Buf_print_imp( this, title ) 917| 918|/**************************************************************** 919| 25-19. <<< [ArrX_Buf_printElem] デバッグ表示 >>> 920|*****************************************************************/ 921|#define ArrX_Buf_printElem( this, type, title ) \ 922| ArrX_Buf_printElem_imp( this, sizeof(type), title ) 923| 924| 925|/*-------------------------------------------------------------------------*/ 926|/* 26. <<<< ◆(ArrX_Able) 有効フラグ付き配列 >>>> */ 927|/*-------------------------------------------------------------------------*/ 928| 929| 930| 931|/*********************************************************************** 932| 26-1. <<< [ArrX_Able_init] 初期化する(すべての要素を無効にする) >>> 933|【引数】 934| ・type* arr_adr; 配列の先頭アドレス 935| ・int arr_size; 配列のメモリサイズ 936| ・type; 配列の要素の型 937|【補足】 938|・arr_adr には、直接 malloc を指定しないでください。 939|************************************************************************/ 940|#ifdef USES_OFFSET 941| 942|#define ArrX_Able_init( this, arr_adr, arr_size, type ) \ 943| ArrX_Able_init_imp( this, (arr_adr), (arr_size), \ 944| sizeof(type), Offset_init( type, inherit_ArrX_AbleElem ) ) 945| 946|#endif 947| 948|/*********************************************************************** 949| 26-2. <<< [ArrX_Able_getMem] 使用しているメモリ領域の先頭アドレスを返す >>> 950|【引数】 951| ・void* 返り値; 使用しているメモリ領域の先頭アドレス 952|【補足】 953|・malloc で確保した領域を使用しているとき、free するために使用します。 954|************************************************************************/ 955|#define ArrX_Able_getMem( this ) \ 956| ((this)->arr.first) 957| 958| 959| 960|/*********************************************************************** 961| 26-3. <<< [ArrX_Able_getN] 有効な要素数を返す >>> 962|************************************************************************/ 963|#ifdef USES_OFFSET 964| 965|#define ArrX_Able_getN( this, type ) \ 966| ArrX_Able_getN_imp( (this), sizeof( type ), \ 967| Offset_init( type, inherit_ArrX_AbleElem ) ) 968| 969|#endif 970| 971| 972|/*********************************************************************** 973| 26-4. <<< [ArrX_Able_getM] 最大の要素数を返す >>> 974|************************************************************************/ 975|#define ArrX_Able_getM( this, type ) \ 976| ArrX_getN( &(this)->arr, type ) 977| 978| 979|/*********************************************************************** 980| 26-5. <<< [ArrX_Able_getI] 要素番号を返す >>> 981|【引数】 982| ・type* p; 要素のアドレス 983| ・int 返り値; 要素番号(0〜) 984|************************************************************************/ 985|#define ArrX_Able_getI( this, p, type ) \ 986| ( ( (char*)(p) - (char*)(this)->arr.first ) / sizeof(type) ) 987| 988| 989|/*********************************************************************** 990| 26-6. <<< [ArrX_Able_get] 要素のアドレスを返す >>> 991|【引数】 992| ・int i; 要素番号(無効の要素も数える) 993| ・type; 要素の型 994|************************************************************************/ 995|#define ArrX_Able_get( this, i, type ) \ 996| ( (type*)( (char*)(this)->arr.first + (i) * sizeof(type) ) ) 997| 998| 999|/*********************************************************************** 1000| 26-7. <<< [ArrX_Able_getFirst] 最初の有効な要素を返す >>> 1001|【引数】 1002| ・type; 要素の型 1003| ・void* 返り値; 最初の要素、NULL=要素が1つも無い 1004|************************************************************************/ 1005|#ifdef USES_OFFSET 1006| 1007|#define ArrX_Able_getFirst( this, type ) \ 1008| ( (type*)ArrX_Able_getFirst_imp( (this), sizeof( type ), \ 1009| Offset_init( type, inherit_ArrX_AbleElem ) ) ) 1010| 1011|#endif 1012| 1013| 1014|/*********************************************************************** 1015| 26-8. <<< [ArrX_Able_getOver] 配列の外(次)のアドレスを返す >>> 1016|【引数】 1017| ・ArrX_Able* this; 有効フラグ付き配列 1018| ・void* 返り値; 配列の外(次)のアドレス 1019|************************************************************************/ 1020|#define ArrX_Able_getOver( this ) \ 1021| ( (this)->arr.last ) 1022| 1023|/*********************************************************************** 1024| 26-9. <<< [ArrX_Able_getFirstDisabled] 最初の無効な要素を返す >>> 1025|【引数】 1026| ・type; 要素の型 1027| ・void* 返り値; 最初の要素、NULL=要素が1つも無い 1028|************************************************************************/ 1029|#ifdef USES_OFFSET 1030| 1031|#define ArrX_Able_getFirstDisabled( this, type ) \ 1032| (type*)ArrX_Able_getFirstDis_imp( (this), sizeof( type ), \ 1033| Offset_init( type, inherit_ArrX_AbleElem ) ) 1034| 1035|#endif 1036| 1037| 1038|/*********************************************************************** 1039| 26-10. <<< [ArrX_Able_getNext] 次の有効な要素のアドレスを返す >>> 1040|【引数】 1041| ・type* base; 基準となる要素 1042| ・type* 返り値; 次の有効な要素(base が最後なら NULL が返ります) 1043| ・type; 要素の型 1044|************************************************************************/ 1045|#define ArrX_Able_getNext( this, base, type ) \ 1046| ( (type*)ArrX_Able_getNext_imp( this, base, \ 1047| sizeof(type), Offset_init( type, inherit_ArrX_AbleElem ) ) ) 1048| 1049|/*********************************************************************** 1050| 26-11. <<< [ArrX_Able_search_s] 文字列型のキーで要素を検索する >>> 1051|【引数】 1052| ・Offset_Key* key; 検索するキーの型 1053| ・char* val; 検索するキー 1054| ・type; 要素の型 1055| ・type* 返り値; 最初に見つかった要素のアドレス(NULL=見つからない) 1056|************************************************************************/ 1057|#ifdef USES_OFFSET 1058| #define ArrX_Able_search_s( this, key, val, type ) \ 1059| ( (type*) ArrX_Able_search_s_imp( this, key, val, sizeof(type), \ 1060| Offset_init( type, inherit_ArrX_AbleElem ) ) ) 1061|#endif /* USES_OFFSET */ 1062| 1063|/*********************************************************************** 1064| 26-12. <<< [ArrX_Able_forEach] 有効な全ての要素を走査する >>> 1065|【補足】 1066|・for 文の中に入れてください(下記の例を参照) 1067|【例】 1068| Any* p; ArrX_Able arrx; 1069| for ( ArrX_Able_forEach( &arrx, &p, Any ) ) { 1070| // for 内では、p を要素へのポインタとして使用可能 1071| } 1072|************************************************************************/ 1073|#ifdef USES_OFFSET 1074| 1075|#ifdef NDEBUG 1076| 1077|#define ArrX_Able_forEach( arrx, pp, type ) \ 1078| *(pp) = (type*)(arrx)->arr.first, \ 1079| ArrX_Able_forEach_imp( pp, sizeof(type), \ 1080| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ); \ 1081| *(pp) < (type*)(arrx)->arr.last; \ 1082| *(pp) = (type*)( (char*)*(pp) + sizeof(type) ), \ 1083| ArrX_Able_forEach_imp( pp, sizeof(type), \ 1084| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ) 1085| 1086|#else 1087| 1088|#define ArrX_Able_forEach( arrx, pp, type ) \ 1089| ERRORS_INITCHK( arrx, 1 ), \ 1090| *(pp) = (type*)(arrx)->arr.first, \ 1091| ArrX_Able_forEach_imp( pp, sizeof(type), \ 1092| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ); \ 1093| *(pp) < (type*)(arrx)->arr.last; \ 1094| *(pp) = (type*)( (char*)*(pp) + sizeof(type) ), \ 1095| ArrX_Able_forEach_imp( pp, sizeof(type), \ 1096| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ) 1097| 1098|#endif 1099| 1100|#endif 1101| 1102| 1103| 1104|/*********************************************************************** 1105| 26-13. <<< [ArrX_Able_forEachDisabled] 無効な全ての要素を走査する >>> 1106|【補足】 1107|・for 文の中に入れてください(下記の例を参照) 1108|【例】 1109| Any* p; ArrX_Able arrx; 1110| for ( ArrX_Able_forEachDisabled( &arrx, &p, Any ) ) { 1111| // for 内では、p を要素へのポインタとして使用可能 1112| } 1113|************************************************************************/ 1114|#ifdef USES_OFFSET 1115| 1116|#ifdef NDEBUG 1117| 1118|#define ArrX_Able_forEachDisabled( arrx, pp, type ) \ 1119| *(pp) = (type*)(arrx)->arr.first, \ 1120| ArrX_Able_forEachDisabled_imp( pp, sizeof(type), \ 1121| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ); \ 1122| *(pp) < (type*)(arrx)->arr.last; \ 1123| *(pp) = (type*)( (char*)*(pp) + sizeof(type) ), \ 1124| ArrX_Able_forEachDisabled_imp( pp, sizeof(type), \ 1125| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ) 1126| 1127|#else 1128| 1129|#define ArrX_Able_forEachDisabled( arrx, pp, type ) \ 1130| ERRORS_INITCHK( arrx, 1 ), \ 1131| *(pp) = (type*)(arrx)->arr.first, \ 1132| ArrX_Able_forEachDisabled_imp( pp, sizeof(type), \ 1133| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ); \ 1134| *(pp) < (type*)(arrx)->arr.last; \ 1135| *(pp) = (type*)( (char*)*(pp) + sizeof(type) ), \ 1136| ArrX_Able_forEachDisabled_imp( pp, sizeof(type), \ 1137| Offset_init( type, inherit_ArrX_AbleElem ), (arrx)->arr.last ) 1138| 1139|#endif 1140| 1141|#endif 1142| 1143| 1144| 1145|/*********************************************************************** 1146| 26-14. <<< [ArrX_Able_forEachAll] 有効でない要素も全て走査する >>> 1147|【補足】 1148|・for 文の中に入れてください(下記の例を参照) 1149|【例】 1150| Any* p; ArrX_Able arrx; 1151| for ( ArrX_Able_forEach( &arrx, &p,, Any ) ) { 1152| // for 内では、p を要素へのポインタとして使用可能 1153| } 1154|************************************************************************/ 1155|#define ArrX_Able_forEachAll( arrx, pp, type ) \ 1156| *(pp) = (type*)(arrx)->arr.first; *(pp) < (type*)(arrx)->arr.last; (*(pp))++ 1157| 1158| 1159|/*********************************************************************** 1160| 26-15. <<< [ArrX_Able_getAble] 要素が有効かどうかを返す >>> 1161|【引数】 1162| ・int i; 要素番号(無効の要素も数える) 1163|************************************************************************/ 1164|#define ArrX_Able_getAble( this, i, type ) \ 1165| ((type*)( (char*)(this)->arr.first + i * sizeof(type) ))->inherit_ArrX_AbleElem 1166| 1167| 1168|/*********************************************************************** 1169| 26-16. <<< [ArrX_Able_setAble] 要素が有効かどうかを設定する >>> 1170|【引数】 1171| ・int i; 要素番号(無効の要素も数える) 1172| ・int flag; 要素が有効かどうか 1173|【補足】 1174|・本マクロを使用しないで、要素の inherit_ArrX_AbleElem メンバ変数に、 1175| 有効かどうかのフラグ値を直接代入しても構いません。 1176|************************************************************************/ 1177|#define ArrX_Able_setAble( this, i, flag, type ) \ 1178| ((type*)( (char*)(this)->arr.first + i * sizeof(type) )) \ 1179| ->inherit_ArrX_AbleElem = (flag) 1180| 1181| 1182|/*********************************************************************** 1183| 26-17. <<< [ArrX_Able_setAbleAll] 全要素に対して有効かどうか設定する >>> 1184|【引数】 1185| ・int flag; 全要素が有効かどうか 1186|************************************************************************/ 1187|#define ArrX_Able_setAbleAll( this, flag, type ) \ 1188| { \ 1189| type* _pp; \ 1190| for ( ArrX_Able_forEachAll( this, &_pp, type ) ) { \ 1191| ArrX_AbleElem_setAble( _pp, flag ); \ 1192| } \ 1193| } 1194| 1195|/*-------------------------------------------------------------------------*/ 1196|/* 27. <<<< ◆(ArrX_AbleElem) 有効フラグ付き配列の要素 >>>> */ 1197|/*-------------------------------------------------------------------------*/ 1198| 1199| 1200| 1201|/*********************************************************************** 1202| 27-1. <<< [ArrX_AbleElem_getAble] 要素が有効かどうかを返す >>> 1203|【引数】 1204| ・ArrX_AbleElem* this; 有効フラグ付き配列の要素 1205| ・bool 帰り値; 要素が有効かどうか 1206|************************************************************************/ 1207|#define ArrX_AbleElem_getAble( this ) \ 1208| ( (this)->inherit_ArrX_AbleElem ) 1209| 1210| 1211|/*********************************************************************** 1212| 27-2. <<< [ArrX_AbleElem_setAble] 要素が有効かどうかを設定する >>> 1213|【引数】 1214| ・ArrX_AbleElem* this; 有効フラグ付き配列の要素 1215| ・bool flag; 要素が有効かどうか 1216|************************************************************************/ 1217|#define ArrX_AbleElem_setAble( this, flag ) \ 1218| (this)->inherit_ArrX_AbleElem = (flag) 1219| 1220| 1221|/*********************************************************************** 1222| 27-3. <<< [ArrX_AbleElem_print] 有効かどうかを表示する >>> 1223|【引数】 1224| ・ArrX_AbleElem* this; 有効フラグ付き配列の要素 1225|************************************************************************/ 1226|#define ArrX_AbleElem_print( this ) \ 1227| Errors_printf( "able = %d", (this)->inherit_ArrX_AbleElem ) 1228| 1229| 1230|/*-------------------------------------------------------------------------*/ 1231|/* 28. <<<< ◆(ArrX_St) 構造体内配列 >>>> */ 1232|/*-------------------------------------------------------------------------*/ 1233| 1234| 1235| 1236|/*********************************************************************** 1237| 28-1. <<< [ArrX_St_initSub] 初期化する(要素数を0にする) >>> 1238|【補足】 1239|・可変長構造体の初期化関数の中で呼び出してください。 1240|************************************************************************/ 1241|#define ArrX_St_init( this ) \ 1242| (this)->ArrX_St_imp = &(this)->ArrX_St_imp + sizeof(int) 1243| 1244| 1245| 1246|/*********************************************************************** 1247| 28-2. <<< [ArrX_St_setSubN] 配列の要素数を指定する(指定の要素数を確保する) >>> 1248|************************************************************************/ 1249|#define ArrX_St_setSubN( this, n, type ) \ 1250| (this)->ArrX_St_imp = &(this)->ArrX_St_imp + sizeof(int) + (n) * sizeof(type) 1251| 1252| 1253| 1254|/*********************************************************************** 1255| 28-3. <<< [ArrX_St_getSubN] (確保してある)配列の要素数を返す >>> 1256|************************************************************************/ 1257|#define ArrX_St_getSubN( this, type ) \ 1258| ( (this)->ArrX_St_imp - &(this)->ArrX_St_imp - sizeof(int) ) / sizeof(type) 1259| 1260| 1261| 1262|/*********************************************************************** 1263| 28-4. <<< [ArrX_St_getSub] 指定番号の配列要素のアドレスを返す >>> 1264|************************************************************************/ 1265|#define ArrX_St_getSub( this, i, type ) \ 1266| (type*)(&(this)->ArrX_St_imp + sizeof(int) + (i) * sizeof(type)) 1267| 1268| 1269| 1270|/*********************************************************************** 1271| 28-5. <<< [ArrX_St_forEachSub] すべての配列要素を走査する >>> 1272|【補足】 1273|・次のように for 文の中で使用します。 1274| type* ptr; 1275| for ( ArrX_St_forEachSub( this, &ptr, type ) ) { 1276| ptr->member = 0; 1277| } 1278|************************************************************************/ 1279|#define ArrX_St_forEachSub( this, ptr, type ) \ 1280| *(ptr) = (type*)(&(this)->ArrX_St_imp + sizeof(int)); \ 1281| *(ptr) < (type*)(this)->ArrX_St_imp; \ 1282| ptr ++ 1283| 1284| 1285| 1286|/*********************************************************************** 1287| 28-6. <<< [ArrX_St_getSize] 可変長構造体のサイズを返す >>> 1288|【補足】 1289|・返り値は、ワード単位のサイズでないこともあります。(未確認) 1290|************************************************************************/ 1291|#define ArrX_St_getSize( this ) \ 1292| ( (char*)(this)->ArrX_St_imp - (char*)(this) ) 1293| 1294| 1295| 1296|/*********************************************************************** 1297| 28-7. <<< [ArrX_St_getSizeN] 要素数を指定してみて、その可変長構造体のサイズを返す >>> 1298|【補足】 1299|・返り値は、ワード単位のサイズでないこともあります。(未確認) 1300|・配列の要素数は変化しません。 1301|************************************************************************/ 1302|#define ArrX_St_getSizeN( this, n, type ) \ 1303| ( (char*)(&(this)->ArrX_St_imp + sizeof(int) + (n) * sizeof(type)) - \ 1304| (char*)(this) ) 1305| 1306| 1307| 1308|/*********************************************************************** 1309| 28-8. <<< [ArrX_St_getNext] 可変長構造体の次のアドレスを返す >>> 1310|【引数】 1311| ・void* 返り値; 可変長構造体の次のアドレス 1312|************************************************************************/ 1313|#define ArrX_St_getNext( this ) \ 1314| (this)->ArrX_St_imp 1315| 1316| 1317|/*-------------------------------------------------------------------------*/ 1318|/* 29. <<<< ◆(ArrX_Sort) ソート・バッファ >>>> */ 1319|/*-------------------------------------------------------------------------*/ 1320| 1321| 1322| 1323| 1324|/**************************************************************** 1325| 29-1. <<< [ArrX_Sort_toEmpty] ソート・バッファを空にする >>> 1326|*****************************************************************/ 1327|#ifdef USES_OFFSET 1328| 1329|#define ArrX_Sort_toEmpty( this ) \ 1330| ((this)->last = (this)->first) 1331| 1332|#endif 1333| 1334| 1335|/**************************************************************** 1336| 29-2. <<< [ArrX_Sort_isEmpty] 空かどうか調べる >>> 1337|*****************************************************************/ 1338|#ifdef USES_OFFSET 1339| 1340|#define ArrX_Sort_isEmpty( this ) \ 1341| ( (this)->first == (this)->last ) 1342| 1343|#endif 1344| 1345|/**************************************************************** 1346| 29-3. <<< [ArrX_Sort_forEachPQ] ソート・バッファが空になるまで取得ループする >>> 1347|【補足】 1348|・for 文の中に入れてください(下記の例を参照) 1349|・バッファが空の場合はエラーになるので if 文で分岐してください。 1350|【例】 1351| Any* p; ArrX_Sort arrx; 1352| if ( ! ArrX_Sort_isEmpty( &arrx ) ) { 1353| for ( ArrX_Sort_forEachPQ( &arrx, &p, Any ) ) { 1354| // for 内では、p を要素へのポインタとして使用可能 1355| } 1356| } 1357|*****************************************************************/ 1358|#ifdef USES_OFFSET 1359| 1360|#define ArrX_Sort_forEachPQ( arrx, pp, type ) \ 1361| *(pp) = ( ArrX_Sort_isEmpty( arrx ) ? NULL : (type*)ArrX_Sort_popPQ( arrx ) ); \ 1362| *(pp) != NULL; \ 1363| *(pp) = ( ArrX_Sort_isEmpty( arrx ) ? NULL : (type*)ArrX_Sort_popPQ( arrx ) ) 1364| 1365|#endif 1366| 1367| 1368|/*-------------------------------------------------------------------------*/ 1369|/* 30. <<<< ◆(ArrX_Dic) ハッシュテーブルを用いた辞書 >>>> */ 1370|/*-------------------------------------------------------------------------*/ 1371| 1372| 1373|/************************************************************************** 1374| 30-1. <<< [ArrX_Dic_search] 検索する >>> 1375|【引数】 1376| ・char* word; ワード 1377| ・type; 検索対象の型 1378| ・type* 返り値; 検索された領域のアドレス、または NULL 1379|【補足】 1380|・指定したワードが辞書に登録されていない場合、NULL を返します。 1381|***************************************************************************/ 1382|#ifdef USES_OFFSET 1383| 1384|#define ArrX_Dic_search( this, word, type ) \ 1385| ( (type*)ArrX_Dic_search_imp( this, word, sizeof(type) ) ) 1386| 1387|#endif 1388| 1389| 1390|/************************************************************************** 1391| 30-2. <<< [ArrX_Dic_alloc] 指定したワードの項目を確保する >>> 1392|【引数】 1393| ・char* word; ワード 1394| ・type; 検索対象の型 1395| ・type* 返り値; 確保した領域のアドレス、または NULL 1396|【補足】 1397|・指定したワードがすでに辞書に登録されている場合、NULL を返します。 1398|***************************************************************************/ 1399|#ifdef USES_OFFSET 1400| 1401|#define ArrX_Dic_alloc( this, word, type ) \ 1402| ( (type*)ArrX_Dic_alloc_imp( this, word, sizeof(type) ) ) 1403| 1404|#endif 1405| 1406|/************************************************************************** 1407| 30-3. <<< [ArrX_DicIter_init] 走査子を初期化する >>> 1408|【補足】 1409|・初期化しただけでは、辞書要素にアクセスできません。 1410| 一度 ArrX_DicIter_next してから ArrX_DicIter_ref します。 1411|・途中で、辞書要素の構成を変更したら、動作保証しません。 1412|【例】 1413| ArrX_DicIter i; 1414| STRUCT* data; 1415| 1416| ArrX_DicIter_init( &i, dic, STRUCT ); 1417| while ( ArrX_DicIter_next( &i ) == 0 ) { 1418| data = ArrX_DicIter_ref( &i, STRUCT ); 1419| // ここで data にアクセス 1420| } 1421|***************************************************************************/ 1422|#define ArrX_DicIter_init( this, dic, type ) \ 1423| ArrX_DicIter_init_imp( this, dic, sizeof(type) ) 1424| 1425|/************************************************************************** 1426| 30-4. <<< [ArrX_DicIter_ref] 走査子からデータを参照する >>> 1427|***************************************************************************/ 1428|#define ArrX_DicIter_ref( this, type ) \ 1429| ((type*)((this)->curData)) 1430| 1431|/*-------------------------------------------------------------------------*/ 1432|/* 31. <<<< ◆(ArrX_Attr) 構造体配列のメンバ変数アクセス・ツール >>>> */ 1433|/*-------------------------------------------------------------------------*/ 1434| 1435| 1436|/*********************************************************************** 1437| 31-1. <<< [ArrX_Attr_init_byArrX] ArrX 型配列から初期化する >>> 1438|【引数】 1439| ・ArrX_Attr* this; 構造体配列のメンバ変数アクセス・ツール 1440| ・ArrX* arrx; 配列 1441| ・attr; メンバ変数名 1442| ・arrx_type; 配列の型(attr を含む構造体の型) 1443| ・void* 返り値; 最初にアクセスするメンバ変数のアドレス 1444|************************************************************************/ 1445|#define ArrX_Attr_init_byArrX( this, arrx, attr, arrx_type ) \ 1446| ( (this)->over = (arrx)->last, \ 1447| (this)->size = sizeof(arrx_type), \ 1448| (void*)&((arrx_type*)(arrx)->first)->attr ) 1449| 1450| 1451| 1452|/*********************************************************************** 1453| 31-2. <<< [ArrX_Attr_isContinue] ループを続けるかどうかを返す >>> 1454|【引数】 1455| ・ArrX_Attr* this; 構造体配列のメンバ変数アクセス・ツール 1456| ・void* adr; 前回アクセスしたメンバ変数のアドレス 1457| ・bool 返り値; ループを続けるかどうか(adr が有効かどうか) 1458|【補足】 1459|・通常、while 文の中に入れます。 1460|************************************************************************/ 1461|#define ArrX_Attr_isContinue( this, adr ) \ 1462| ( (adr) < (this)->over ) 1463| 1464| 1465| 1466|/*********************************************************************** 1467| 31-3. <<< [ArrX_Attr_next] 次にアクセスするメンバ変数のアドレスを返す >>> 1468|【引数】 1469| ・ArrX_Attr* this; 構造体配列のメンバ変数アクセス・ツール 1470| ・void* adr; メンバ変数へのポインタ 1471| ・bool 返り値; 次にアクセスするメンバ変数のアドレス 1472|************************************************************************/ 1473|#define ArrX_Attr_next( this, adr ) \ 1474| ( (void*)( (char*)adr + (this)->size ) ) 1475| 1476| 1477| 1478| 1479|#endif /* ARRX_H */ 1480| 1481|