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