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|