ARRAYU3.H

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

目次

型・クラス・構造体一覧

マクロ一覧


   1|/**************************************************************************
   2|*  1. <<< 配列使用管理・メモリ領域 (ArrayU3) >>> 
   3|***************************************************************************/
   4|
   5|#ifndef __ARRAYU3_H
   6|#define __ARRAYU3_H
   7|
   8|/*----------------------------------------------------------------------
   9|[Module Property]
  10|name = ArrayU3
  11|title = 配列使用管理・メモリ領域
  12|category = コンテナ
  13|src = arrayu3.c
  14|depend =
  15|priority =
  16|accord =
  17|----------------------------------------------------------------------*/
  18|
  19|#ifndef USES_PRIORITY_HEADER
  20|/*[START_OF_PRIORITY_HEADER]*/
  21|#define  USES_ARRAYU3
  22|typedef struct _ArrayU3       ArrayU3;
  23|typedef struct _ArrayU3_Elem  ArrayU3_Elem;
  24|/*[END_OF_PRIORITY_HEADER]*/
  25|#endif /* USES_PRIORITY_HEADER */
  26|
  27|
  28| 
  29|/*-------------------------------------------------------------------*/
  30|/* 2. <<< Interface Area ------------------------------------------ >>> */ 
  31|/*-------------------------------------------------------------------*/
  32|
  33|
  34| 
  35|/**************************************************************************
  36|*  3. <<< [ArrayU3] 配列使用管理・メモリ領域 >>> 
  37|*
  38|*【役割】
  39|*・配列要素の使用状態/未使用状態を管理します。
  40|*・ArrayU3_use, ArrayU3_disuse 関数を用いて、任意の要素を使用状態または
  41|*  未使用状態に変更します。
  42|*・使用/未使用状態の配列要素を検索、列挙することができます。更に、
  43|*  RLU アルゴリズムを使っているので、最も古くアクセスした要素から
  44|*  列挙させることができます。
  45|*
  46|*【内部補足】
  47|*・管理配列の構造は次の通り。
  48|*  
  49|*・通常の配列に比べ、双方向リストのポインタを持っているため、 全体のサイズが
  50|*  sizeof(int) * 2 * 要素数 だけ大きくなります。
  51|*・使用状態と未使用状態の2つのリストを持っています。
  52|*・リスト構造は、iNoUseTop または iUseTop から始まり、
  53|*  iNext をたどって -1 で終わります。
  54|*  逆方向は、iNoUseLast から始まり、iPrev をたどって -1 で終わります。
  55|*・iNoUseTop が最も古く、iNoUseLast が最も新しく未使用になった
  56|*  「管理配列要素」です。
  57|***************************************************************************/
  58|struct _ArrayU3 {
  59|  char*  p;         /* 「管理配列」の先頭アドレス */
  60|  int    size;      /* 「管理配列要素」1つのサイズ */
  61|  int iUseTop;   /* 使用状態にある先頭の「管理配列要素」の番号 */
  62|  int iNoUseTop; /* 未使用状態にある先頭の(古い)「管理配列要素」の番号 */
  63|  int iNoUseLast;/* 未使用状態にある末尾の(最新)「管理配列要素」の番号 */
  64|  int nNoUseButValid;/* 一度使用状態になった未使用状態「管理配列要素」の数 */
  65|};
  66|
  67|void  ArrayU3_init( ArrayU3*, char* p, int size, int nElem );
  68|int   ArrayU3_getMemSize( int user_size, int nUser );
  69|/*type ArrayU3_getElem( ArrayU3*, int i, type );*/
  70|int   ArrayU3_getI( ArrayU3*, char* elem );
  71|int   ArrayU3_getNElem( ArrayU3* );
  72|
  73|/* type* ArrayU3_alloc( ArrayU3*, type ); */
  74|void  ArrayU3_free( ArrayU3*, void* elem );
  75|
  76|void  ArrayU3_use( ArrayU3*, int i );
  77|void  ArrayU3_disuse( ArrayU3*, int i );
  78|int   ArrayU3_isUse( ArrayU3*, int i );
  79|
  80|int   ArrayU3_getNoUseTop( ArrayU3* );
  81|void  ArrayU3_useTop( ArrayU3* );
  82|int   ArrayU3_getUseTop( ArrayU3* );
  83|int   ArrayU3_getNext( ArrayU3*, int i );
  84|int   ArrayU3_getPrev( ArrayU3*, int i );
  85|
  86|void  ArrayU3_watch( ArrayU3* );
  87|void  ArrayU3_print( ArrayU3* );
  88|void  ArrayU3_print2( ArrayU3*, int n );
  89|
  90|/* private */
  91|void* ArrayU3_alloc_imp( ArrayU3* );
  92|char* ArrayU3_getPElem( ArrayU3*, int i );
  93|ArrayU3_Elem*  ArrayU3_getInElem( ArrayU3*, int i );
  94|
  95|
  96| 
  97|/**************************************************************************
  98|*  4. <<< [ArrayU3_Elem] 管理された配列要素 >>> 
  99|*【役割】
 100|*・配列使用管理(ArrayU3 型)に管理される1つの要素です。
 101|*【補足】
 102|*・elem のサイズは[1]と書いてありますが、実際は ArrayU3.size - sizeof(int)*2
 103|*  の可変長になっています。
 104|***************************************************************************/
 105|struct _ArrayU3_Elem {
 106|  int    iPrev;     /* 前の ArrayU3_Elem 型配列の配列番号(リスト構造)*/
 107|  int    iNext;     /* 後の ArrayU3_Elem 型配列の配列番号(リスト構造)*/
 108|  char   elem[1];   /* 配列に含まれるデータ要素(補足を参照)*/
 109|};
 110|
 111|
 112| 
 113|/*-------------------------------------------------------------------*/
 114|/* 5. <<< Mapping Area -------------------------------------------- >>> */ 
 115|/*-------------------------------------------------------------------*/
 116|
 117| 
 118|/**************************************************************************
 119|*  6. <<< [ArrayU3_getMemSize] 必要なメモリサイズを返す >>> 
 120|*【引数】
 121|*  ・int  user_size;  配列に含まれる1つのデータ要素のサイズ
 122|*  ・int  nUser;      配列の要素数
 123|*【補足】
 124|*・この関数は、ArrayU3_init 関数の引数に指定するメモリ領域の
 125|*  サイズを求めるために用います。
 126|***************************************************************************/
 127|#define  ArrayU3_getMemSize( user_size, nUser ) \
 128|  ( ((user_size) + sizeof(int)*2) * (nUser) )
 129|
 130|
 131| 
 132|/**************************************************************************
 133|*  7. <<< [ArrayU3_getElem] データ要素を返す >>> 
 134|*【引数】
 135|*  ・type;  返り値の型、type には要素の型を指定する
 136|***************************************************************************/
 137|#define  ArrayU3_getElem( this, i, type ) \
 138|  (*( (type*)ArrayU3_getPElem( this, i ) ))
 139|
 140|
 141| 
 142|/**************************************************************************
 143|*  8. <<< [ArrayU3_alloc] 配列要素を確保する >>> 
 144|*【引数】
 145|*  ・ArrayU3* this;   「配列使用管理」のアドレス
 146|*  ・type             配列要素の型
 147|*  ・type*  返り値;   確保した配列要素の先頭アドレス
 148|***************************************************************************/
 149|#define  ArrayU3_alloc( this, type ) \
 150|  ((type*)ArrayU3_alloc_imp( this ))
 151|
 152|
 153| 
 154|/**************************************************************************
 155|*  9. <<< [ArrayU3_getNoUseTop] 未使用状態にある先頭(古い)の配列番号を返す >>> 
 156|*【補足】
 157|*・未使用配列要素が無い場合は -1 を返します。
 158|***************************************************************************/
 159|#define  ArrayU3_getNoUseTop( this )  (this)->iNoUseTop
 160|
 161|
 162| 
 163|/**************************************************************************
 164|*  10. <<< [ArrayU3_getNoUseLast] 未使用状態にある末尾(最新)の配列番号を返す >>> 
 165|*【補足】
 166|*・未使用配列要素が無い場合は -1 を返します。
 167|***************************************************************************/
 168|#define  ArrayU3_getNoUseLast( this )  (this)->iNoUseLast
 169|
 170|
 171| 
 172|/**************************************************************************
 173|*  11. <<< [ArrayU3_getUseTop] 使用状態にある先頭の配列番号を返す >>> 
 174|*【補足】
 175|*・使用配列要素が無い場合は -1 を返します。
 176|***************************************************************************/
 177|#define  ArrayU3_getUseTop( this )  (this)->iUseTop
 178|
 179|
 180| 
 181|/**************************************************************************
 182|*  12. <<< [ArrayU3_getInElem] 管理された配列要素を返す >>> 
 183|*【引数】
 184|*  ・int  i;                配列番号
 185|*  ・ArrayU3_Elem* 返り値;  管理された配列要素のアドレス
 186|*【補足】
 187|*・内部用です。
 188|***************************************************************************/
 189|#define  ArrayU3_getInElem( this, i ) \
 190|  ((ArrayU3_Elem*)((this)->p + (this)->size * (i)))
 191|
 192|
 193| 
 194|#endif 
 195| 
 196|