00001
00021 #ifndef __VEC_VEC_H__
00022 #define __VEC_VEC_H__
00023
00027
00028 #include <stdio.h>
00029
00033
00037
00038 typedef struct Vec_Vec_t_ Vec_Vec_t;
00039 struct Vec_Vec_t_
00040 {
00041 int nCap;
00042 int nSize;
00043 void ** pArray;
00044 };
00045
00049
00050
00051 #define Vec_VecForEachLevel( vGlob, vVec, i ) \
00052 for ( i = 0; (i < Vec_VecSize(vGlob)) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ )
00053 #define Vec_VecForEachLevelStart( vGlob, vVec, i, LevelStart ) \
00054 for ( i = LevelStart; (i < Vec_VecSize(vGlob)) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ )
00055 #define Vec_VecForEachLevelStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
00056 for ( i = LevelStart; (i <= LevelStop) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i++ )
00057 #define Vec_VecForEachLevelReverse( vGlob, vVec, i ) \
00058 for ( i = Vec_VecSize(vGlob) - 1; (i >= 0) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i-- )
00059 #define Vec_VecForEachLevelReverseStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
00060 for ( i = LevelStart; (i >= LevelStop) && (((vVec) = (Vec_Ptr_t*)Vec_VecEntry(vGlob, i)), 1); i-- )
00061
00062
00063 #define Vec_VecForEachEntry( vGlob, pEntry, i, k ) \
00064 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
00065 Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k )
00066 #define Vec_VecForEachEntryLevel( vGlob, pEntry, i, Level ) \
00067 Vec_PtrForEachEntry( Vec_VecEntry(vGlob, Level), pEntry, i )
00068 #define Vec_VecForEachEntryStart( vGlob, pEntry, i, k, LevelStart ) \
00069 for ( i = LevelStart; i < Vec_VecSize(vGlob); i++ ) \
00070 Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k )
00071 #define Vec_VecForEachEntryStartStop( vGlob, pEntry, i, k, LevelStart, LevelStop ) \
00072 for ( i = LevelStart; i <= LevelStop; i++ ) \
00073 Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k )
00074 #define Vec_VecForEachEntryReverse( vGlob, pEntry, i, k ) \
00075 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
00076 Vec_PtrForEachEntryReverse( Vec_VecEntry(vGlob, i), pEntry, k )
00077 #define Vec_VecForEachEntryReverseReverse( vGlob, pEntry, i, k ) \
00078 for ( i = Vec_VecSize(vGlob) - 1; i >= 0; i-- ) \
00079 Vec_PtrForEachEntryReverse( Vec_VecEntry(vGlob, i), pEntry, k )
00080 #define Vec_VecForEachEntryReverseStart( vGlob, pEntry, i, k, LevelStart ) \
00081 for ( i = LevelStart; i >= 0; i-- ) \
00082 Vec_PtrForEachEntry( Vec_VecEntry(vGlob, i), pEntry, k )
00083
00087
00099 static inline Vec_Vec_t * Vec_VecAlloc( int nCap )
00100 {
00101 Vec_Vec_t * p;
00102 p = ALLOC( Vec_Vec_t, 1 );
00103 if ( nCap > 0 && nCap < 8 )
00104 nCap = 8;
00105 p->nSize = 0;
00106 p->nCap = nCap;
00107 p->pArray = p->nCap? ALLOC( void *, p->nCap ) : NULL;
00108 return p;
00109 }
00110
00122 static inline Vec_Vec_t * Vec_VecStart( int nSize )
00123 {
00124 Vec_Vec_t * p;
00125 int i;
00126 p = Vec_VecAlloc( nSize );
00127 for ( i = 0; i < nSize; i++ )
00128 p->pArray[i] = Vec_PtrAlloc( 0 );
00129 p->nSize = nSize;
00130 return p;
00131 }
00132
00144 static inline void Vec_VecExpand( Vec_Vec_t * p, int Level )
00145 {
00146 int i;
00147 if ( p->nSize >= Level + 1 )
00148 return;
00149 Vec_PtrGrow( (Vec_Ptr_t *)p, Level + 1 );
00150 for ( i = p->nSize; i <= Level; i++ )
00151 p->pArray[i] = Vec_PtrAlloc( 0 );
00152 p->nSize = Level + 1;
00153 }
00154
00166 static inline int Vec_VecSize( Vec_Vec_t * p )
00167 {
00168 return p->nSize;
00169 }
00170
00182 static inline void * Vec_VecEntry( Vec_Vec_t * p, int i )
00183 {
00184 assert( i >= 0 && i < p->nSize );
00185 return p->pArray[i];
00186 }
00187
00199 static inline void Vec_VecFree( Vec_Vec_t * p )
00200 {
00201 Vec_Ptr_t * vVec;
00202 int i;
00203 Vec_VecForEachLevel( p, vVec, i )
00204 Vec_PtrFree( vVec );
00205 Vec_PtrFree( (Vec_Ptr_t *)p );
00206 }
00207
00219 static inline int Vec_VecSizeSize( Vec_Vec_t * p )
00220 {
00221 Vec_Ptr_t * vVec;
00222 int i, Counter = 0;
00223 Vec_VecForEachLevel( p, vVec, i )
00224 Counter += vVec->nSize;
00225 return Counter;
00226 }
00227
00239 static inline void Vec_VecClear( Vec_Vec_t * p )
00240 {
00241 Vec_Ptr_t * vVec;
00242 int i;
00243 Vec_VecForEachLevel( p, vVec, i )
00244 Vec_PtrClear( vVec );
00245 }
00246
00258 static inline void Vec_VecPush( Vec_Vec_t * p, int Level, void * Entry )
00259 {
00260 if ( p->nSize < Level + 1 )
00261 {
00262 int i;
00263 Vec_PtrGrow( (Vec_Ptr_t *)p, Level + 1 );
00264 for ( i = p->nSize; i < Level + 1; i++ )
00265 p->pArray[i] = Vec_PtrAlloc( 0 );
00266 p->nSize = Level + 1;
00267 }
00268 Vec_PtrPush( (Vec_Ptr_t*)p->pArray[Level], Entry );
00269 }
00270
00282 static inline void Vec_VecPushUnique( Vec_Vec_t * p, int Level, void * Entry )
00283 {
00284 if ( p->nSize < Level + 1 )
00285 Vec_VecPush( p, Level, Entry );
00286 else
00287 Vec_PtrPushUnique( (Vec_Ptr_t*)p->pArray[Level], Entry );
00288 }
00289
00301 static inline int Vec_VecSortCompare1( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 )
00302 {
00303 if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) )
00304 return -1;
00305 if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) )
00306 return 1;
00307 return 0;
00308 }
00309
00321 static inline int Vec_VecSortCompare2( Vec_Ptr_t ** pp1, Vec_Ptr_t ** pp2 )
00322 {
00323 if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) )
00324 return -1;
00325 if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) )
00326 return 1;
00327 return 0;
00328 }
00329
00341 static inline void Vec_VecSort( Vec_Vec_t * p, int fReverse )
00342 {
00343 if ( fReverse )
00344 qsort( (void *)p->pArray, p->nSize, sizeof(void *),
00345 (int (*)(const void *, const void *)) Vec_VecSortCompare2 );
00346 else
00347 qsort( (void *)p->pArray, p->nSize, sizeof(void *),
00348 (int (*)(const void *, const void *)) Vec_VecSortCompare1 );
00349 }
00350
00351 #endif
00352
00356