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|