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|