SIS
Symmetric Index Structures
|
00001 #include "base.h" 00002 00003 #define mBitsTo64( n ) ( ((n) % 64 == 0) ? ((n)/64) : ((n)/64 + 1) ) 00004 00005 BitSequence * BitSequenceInit(){ 00006 return BitSequenceInit2( 64, -1 ); 00007 } 00008 00009 BitSequence * BitSequenceInit2( UINT seqAlloced, SINT growth ){ 00010 BitSequence * seq; 00011 00012 seq = (BitSequence *)Malloc( 1, sizeof(BitSequence) ); 00013 seq->seqStored = 0; 00014 seq->seqAlloced = seqAlloced; 00015 seq->seq = (U64 *)Malloc( mBitsTo64( seq->seqAlloced ), sizeof(U64) ); 00016 seq->growth = growth; 00017 return seq; 00018 } 00019 00020 void BitSequenceFree( BitSequence * seq ){ 00021 Free( seq->seq ); 00022 Free( seq ); 00023 } 00024 00025 void BitSequenceAdd( BitSequence * seq, UINT elementToAdd ){ 00026 if( seq->seqStored == seq->seqAlloced ){ 00027 UINT mem; 00028 if( seq->growth < 0 ){ 00029 mem = seq->seqAlloced + seq->seqAlloced / ((UINT)(-seq->growth)); 00030 } 00031 else{ 00032 mem = seq->seqAlloced + seq->growth; 00033 } 00034 if( mem <= seq->seqAlloced ){ 00035 mem++; 00036 } 00037 seq->seq = (U64 *)Realloc( seq->seq, mBitsTo64(mem), sizeof(U64) ); 00038 seq->seqAlloced = mem; 00039 } 00040 BitSequenceSet(seq, seq->seqStored, elementToAdd); 00041 seq->seqStored++; 00042 } 00043 00044 void BitSequenceWrite( BitSequence * seq, FILE * fp ){ 00045 UINT i, n; 00046 U8 * element; 00047 00048 n = mBitsTo64( seq->seqStored ); 00049 if( endiannessOfThisMachine != endiannessOnWrite ){ 00050 for( i = 0; i < n; i++ ){ 00051 element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(U64) ) 00052 } 00053 element = (U8 *)(&(seq->seqStored)); mReverseBytes( element, sizeof(UINT) ) 00054 } 00055 mWriteEndianness( fp, endiannessOnWrite ) 00056 Fwrite( &(seq->seqStored), sizeof(UINT), 1, fp ); 00057 Fwrite( seq->seq, sizeof(U64), n, fp ); 00058 if( endiannessOfThisMachine != endiannessOnWrite ){ 00059 element = (U8 *)(&(seq->seqStored)); mReverseBytes( element, sizeof(UINT) ) 00060 for( i = 0; i < n; i++ ){ 00061 element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(U64) ) 00062 } 00063 } 00064 } 00065 00066 BitSequence * BitSequenceRead( FILE * fp ){ 00067 BitSequence * seq; 00068 U8 * element; 00069 UINT i, n, seqStored, endianness; 00070 00071 mReadEndianness( fp, endianness ) 00072 Fread( &seqStored, sizeof(UINT), 1, fp ); 00073 if( endiannessOfThisMachine != endiannessOnWrite ){ 00074 element = (U8 *)(&seqStored); mReverseBytes( element, sizeof(UINT) ) 00075 } 00076 seq = BitSequenceInit2( seqStored, 1 ); 00077 Fread( seq->seq, sizeof(U64), mBitsTo64( seqStored ), fp ); 00078 seq->seqStored = seqStored; 00079 if( endiannessOfThisMachine != endiannessOnWrite ){ 00080 n = mBitsTo64( seq->seqStored ); 00081 for( i = 0; i < n; i++ ){ 00082 element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(U64) ) 00083 } 00084 } 00085 return seq; 00086 } 00087 00088 void BitSequenceShrink( BitSequence * seq ){ 00089 seq->seq = Realloc( seq->seq, mBitsTo64( seq->seqStored ), sizeof(U64) ); 00090 seq->seqAlloced = seq->seqStored; 00091 } 00092 00093 UINT BitSequenceGet( const BitSequence * seq, UINT position ){ 00094 U64 n; 00095 00096 n = 1; 00097 n <<= (position % 64); 00098 if( (seq->seq[position/64] & n) == 0 ){ 00099 return 0; 00100 } 00101 return 1; 00102 } 00103 00104 void BitSequenceSet( BitSequence * seq, UINT position, UINT value ){ 00105 U64 n; 00106 00107 n = 1; 00108 n <<= (position % 64); 00109 if( value == 0 ){ 00110 seq->seq[position/64] &= (~n); 00111 } 00112 else{ 00113 seq->seq[position/64] |= n; 00114 } 00115 } 00116 00117 void BitSequenceAppend( BitSequence * seq, const BitSequence * s ){ 00118 UINT i; 00119 00120 for( i = 0; i < s->seqStored; i++ ){ 00121 BitSequenceAdd( seq, BitSequenceGet(s, i) ); 00122 } 00123 } 00124 00125 void BitSequenceCpy( BitSequence * dest, const BitSequence * src ){ 00126 dest->seqStored = 0; 00127 BitSequenceAppend( dest, src ); 00128 }