CASTACK2.H

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

目次

型・クラス・構造体一覧

マクロ一覧


   1|/************************************************************************** 
   2|*  1. <<< リード・キャッシュ機能付き固定長スタック (CaStack2) >>>
   3|***************************************************************************/
   4|
   5|#ifndef __CASTACK2_H
   6|#define __CASTACK2_H
   7|
   8|/*----------------------------------------------------------------------
   9|[Module Property]
  10|name = CaStack2
  11|title = リード・キャッシュ機能付き固定長スタック
  12|category = コンテナ
  13|src = castack2.c
  14|depend = ArrayU3
  15|priority =
  16|accord =
  17|----------------------------------------------------------------------*/
  18|
  19|#ifndef USES_PRIORITY_HEADER
  20|/*[START_OF_PRIORITY_HEADER]*/
  21|
  22|#define  USES_CASTACK2
  23|typedef struct _CaStack2      CaStack2;
  24|typedef struct _CaStack2_Man  CaStack2_Man;
  25|
  26|/*[END_OF_PRIORITY_HEADER]*/
  27|#endif /* USES_PRIORITY_HEADER */
  28|
  29|
  30|#ifndef USES_ARRAYU3
  31|#error
  32|#endif
  33|#include  "arrayu3.h"
  34|
  35|/*------------------------------------------------------------------------*/
  36|/* 2. <<< Interface Area ----------------------------------------------- >>> */
  37|/*------------------------------------------------------------------------*/
  38|
  39|/**************************************************************************
  40|* 3. <<<「キャッシュ・スタック管理」 [CaStack2_Man] >>>
  41|***************************************************************************/
  42|struct _CaStack2_Man {
  43|  CaStack2**  caStack; /* すべての「キャッシュ・スタック」のアドレス配列 */
  44|  int  caStack_n;      /* caStack の要素数 */
  45|  int  caStack_m;      /* caStack_n の最大 */
  46|  bool isLastHit;  /* 直前の CaStack2_alloc 関数でキャッシュがヒットしたか */
  47|};
  48|
  49|
  50|/**************************************************************************
  51|*  4. <<<「キャッシュ・スタック」 [CaStack2] >>>
  52|*【補足】
  53|*・「スタック・メモリ」は、次の構造になっています。[stack][array]
  54|*・配列 array の要素(「配列要素」)は、次の構造になっています。
  55|*  [キー][スタック要素]
  56|*・「番号スタック」pStack の要素は、スタック領域番号、
  57|*  または、スタック・ブロックのネストを示す区切りコード(-1)です。
  58|*・nStack は、使われているスタック要素の数 + スタックブロックの
  59|*  ネスト数に等しくなっています。
  60|***************************************************************************/
  61|struct _CaStack2 {
  62|  ArrayU3 arr;      /* 配列使用管理 */
  63|  int*  pStack;     /* 「番号スタック」 */
  64|  int   nStack;     /* pStack の配列要素数 */
  65|  int   mStack;     /* nStack の最大、mem_size から計算 */
  66|  int   key_size;   /* 「キー」のサイズ */
  67|};
  68|
  69|void  CaStack2_init( CaStack2* this, CaStack2_Man* man, char* mem,
  70|  int elem_size, int key_size, int mElem );
  71|int  CaStack2_getMemSize( int elem_size, int key_size, int mElem );
  72|CaStack2_Man* CaStack2_getMan( CaStack2** caStack, int caStack_n );
  73|void  CaStack2_start(void);
  74|void  CaStack2_end(void);
  75|/* type CaStack2_alloc2( CaStack2* this, void* pKey, bool isLock, type ); */
  76|void* CaStack2_alloc2p( CaStack2* this, void* pKey, bool isLock );
  77|void  CaStack2_free( CaStack2* this, void* elem );
  78|int   CaStack2_isHit(void);
  79|void  CaStack2_check(void);
  80|
  81|
  82|/**************************************************************************
  83|* 5. <<<「配列要素」 [CaStack2_Elem] >>>
  84|***************************************************************************/
  85|typedef  char  CaStack2_Elem;
  86|char*  CaStack2_Elem_getPKey( CaStack2_Elem* this, CaStack2* cas );
  87|char*  CaStack2_Elem_getPField( CaStack2_Elem* this, CaStack2* cas );
  88|
  89|
  90|/**************************************************************************
  91|* 6. <<<「スタック要素」 [CaStack_Field] >>>
  92|***************************************************************************/
  93|int  CaStack2_Field_getI( void* field );
  94|bool CaStack2_Field_isLock( void* field, CaStack2* cas );
  95|
  96|
  97|/*------------------------------------------------------------------------*/
  98|/* 7. <<< Mapping Area ------------------------------------------------- >>> */
  99|/*------------------------------------------------------------------------*/
 100|
 101|/**************************************************************************
 102|*  8. <<<「スタック要素」を確保してロックする [CaStack2_alloc2] >>>
 103|*【補足】
 104|*・type は、レコードサイズの大きさにも関わらず void*, char* にしても
 105|*  構いません。
 106|***************************************************************************/
 107|#define  CaStack2_alloc2( this, pKey, bLock, type ) \
 108|         ((type)CaStack2_alloc2p( this, pKey, bLock ))
 109|
 110|
 111|/**************************************************************************
 112|*  「スタック・メモリ」に必要なサイズを返す
 113|*【引数】
 114|*  ・int elem_size;     「スタック要素」のサイズ(byte)
 115|*  ・int key_size;      「キー」のサイズ(byte)
 116|*  ・int mElem;         「スタック要素」の最大数
 117|*  ・int 返り値;        「スタック・メモリ」に必要なサイズ
 118|***************************************************************************/
 119|#define  CaStack2_getMemSize( elem_size, key_size, mElem ) \
 120|  (sizeof(int) * (mElem) * 2 \
 121|  + ArrayU3_getMemSize( elem_size, (key_size) + (mElem) ) )
 122|
 123|
 124|/**************************************************************************
 125|*  「配列要素」の「キー」のアドレスを返す
 126|*【引数】
 127|*  ・CaStack2_Elem* this;  「配列要素」
 128|*  ・CaStack2*  cas;       所属している「キャッシュ・スタック」
 129|*  ・char*  返り値;       「キー」のアドレス
 130|***************************************************************************/
 131|#define  CaStack2_Elem_getPKey( this, caStack )  ((char*)(this))
 132|
 133|
 134|/**************************************************************************
 135|*  「配列要素」の「スタック要素」のアドレスを返す
 136|*【引数】
 137|*  ・CaStack2_Elem* this;  「配列要素」
 138|*  ・CaStack2*  caStack;   所属している「キャッシュ・スタック」
 139|*  ・char*  返り値;       「スタック要素」のアドレス
 140|***************************************************************************/
 141|#define  CaStack2_Elem_getPField( this, caStack ) \
 142|  ((char*)(this) + (caStack)->key_size)
 143|
 144|
 145|/**************************************************************************
 146|* 「スタック要素」が所属する「配列要素」の番号を返す
 147|*【引数】
 148|*  ・void* field;         「スタック要素」のアドレス
 149|*  ・CaStack2*  caStack;   所属している「キャッシュ・スタック」
 150|*  ・int  返り値;         「配列要素」の番号
 151|*【補足】
 152|*・int  CaStack2_Field_getI( void* field, CaStack2* caStack );
 153|***************************************************************************/
 154|#define  CaStack2_Field_getI( this, caStack ) \
 155|  ArrayU3_getI( &(caStack)->arr, (char*)(this) - (caStack)->key_size )
 156|
 157|
 158|#endif  /* __CASTACK2 */
 159| 
 160|