SIS
Symmetric Index Structures
/Users/dbr/ma/src/bas/lml/bitSequence.c
Go to the documentation of this file.
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 }