00001
00021 #include "msatInt.h"
00022
00026
00027 static int Msat_IntVecSortCompare1( int * pp1, int * pp2 );
00028 static int Msat_IntVecSortCompare2( int * pp1, int * pp2 );
00029
00033
00045 Msat_IntVec_t * Msat_IntVecAlloc( int nCap )
00046 {
00047 Msat_IntVec_t * p;
00048 p = ALLOC( Msat_IntVec_t, 1 );
00049 if ( nCap > 0 && nCap < 16 )
00050 nCap = 16;
00051 p->nSize = 0;
00052 p->nCap = nCap;
00053 p->pArray = p->nCap? ALLOC( int, p->nCap ) : NULL;
00054 return p;
00055 }
00056
00068 Msat_IntVec_t * Msat_IntVecAllocArray( int * pArray, int nSize )
00069 {
00070 Msat_IntVec_t * p;
00071 p = ALLOC( Msat_IntVec_t, 1 );
00072 p->nSize = nSize;
00073 p->nCap = nSize;
00074 p->pArray = pArray;
00075 return p;
00076 }
00077
00089 Msat_IntVec_t * Msat_IntVecAllocArrayCopy( int * pArray, int nSize )
00090 {
00091 Msat_IntVec_t * p;
00092 p = ALLOC( Msat_IntVec_t, 1 );
00093 p->nSize = nSize;
00094 p->nCap = nSize;
00095 p->pArray = ALLOC( int, nSize );
00096 memcpy( p->pArray, pArray, sizeof(int) * nSize );
00097 return p;
00098 }
00099
00111 Msat_IntVec_t * Msat_IntVecDup( Msat_IntVec_t * pVec )
00112 {
00113 Msat_IntVec_t * p;
00114 p = ALLOC( Msat_IntVec_t, 1 );
00115 p->nSize = pVec->nSize;
00116 p->nCap = pVec->nCap;
00117 p->pArray = p->nCap? ALLOC( int, p->nCap ) : NULL;
00118 memcpy( p->pArray, pVec->pArray, sizeof(int) * pVec->nSize );
00119 return p;
00120 }
00121
00133 Msat_IntVec_t * Msat_IntVecDupArray( Msat_IntVec_t * pVec )
00134 {
00135 Msat_IntVec_t * p;
00136 p = ALLOC( Msat_IntVec_t, 1 );
00137 p->nSize = pVec->nSize;
00138 p->nCap = pVec->nCap;
00139 p->pArray = pVec->pArray;
00140 pVec->nSize = 0;
00141 pVec->nCap = 0;
00142 pVec->pArray = NULL;
00143 return p;
00144 }
00145
00157 void Msat_IntVecFree( Msat_IntVec_t * p )
00158 {
00159 FREE( p->pArray );
00160 FREE( p );
00161 }
00162
00174 void Msat_IntVecFill( Msat_IntVec_t * p, int nSize, int Entry )
00175 {
00176 int i;
00177 Msat_IntVecGrow( p, nSize );
00178 p->nSize = nSize;
00179 for ( i = 0; i < p->nSize; i++ )
00180 p->pArray[i] = Entry;
00181 }
00182
00194 int * Msat_IntVecReleaseArray( Msat_IntVec_t * p )
00195 {
00196 int * pArray = p->pArray;
00197 p->nCap = 0;
00198 p->nSize = 0;
00199 p->pArray = NULL;
00200 return pArray;
00201 }
00202
00214 int * Msat_IntVecReadArray( Msat_IntVec_t * p )
00215 {
00216 return p->pArray;
00217 }
00218
00230 int Msat_IntVecReadSize( Msat_IntVec_t * p )
00231 {
00232 return p->nSize;
00233 }
00234
00246 int Msat_IntVecReadEntry( Msat_IntVec_t * p, int i )
00247 {
00248 assert( i >= 0 && i < p->nSize );
00249 return p->pArray[i];
00250 }
00251
00263 void Msat_IntVecWriteEntry( Msat_IntVec_t * p, int i, int Entry )
00264 {
00265 assert( i >= 0 && i < p->nSize );
00266 p->pArray[i] = Entry;
00267 }
00268
00280 int Msat_IntVecReadEntryLast( Msat_IntVec_t * p )
00281 {
00282 return p->pArray[p->nSize-1];
00283 }
00284
00296 void Msat_IntVecGrow( Msat_IntVec_t * p, int nCapMin )
00297 {
00298 if ( p->nCap >= nCapMin )
00299 return;
00300 p->pArray = REALLOC( int, p->pArray, nCapMin );
00301 p->nCap = nCapMin;
00302 }
00303
00315 void Msat_IntVecShrink( Msat_IntVec_t * p, int nSizeNew )
00316 {
00317 assert( p->nSize >= nSizeNew );
00318 p->nSize = nSizeNew;
00319 }
00320
00332 void Msat_IntVecClear( Msat_IntVec_t * p )
00333 {
00334 p->nSize = 0;
00335 }
00336
00348 void Msat_IntVecPush( Msat_IntVec_t * p, int Entry )
00349 {
00350 if ( p->nSize == p->nCap )
00351 {
00352 if ( p->nCap < 16 )
00353 Msat_IntVecGrow( p, 16 );
00354 else
00355 Msat_IntVecGrow( p, 2 * p->nCap );
00356 }
00357 p->pArray[p->nSize++] = Entry;
00358 }
00359
00371 int Msat_IntVecPushUnique( Msat_IntVec_t * p, int Entry )
00372 {
00373 int i;
00374 for ( i = 0; i < p->nSize; i++ )
00375 if ( p->pArray[i] == Entry )
00376 return 1;
00377 Msat_IntVecPush( p, Entry );
00378 return 0;
00379 }
00380
00392 void Msat_IntVecPushUniqueOrder( Msat_IntVec_t * p, int Entry, int fIncrease )
00393 {
00394 int Entry1, Entry2;
00395 int i;
00396 Msat_IntVecPushUnique( p, Entry );
00397
00398 for ( i = p->nSize-1; i > 0; i-- )
00399 {
00400 Entry1 = p->pArray[i ];
00401 Entry2 = p->pArray[i-1];
00402 if ( fIncrease && Entry1 >= Entry2 ||
00403 !fIncrease && Entry1 <= Entry2 )
00404 break;
00405 p->pArray[i ] = Entry2;
00406 p->pArray[i-1] = Entry1;
00407 }
00408 }
00409
00410
00422 int Msat_IntVecPop( Msat_IntVec_t * p )
00423 {
00424 assert( p->nSize > 0 );
00425 return p->pArray[--p->nSize];
00426 }
00427
00439 void Msat_IntVecSort( Msat_IntVec_t * p, int fReverse )
00440 {
00441 if ( fReverse )
00442 qsort( (void *)p->pArray, p->nSize, sizeof(int),
00443 (int (*)(const void *, const void *)) Msat_IntVecSortCompare2 );
00444 else
00445 qsort( (void *)p->pArray, p->nSize, sizeof(int),
00446 (int (*)(const void *, const void *)) Msat_IntVecSortCompare1 );
00447 }
00448
00460 int Msat_IntVecSortCompare1( int * pp1, int * pp2 )
00461 {
00462
00463 if ( *pp1 < *pp2 )
00464 return -1;
00465 if ( *pp1 > *pp2 )
00466 return 1;
00467 return 0;
00468 }
00469
00481 int Msat_IntVecSortCompare2( int * pp1, int * pp2 )
00482 {
00483
00484 if ( *pp1 > *pp2 )
00485 return -1;
00486 if ( *pp1 < *pp2 )
00487 return 1;
00488 return 0;
00489 }
00490
00494
00495