21#ifndef ABC__misc__vec__vecVec_h
22#define ABC__misc__vec__vecVec_h
55#define Vec_VecForEachLevel( vGlob, vVec, i ) \
56 for ( i = 0; (i < Vec_VecSize(vGlob)) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ )
57#define Vec_VecForEachLevelStart( vGlob, vVec, i, LevelStart ) \
58 for ( i = LevelStart; (i < Vec_VecSize(vGlob)) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ )
59#define Vec_VecForEachLevelStop( vGlob, vVec, i, LevelStop ) \
60 for ( i = 0; (i < LevelStop) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ )
61#define Vec_VecForEachLevelStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
62 for ( i = LevelStart; (i < LevelStop) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i++ )
63#define Vec_VecForEachLevelReverse( vGlob, vVec, i ) \
64 for ( i = Vec_VecSize(vGlob)-1; (i >= 0) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i-- )
65#define Vec_VecForEachLevelReverseStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
66 for ( i = LevelStart-1; (i >= LevelStop) && (((vVec) = Vec_VecEntry(vGlob, i)), 1); i-- )
67#define Vec_VecForEachLevelTwo( vGlob1, vGlob2, vVec1, vVec2, i ) \
68 for ( i = 0; (i < Vec_VecSize(vGlob1)) && (((vVec1) = Vec_VecEntry(vGlob1, i)), 1) && (((vVec2) = Vec_VecEntry(vGlob2, i)), 1); i++ )
71#define Vec_VecForEachLevelInt( vGlob, vVec, i ) \
72 for ( i = 0; (i < Vec_VecSize(vGlob)) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i++ )
73#define Vec_VecForEachLevelIntStart( vGlob, vVec, i, LevelStart ) \
74 for ( i = LevelStart; (i < Vec_VecSize(vGlob)) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i++ )
75#define Vec_VecForEachLevelIntStop( vGlob, vVec, i, LevelStop ) \
76 for ( i = 0; (i < LevelStop) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i++ )
77#define Vec_VecForEachLevelIntStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
78 for ( i = LevelStart; (i < LevelStop) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i++ )
79#define Vec_VecForEachLevelIntReverse( vGlob, vVec, i ) \
80 for ( i = Vec_VecSize(vGlob)-1; (i >= 0) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i-- )
81#define Vec_VecForEachLevelIntReverseStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
82 for ( i = LevelStart-1; (i >= LevelStop) && (((vVec) = Vec_VecEntryInt(vGlob, i)), 1); i-- )
83#define Vec_VecForEachLevelIntTwo( vGlob1, vGlob2, vVec1, vVec2, i ) \
84 for ( i = 0; (i < Vec_VecSize(vGlob1)) && (((vVec1) = Vec_VecEntryInt(vGlob1, i)), 1) && (((vVec2) = Vec_VecEntryInt(vGlob2, i)), 1); i++ )
87#define Vec_VecForEachEntry( Type, vGlob, pEntry, i, k ) \
88 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
89 Vec_PtrForEachEntry( Type, Vec_VecEntry(vGlob, i), pEntry, k )
90#define Vec_VecForEachEntryLevel( Type, vGlob, pEntry, i, Level ) \
91 Vec_PtrForEachEntry( Type, Vec_VecEntry(vGlob, Level), pEntry, i )
92#define Vec_VecForEachEntryStart( Type, vGlob, pEntry, i, k, LevelStart ) \
93 for ( i = LevelStart; i < Vec_VecSize(vGlob); i++ ) \
94 Vec_PtrForEachEntry( Type, Vec_VecEntry(vGlob, i), pEntry, k )
95#define Vec_VecForEachEntryStartStop( Type, vGlob, pEntry, i, k, LevelStart, LevelStop ) \
96 for ( i = LevelStart; i < LevelStop; i++ ) \
97 Vec_PtrForEachEntry( Type, Vec_VecEntry(vGlob, i), pEntry, k )
98#define Vec_VecForEachEntryReverse( Type, vGlob, pEntry, i, k ) \
99 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
100 Vec_PtrForEachEntryReverse( Type, Vec_VecEntry(vGlob, i), pEntry, k )
101#define Vec_VecForEachEntryReverseReverse( Type, vGlob, pEntry, i, k ) \
102 for ( i = Vec_VecSize(vGlob) - 1; i >= 0; i-- ) \
103 Vec_PtrForEachEntryReverse( Type, Vec_VecEntry(vGlob, i), pEntry, k )
104#define Vec_VecForEachEntryReverseStart( Type, vGlob, pEntry, i, k, LevelStart ) \
105 for ( i = LevelStart-1; i >= 0; i-- ) \
106 Vec_PtrForEachEntry( Type, Vec_VecEntry(vGlob, i), pEntry, k )
109#define Vec_VecForEachEntryInt( vGlob, Entry, i, k ) \
110 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
111 Vec_IntForEachEntry( Vec_VecEntryInt(vGlob, i), Entry, k )
112#define Vec_VecForEachEntryIntLevel( vGlob, Entry, i, Level ) \
113 Vec_IntForEachEntry( Vec_VecEntryInt(vGlob, Level), Entry, i )
114#define Vec_VecForEachEntryIntStart( vGlob, Entry, i, k, LevelStart ) \
115 for ( i = LevelStart; i < Vec_VecSize(vGlob); i++ ) \
116 Vec_IntForEachEntry( Vec_VecEntryInt(vGlob, i), Entry, k )
117#define Vec_VecForEachEntryIntStartStop( vGlob, Entry, i, k, LevelStart, LevelStop ) \
118 for ( i = LevelStart; i < LevelStop; i++ ) \
119 Vec_IntForEachEntry( Vec_VecEntryInt(vGlob, i), Entry, k )
120#define Vec_VecForEachEntryIntReverse( vGlob, Entry, i, k ) \
121 for ( i = 0; i < Vec_VecSize(vGlob); i++ ) \
122 Vec_IntForEachEntryReverse( Vec_VecEntryInt(vGlob, i), Entry, k )
123#define Vec_VecForEachEntryIntReverseReverse( vGlob, Entry, i, k ) \
124 for ( i = Vec_VecSize(vGlob) - 1; i >= 0; i-- ) \
125 Vec_IntForEachEntryReverse( Vec_VecEntryInt(vGlob, i), Entry, k )
126#define Vec_VecForEachEntryIntReverseStart( vGlob, Entry, i, k, LevelStart ) \
127 for ( i = LevelStart-1; i >= 0; i-- ) \
128 Vec_IntForEachEntry( Vec_VecEntryInt(vGlob, i), Entry, k )
145static inline Vec_Vec_t * Vec_VecAlloc(
int nCap )
149 if ( nCap > 0 && nCap < 8 )
153 p->pArray =
p->nCap?
ABC_ALLOC(
void *,
p->nCap ) : NULL;
168static inline Vec_Vec_t * Vec_VecStart(
int nSize )
172 p = Vec_VecAlloc( nSize );
173 for ( i = 0; i < nSize; i++ )
174 p->pArray[i] = Vec_PtrAlloc( 0 );
190static inline void Vec_VecExpand(
Vec_Vec_t *
p,
int Level )
193 if (
p->nSize >= Level + 1 )
196 for ( i =
p->nSize; i <= Level; i++ )
197 p->pArray[i] = Vec_PtrAlloc( 0 );
198 p->nSize = Level + 1;
200static inline void Vec_VecExpandInt(
Vec_Vec_t *
p,
int Level )
203 if (
p->nSize >= Level + 1 )
206 for ( i =
p->nSize; i <= Level; i++ )
207 p->pArray[i] = Vec_PtrAlloc( 0 );
208 p->nSize = Level + 1;
254static inline int Vec_VecLevelSize(
Vec_Vec_t *
p,
int i )
256 assert( i >= 0 && i < p->nSize );
257 return Vec_PtrSize( (
Vec_Ptr_t *)
p->pArray[i] );
273 assert( i >= 0 && i < p->nSize );
278 assert( i >= 0 && i < p->nSize );
293static inline double Vec_VecMemory(
Vec_Vec_t *
p )
297 if (
p == NULL )
return 0.0;
299 for ( i = 0; i <
p->nSize; i++ )
300 if ( Vec_VecEntry(
p, i) )
301 Mem += Vec_PtrMemory( Vec_VecEntry(
p, i) );
304static inline double Vec_VecMemoryInt(
Vec_Vec_t *
p )
308 if (
p == NULL )
return 0.0;
310 for ( i = 0; i <
p->nSize; i++ )
311 if ( Vec_VecEntry(
p, i) )
312 Mem += Vec_IntMemory( Vec_VecEntryInt(
p, i) );
327static inline void * Vec_VecEntryEntry(
Vec_Vec_t *
p,
int i,
int k )
329 return Vec_PtrEntry( Vec_VecEntry(
p, i), k );
331static inline int Vec_VecEntryEntryInt(
Vec_Vec_t *
p,
int i,
int k )
333 return Vec_IntEntry( Vec_VecEntryInt(
p, i), k );
347static inline void Vec_VecFree(
Vec_Vec_t *
p )
352 if ( vVec ) Vec_PtrFree( vVec );
355static inline void Vec_VecErase(
Vec_Vec_t *
p )
360 if ( vVec ) Vec_PtrFree( vVec );
375static inline void Vec_VecFreeP(
Vec_Vec_t **
p )
398 vNew = Vec_PtrAlloc( Vec_VecSize(
p) );
400 Vec_PtrPush( vNew, Vec_PtrDup(vVec) );
408 vNew = Vec_PtrAlloc( Vec_VecSize(
p) );
410 Vec_PtrPush( vNew, Vec_IntDup(vVec) );
425static inline int Vec_VecSizeSize(
Vec_Vec_t *
p )
430 Counter += vVec->nSize;
445static inline void Vec_VecClear(
Vec_Vec_t *
p )
450 Vec_PtrClear( vVec );
464static inline void Vec_VecPush(
Vec_Vec_t *
p,
int Level,
void * Entry )
466 if (
p->nSize < Level + 1 )
470 for ( i =
p->nSize; i < Level + 1; i++ )
471 p->pArray[i] = Vec_PtrAlloc( 0 );
472 p->nSize = Level + 1;
474 Vec_PtrPush( Vec_VecEntry(
p, Level), Entry );
476static inline void Vec_VecPushInt(
Vec_Vec_t *
p,
int Level,
int Entry )
478 if (
p->nSize < Level + 1 )
482 for ( i =
p->nSize; i < Level + 1; i++ )
483 p->pArray[i] = Vec_IntAlloc( 0 );
484 p->nSize = Level + 1;
486 Vec_IntPush( Vec_VecEntryInt(
p, Level), Entry );
500static inline void Vec_VecPushUnique(
Vec_Vec_t *
p,
int Level,
void * Entry )
502 if (
p->nSize < Level + 1 )
503 Vec_VecPush(
p, Level, Entry );
505 Vec_PtrPushUnique( Vec_VecEntry(
p, Level), Entry );
507static inline void Vec_VecPushUniqueInt(
Vec_Vec_t *
p,
int Level,
int Entry )
509 if (
p->nSize < Level + 1 )
510 Vec_VecPushInt(
p, Level, Entry );
512 Vec_IntPushUnique( Vec_VecEntryInt(
p, Level), Entry );
528 if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) )
530 if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) )
536 if ( Vec_PtrSize(*pp1) > Vec_PtrSize(*pp2) )
538 if ( Vec_PtrSize(*pp1) < Vec_PtrSize(*pp2) )
554static inline void Vec_VecSort(
Vec_Vec_t *
p,
int fReverse )
557 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
558 (int (*)(
const void *,
const void *)) Vec_VecSortCompare2 );
560 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
561 (int (*)(
const void *,
const void *)) Vec_VecSortCompare1 );
577 if ( Vec_IntEntry(*pp1,0) < Vec_IntEntry(*pp2,0) )
579 if ( Vec_IntEntry(*pp1,0) > Vec_IntEntry(*pp2,0) )
585 if ( Vec_IntEntry(*pp1,0) > Vec_IntEntry(*pp2,0) )
587 if ( Vec_IntEntry(*pp1,0) < Vec_IntEntry(*pp2,0) )
603static inline void Vec_VecSortByFirstInt(
Vec_Vec_t *
p,
int fReverse )
606 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
607 (int (*)(
const void *,
const void *)) Vec_VecSortCompare4 );
609 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
610 (int (*)(
const void *,
const void *)) Vec_VecSortCompare3 );
624static inline void Vec_VecPrintInt(
Vec_Vec_t *
p,
int fSkipSingles )
629 if ( fSkipSingles && Vec_VecLevelSize(
p, i) == 1 )
632 printf(
" %4d : {", i );
633 printf(
" %d", Entry );
634 if ( k == Vec_VecLevelSize(
p, i) - 1 )
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_VecForEachEntryInt(vGlob, Entry, i, k)
#define Vec_VecForEachLevelInt(vGlob, vVec, i)
#define Vec_VecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.