INTX.H
[目次 | 型・クラス・構造体 | マクロ]
1|/***********************************************************************
2|* 1. <<< int 型 (IntX) >>>
3|************************************************************************/
4|
5|#ifndef __INTX_H
6|#define __INTX_H
7|
8|
9|/****************************************************************
10|* 2. <<< モジュール・プロパティ >>>
11|*****************************************************************/
12|/*----------------------------------------------------------------------
13|[Module Property]
14|name = IntX
15|title = int 型
16|category = 基本型
17|src =
18|depend = Types
19|priority =
20|accord =
21|----------------------------------------------------------------------*/
22|
23|
24|/****************************************************************
25|* 3. <<< 優先ヘッダ >>>
26|*****************************************************************/
27|#ifndef USES_PRIORITY_HEADER
28|/*[START_OF_PRIORITY_HEADER]*/
29|
30|#define USES_INTX
31|
32|typedef struct _IntX_RingChk IntX_RingChk;
33|
34|/*[END_OF_PRIORITY_HEADER]*/
35|#endif /* USES_PRIORITY_HEADER */
36|
37|
38|
39|/*-----------------------------------------------------------------*/
40|/* 4. <<< Interface Area ---------------------------------------- >>> */
41|/*-----------------------------------------------------------------*/
42|
43|
44|/***************************************************************************
45|* 5. <<< 基本 >>>
46|************************************************************************/
47|
48|int EQUAL( int a, int b );
49|int IntX_mask( int n, int i, int j );
50|int IntX_up( int n, int unit );
51|int IntX_maskUp( int n, int mask );
52|int IntX_unitUp2( int n, int unit );
53|int IntX_shr( int x, int sft );
54|bool IntX_isSameRange( int* ranges, int n );
55|int IntX_getLowestBit1( int n );
56|
57|
58|/* 内部用 */
59|int IntX_unitUp2_f( int n, int unit );
60|
61|/***********************************************************************
62|* 6. <<< [IntX_RingChk] 循環参照チェッカー >>>
63|*【補足】
64|*・循環参照が行われているかどうかをチェックします。
65|*【内部補足】
66|*・識別番号配列の先頭要素は、もっとも参照元となる要素です。
67|* それ以降は、参照関係でソートされています。ただし、隣接要素に
68|* 必ずしも参照関係があるわけではありません。
69|*・識別番号配列の奇数番目は、参照元のアドレス(int*型)が入ります。
70|************************************************************************/
71|struct _IntX_RingChk {
72| int* id; /* 識別番号(番号+ポインタ)配列の先頭アドレス */
73| int* id_last; /* 有効な識別番号配列の末尾の次のアドレス */
74| int* id_over; /* 識別番号配列の末尾の次のアドレス */
75| int* lastBase; /* 循環と判定したときの、もっとも参照先の識別番号へのアドレス */
76|};
77|
78|void IntX_RingChk_init( IntX_RingChk*, int* id, int id_size );
79|void IntX_RingChk_reset( IntX_RingChk* );
80|int IntX_RingChk_add( IntX_RingChk*, int base_id, int ref_id );
81|/* IntX_RingChk_forEachRing( IntX_RingChk*, int* ); */
82|
83|#define IntX_RingChk_OK 0 /* 現在は大丈夫です */
84|#define IntX_RingChk_Ring 1 /* 循環しています */
85|#define IntX_RingChk_Over 2 /* 識別番号配列が不足しています */
86|
87|/* 以下は内部用 */
88|int IntX_RingChk_forEachRing_imp( IntX_RingChk*, int** );
89|
90|
91|
92|/*-----------------------------------------------------------------*/
93|/* 7. <<< Mapping Area ------------------------------------------ >>> */
94|/*-----------------------------------------------------------------*/
95|
96|/***********************************************************************
97|* 8. <<< [EQUAL] 高速な int 型・等号比較 ( a == b ) >>>
98|************************************************************************/
99|#define EQUAL( a, b ) \
100| ( !( (a) ^ (b) ) )
101|
102|
103|/***************************************************************************
104|* 9. <<< [IntX_mask] i ビット目から j ビット目までを取出す, i < j >>>
105|*【補足】
106|*・取出した結果は、下位にシフトされている。
107|*・32bit int であること
108|*・unsigned IntX_mask( (unsigned) int n, int i, int j ); に相当します。
109|*【例】
110|*・n=01001010, i=2, j=6 ... ret=00010010
111|****************************************************************************/
112|#define IntX_mask( n, i, j ) \
113| ((unsigned int)n << (32-(j)-1) >> (32-(j)-(i)-1))
114|
115|
116|
117|/***************************************************************************
118|* 10. <<< [IntX_up] 繰り上げる >>>
119|*【引数】
120|* ・int n; 繰り上げる値
121|* ・int unit; 単位
122|*【例】
123|*・n = 5, unit = 3 ... ret = 6
124|*・n = 0x135, unit = 0x20 ... ret = 0x140
125|****************************************************************************/
126|#define IntX_up( n, unit ) \
127| ( ( (n) - 1 ) - ( ( (n) - 1 ) % (unit) ) + (unit) )
128|
129|
130|
131|/***************************************************************************
132|* 11. <<< [IntX_maskUp] 上位ビットにかけたマスクに収まるように繰り上げる >>>
133|*【引数】
134|* ・int n; マスクがかけられる値(繰り上げられる値)
135|* ・int mask; マスク値(上位ビットに隙間ができないこと)
136|*【例】
137|*・n = 0x123, mask = 0xFFFFFFF0 ... ret = 0x130
138|****************************************************************************/
139|#define IntX_maskUp( n, mask ) \
140| (((n) + ~(mask)) & (mask))
141|
142|
143|
144|/***************************************************************************
145|* 12. <<< [IntX_unitUp2] 指定単位の繰上げを行う(2^n 単位) >>>
146|*【引数】
147|* ・int n; 繰り上げられる値
148|* ・int unit; 単位
149|*【例】
150|*・n = 8, unit = 4 ... ret = 10
151|****************************************************************************/
152|#ifdef NDEBUG
153| #define IntX_unitUp2 IntX_unitUp2_m
154|#else
155| #define IntX_unitUp2 IntX_unitUp2_f
156|#endif
157|
158|#define IntX_unitUp2_m( n, unit ) \
159| ( ( (n)+(unit)-1 ) & ~((unit)-1) )
160|
161|
162|
163|/**************************************************************************
164|* 13. <<< [IntX_shr] 32bit 整数・符号なしシフト演算 >>>
165|*【補足】
166|*・sft が 32 以上なら 0 を返します。
167|***************************************************************************/
168|#define IntX_shr( x, sft ) ( (sft) < 32 ? (x) >> (sft) : (((x)>>31)>>1) )
169|
170|
171|
172|/**************************************************************************
173|* 14. <<< [IntX_getLowestBit1] ビットが1になっている最も下位の値を返す >>>
174|*【補足】
175|*・int IntX_getLowestBit1( int n );
176|*・引数 n と返り値の関係は次のとおり。(2) は2進数をあらわす。
177|* 0000(2) = 0, 0001(2) = 1, 0010(2) = 2, 0011(2) = 1,
178|* 0100(2) = 4, 0101(2) = 1, 0110(2) = 2, 0111(2) = 1,
179|* 1000(2) = 8, 1001(2) = 1, 1010(2) = 2, 1011(2) = 1,
180|***************************************************************************/
181|#define IntX_getLowestBit1( n ) ( (n) & -(n) )
182|
183|/***********************************************************************
184|* 15. <<< [IntX_RingChk_forEachRing] 循環している識別番号をループして取得する >>>
185|*【引数】
186|* ・int** pp; 識別番号へのポインタ(int*型)のアドレス
187|*【補足】
188|*・for 文の中で使用します。 for ( IntX_RingChk_forEachRing( ring, &p ) );
189|*・循環を判定してから一度しか使用できません。
190|************************************************************************/
191|#define IntX_RingChk_forEachRing( this, pp ) \
192| *(pp) = NULL; IntX_RingChk_forEachRing_imp( this, pp );
193|
194|
195|
196|#endif /* __INTX_H */
197|
198|