SIS
Symmetric Index Structures
|
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