SIS
Symmetric Index Structures
/Users/dbr/ma/src/bas/lml/sequence.h
Go to the documentation of this file.
00001 #ifndef _HEADER_FILE_SEQUENCE_
00002 #define _HEADER_FILE_SEQUENCE_
00003 
00004 #define mSequenceDeclare(Type)\
00005 typedef struct t##Type##Sequence{\
00006     Type * seq;\
00007     UINT seqStored;\
00008     UINT seqAlloced;\
00009     SINT growth;\
00010 } Type##Sequence;\
00011 Type##Sequence * Type##SequenceInit();\
00012 Type##Sequence * Type##SequenceInit2( UINT seqAlloced, SINT growth );\
00013 void Type##SequenceFree( Type##Sequence * seq );\
00014 void Type##SequenceAdd( Type##Sequence * seq, Type elementToAdd );\
00015 void Type##SequenceWrite( const Type##Sequence * seq, FILE * fp );\
00016 Type##Sequence * Type##SequenceRead( FILE * fp );\
00017 void Type##SequenceAlloc( Type##Sequence * seq, UINT seqAlloced );\
00018 void Type##SequenceShrink( Type##Sequence * seq );\
00019 void Type##SequenceAppend( Type##Sequence * seq, const Type##Sequence * s );\
00020 void Type##SequenceCpy( Type##Sequence * dest, const Type##Sequence * src );
00021 
00022     #define mSequenceDefine(Type)\
00023     Type##Sequence * Type##SequenceInit(){\
00024         return Type##SequenceInit2( 64, -1 );\
00025     }\
00026     Type##Sequence * Type##SequenceInit2( UINT seqAlloced, SINT growth ){\
00027         Type##Sequence * seq;\
00028         seq = (Type##Sequence *)Malloc( 1, sizeof(Type##Sequence) );\
00029         seq->seqStored = 0;\
00030         seq->seqAlloced = seqAlloced;\
00031         seq->growth = growth;\
00032         seq->seq = (Type *)Malloc( seqAlloced, sizeof(Type) );\
00033         return seq;\
00034     }\
00035     void Type##SequenceFree( Type##Sequence * seq ){\
00036         if( seq->seq != NULL ){\
00037             Free( seq->seq );\
00038         }\
00039         Free( seq );\
00040     }\
00041     void Type##SequenceAdd( Type##Sequence * seq, Type elementToAdd ){\
00042         if( seq->seqStored == seq->seqAlloced ){\
00043             UINT mem;\
00044             if( seq->growth < 0 ){\
00045                 mem = seq->seqAlloced + seq->seqAlloced / ((UINT)(-seq->growth));\
00046             }\
00047             else{\
00048                 mem = seq->seqAlloced + seq->growth;\
00049             }\
00050             if( mem <= seq->seqAlloced ){\
00051                 mem++;\
00052             }\
00053             seq->seq = (Type *)Realloc( seq->seq, mem, sizeof(Type) );\
00054             seq->seqAlloced = mem;\
00055         }\
00056         seq->seq[seq->seqStored] = elementToAdd;\
00057         seq->seqStored++;\
00058     }\
00059     void Type##SequenceWrite( const Type##Sequence * seq, FILE * fp ){\
00060         UINT i;\
00061         U8 * element;\
00062         if( endiannessOfThisMachine != endiannessOnWrite ){\
00063             if( sizeof(Type) != 1 ){\
00064                 for( i = 0; i < seq->seqStored; i++ ){\
00065                     element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(Type) )\
00066                 }\
00067             }\
00068             element = (U8 *)(&(seq->seqStored)); mReverseBytes( element, sizeof(UINT) )\
00069         }\
00070         mWriteEndianness( fp, endiannessOnWrite )\
00071         Fwrite( &(seq->seqStored), sizeof(UINT), 1, fp );\
00072         if( endiannessOfThisMachine != endiannessOnWrite ){\
00073             element = (U8 *)(&(seq->seqStored)); mReverseBytes( element, sizeof(UINT) )\
00074         }\
00075         Fwrite( seq->seq, sizeof(Type), seq->seqStored, fp );\
00076         if( sizeof(Type) != 1 && endiannessOfThisMachine != endiannessOnWrite ){\
00077             for( i = 0; i < seq->seqStored; i++ ){\
00078                 element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(Type) )\
00079             }\
00080         }\
00081     }\
00082     Type##Sequence * Type##SequenceRead( FILE * fp ){\
00083         UINT endianness, seqStored;\
00084         Type##Sequence * seq;\
00085         U8 * element;\
00086         UINT i;\
00087         mReadEndianness( fp, endianness )\
00088         Fread( &seqStored, sizeof(UINT), 1, fp );\
00089         if( endiannessOfThisMachine != endianness ){\
00090             element = (U8 *)(&seqStored); mReverseBytes( element, sizeof(UINT) )\
00091         }\
00092         seq = Type##SequenceInit2( seqStored, 1 );\
00093         Fread( seq->seq, sizeof(Type), seqStored, fp );\
00094         seq->seqStored = seqStored;\
00095         if( sizeof(Type) != 1 && endiannessOfThisMachine != endianness ){\
00096             for( i = 0; i < seq->seqStored; i++ ){\
00097                 element = (U8 *)( seq->seq + i ); mReverseBytes( element, sizeof(Type) )\
00098             }\
00099         }\
00100         return seq;\
00101     }\
00102     void Type##SequenceAlloc( Type##Sequence * seq, UINT seqAlloced ){\
00103         seq->seq = Realloc( seq->seq, seqAlloced, sizeof(Type) );\
00104         seq->seqAlloced = seqAlloced;\
00105     }\
00106     void Type##SequenceShrink( Type##Sequence * seq ){\
00107         Type##SequenceAlloc( seq, seq->seqStored );\
00108     }\
00109     void Type##SequenceAppend( Type##Sequence * seq, const Type##Sequence * s ){\
00110         UINT i;\
00111         for( i = 0; i < s->seqStored; i++ ){\
00112             Type##SequenceAdd( seq, s->seq[i] );\
00113         }\
00114     }\
00115     void Type##SequenceCpy( Type##Sequence * dest, const Type##Sequence * src ){\
00116         dest->seqStored = 0;\
00117         Type##SequenceAppend( dest, src );\
00118     }
00119 #endif