21#ifndef ABC__misc__vec__vecPtr_h
22#define ABC__misc__vec__vecPtr_h
55#define Vec_PtrForEachEntry( Type, vVec, pEntry, i ) \
56 for ( i = 0; (i < Vec_PtrSize(vVec)) && (((pEntry) = (Type)Vec_PtrEntry(vVec, i)), 1); i++ )
57#define Vec_PtrForEachEntryStart( Type, vVec, pEntry, i, Start ) \
58 for ( i = Start; (i < Vec_PtrSize(vVec)) && (((pEntry) = (Type)Vec_PtrEntry(vVec, i)), 1); i++ )
59#define Vec_PtrForEachEntryStop( Type, vVec, pEntry, i, Stop ) \
60 for ( i = 0; (i < Stop) && (((pEntry) = (Type)Vec_PtrEntry(vVec, i)), 1); i++ )
61#define Vec_PtrForEachEntryStartStop( Type, vVec, pEntry, i, Start, Stop ) \
62 for ( i = Start; (i < Stop) && (((pEntry) = (Type)Vec_PtrEntry(vVec, i)), 1); i++ )
63#define Vec_PtrForEachEntryReverse( Type, vVec, pEntry, i ) \
64 for ( i = Vec_PtrSize(vVec) - 1; (i >= 0) && (((pEntry) = (Type)Vec_PtrEntry(vVec, i)), 1); i-- )
65#define Vec_PtrForEachEntryTwo( Type1, vVec1, Type2, vVec2, pEntry1, pEntry2, i ) \
66 for ( i = 0; (i < Vec_PtrSize(vVec1)) && (((pEntry1) = (Type1)Vec_PtrEntry(vVec1, i)), 1) && (((pEntry2) = (Type2)Vec_PtrEntry(vVec2, i)), 1); i++ )
67#define Vec_PtrForEachEntryDouble( Type1, Type2, vVec, Entry1, Entry2, i ) \
68 for ( i = 0; (i+1 < Vec_PtrSize(vVec)) && (((Entry1) = (Type1)Vec_PtrEntry(vVec, i)), 1) && (((Entry2) = (Type2)Vec_PtrEntry(vVec, i+1)), 1); i += 2 )
85static inline Vec_Ptr_t * Vec_PtrAlloc(
int nCap )
89 if ( nCap > 0 && nCap < 8 )
93 p->pArray =
p->nCap?
ABC_ALLOC(
void *,
p->nCap ) : NULL;
96static inline Vec_Ptr_t * Vec_PtrAllocExact(
int nCap )
103 p->pArray =
p->nCap?
ABC_ALLOC(
void *,
p->nCap ) : NULL;
118static inline Vec_Ptr_t * Vec_PtrStart(
int nSize )
121 p = Vec_PtrAlloc( nSize );
123 memset(
p->pArray, 0,
sizeof(
void *) * (
size_t)nSize );
138static inline Vec_Ptr_t * Vec_PtrAllocArray(
void ** pArray,
int nSize )
159static inline Vec_Ptr_t * Vec_PtrAllocArrayCopy(
void ** pArray,
int nSize )
166 memcpy(
p->pArray, pArray,
sizeof(
void *) * (
size_t)nSize );
185 p->nSize = pVec->nSize;
186 p->nCap = pVec->nCap;
187 p->pArray =
p->nCap?
ABC_ALLOC(
void *,
p->nCap ) : NULL;
188 memcpy(
p->pArray, pVec->pArray,
sizeof(
void *) * (
size_t)pVec->nSize );
195 for ( i = 0; i <
p->nSize; i++ )
196 p->pArray[i] = Abc_UtilStrsav( (
char *)
p->pArray[i] );
215 p->nSize = pVec->nSize;
216 p->nCap = pVec->nCap;
217 p->pArray = pVec->pArray;
235static inline void Vec_PtrZero(
Vec_Ptr_t *
p )
241static inline void Vec_PtrErase(
Vec_Ptr_t *
p )
247static inline void Vec_PtrFree(
Vec_Ptr_t *
p )
264static inline void Vec_PtrFreeP(
Vec_Ptr_t **
p )
283static inline void ** Vec_PtrReleaseArray(
Vec_Ptr_t *
p )
285 void ** pArray =
p->pArray;
303static inline void ** Vec_PtrArray(
Vec_Ptr_t *
p )
351static inline double Vec_PtrMemory(
Vec_Ptr_t *
p )
353 return !
p ? 0.0 : 1.0 *
sizeof(
void *) * (
size_t)
p->nCap +
sizeof(
Vec_Ptr_t);
367static inline int Vec_PtrCountZero(
Vec_Ptr_t *
p )
370 for ( i = 0; i <
p->nSize; i++ )
371 Counter += (
p->pArray[i] == NULL);
386static inline void * Vec_PtrEntry(
Vec_Ptr_t *
p,
int i )
388 assert( i >= 0 && i < p->nSize );
403static inline void ** Vec_PtrEntryP(
Vec_Ptr_t *
p,
int i )
405 assert( i >= 0 && i < p->nSize );
406 return p->pArray + i;
420static inline void Vec_PtrWriteEntry(
Vec_Ptr_t *
p,
int i,
void * Entry )
422 assert( i >= 0 && i < p->nSize );
423 p->pArray[i] = Entry;
437static inline void * Vec_PtrEntryLast(
Vec_Ptr_t *
p )
440 return p->pArray[
p->nSize-1];
454static inline void Vec_PtrGrow(
Vec_Ptr_t *
p,
int nCapMin )
456 if (
p->nCap >= nCapMin )
474static inline void Vec_PtrFill(
Vec_Ptr_t *
p,
int nSize,
void * Entry )
477 Vec_PtrGrow(
p, nSize );
478 for ( i = 0; i < nSize; i++ )
479 p->pArray[i] = Entry;
482static inline void Vec_PtrFillTwo(
Vec_Ptr_t *
p,
int nSize,
void * EntryEven,
void * EntryOdd )
485 Vec_PtrGrow(
p, nSize );
486 for ( i = 0; i < nSize; i++ )
487 p->pArray[i] = (i & 1) ? EntryOdd : EntryEven;
502static inline void Vec_PtrFillExtra(
Vec_Ptr_t *
p,
int nSize,
void * Fill )
505 if ( nSize <= p->nSize )
507 if ( nSize > 2 *
p->nCap )
508 Vec_PtrGrow(
p, nSize );
509 else if ( nSize >
p->nCap )
511 for ( i =
p->nSize; i < nSize; i++ )
527static inline void * Vec_PtrGetEntry(
Vec_Ptr_t *
p,
int i )
529 Vec_PtrFillExtra(
p, i + 1, NULL );
530 return Vec_PtrEntry(
p, i );
544static inline void Vec_PtrSetEntry(
Vec_Ptr_t *
p,
int i,
void * Entry )
546 Vec_PtrFillExtra(
p, i + 1, NULL );
547 Vec_PtrWriteEntry(
p, i, Entry );
561static inline void Vec_PtrShrink(
Vec_Ptr_t *
p,
int nSizeNew )
563 assert(
p->nSize >= nSizeNew );
578static inline void Vec_PtrClear(
Vec_Ptr_t *
p )
594static inline void Vec_PtrFreeData(
Vec_Ptr_t *
p )
597 if (
p == NULL )
return;
599 if ( pTemp != (
void *)(ABC_PTRINT_T)1 && pTemp != (
void *)(ABC_PTRINT_T)2 )
602static inline void Vec_PtrFreeFree(
Vec_Ptr_t *
p )
604 if (
p == NULL )
return;
605 Vec_PtrFreeData(
p );
621static void Vec_PtrFreeFunc(
Vec_Ptr_t *
p,
void (*pFuncItemFree)(
void *) )
625 if ( pItem ) pFuncItemFree( pItem );
643 Vec_PtrGrow( pDest, pSour->nSize );
644 memcpy( pDest->pArray, pSour->pArray,
sizeof(
void *) * (
size_t)pSour->nSize );
645 pDest->nSize = pSour->nSize;
659static inline void Vec_PtrPrintNames(
Vec_Ptr_t *
p )
662 printf(
"Vector has %d entries: {", Vec_PtrSize(
p) );
664 printf(
"%s ", pName );
667static inline void Vec_PtrPrintPointers(
Vec_Ptr_t *
p )
670 printf(
"Vector has %d pointer entries:\n", Vec_PtrSize(
p) );
672 printf(
"%2d = %p\n", i, pTemp );
686static inline void Vec_PtrPush(
Vec_Ptr_t *
p,
void * Entry )
688 if (
p->nSize ==
p->nCap )
691 Vec_PtrGrow(
p, 16 );
695 p->pArray[
p->nSize++] = Entry;
697static inline void Vec_PtrPushTwo(
Vec_Ptr_t *
p,
void * Entry1,
void * Entry2 )
699 Vec_PtrPush(
p, Entry1 );
700 Vec_PtrPush(
p, Entry2 );
706 Vec_PtrPush( vVec1, Entry );
720static inline void Vec_PtrPushFirst(
Vec_Ptr_t *
p,
void * Entry )
723 if (
p->nSize ==
p->nCap )
726 Vec_PtrGrow(
p, 16 );
731 for ( i =
p->nSize - 1; i >= 1; i-- )
732 p->pArray[i] =
p->pArray[i-1];
733 p->pArray[0] = Entry;
747static inline int Vec_PtrPushUnique(
Vec_Ptr_t *
p,
void * Entry )
750 for ( i = 0; i <
p->nSize; i++ )
751 if (
p->pArray[i] == Entry )
753 Vec_PtrPush(
p, Entry );
768static inline void * Vec_PtrPop(
Vec_Ptr_t *
p )
771 return p->pArray[--
p->nSize];
785static inline int Vec_PtrFind(
Vec_Ptr_t *
p,
void * Entry )
788 for ( i = 0; i <
p->nSize; i++ )
789 if (
p->pArray[i] == Entry )
793static inline int Vec_PtrFindStr(
Vec_Ptr_t *
p,
char * Entry )
796 for ( i = 0; i <
p->nSize; i++ )
797 if (
p->pArray[i] && !
strcmp((
char *)
p->pArray[i], Entry) )
813static inline void Vec_PtrRemove(
Vec_Ptr_t *
p,
void * Entry )
817 for ( i =
p->nSize - 1; i >= 0; i-- )
818 if (
p->pArray[i] == Entry )
828 for ( i++; i <
p->nSize; i++ )
829 p->pArray[i-1] =
p->pArray[i];
844static inline void Vec_PtrDrop(
Vec_Ptr_t *
p,
int i )
847 assert( i >= 0 && i < Vec_PtrSize(
p) );
849 for ( k = i; k <
p->nSize; k++ )
850 p->pArray[k] =
p->pArray[k+1];
864static inline void Vec_PtrInsert(
Vec_Ptr_t *
p,
int iHere,
void * Entry )
867 assert( iHere >= 0 && iHere < p->nSize );
869 for ( i =
p->nSize - 1; i > iHere; i-- )
870 p->pArray[i] =
p->pArray[i-1];
871 p->pArray[i] = Entry;
885static inline void Vec_PtrReorder(
Vec_Ptr_t *
p,
int nItems )
887 assert( nItems < p->nSize );
888 Vec_PtrGrow(
p, nItems +
p->nSize );
889 memmove( (
char **)
p->pArray +
p->nSize,
p->pArray, (
size_t)nItems *
sizeof(
void*) );
890 memmove(
p->pArray, (
char **)
p->pArray + nItems, (
size_t)
p->nSize *
sizeof(
void*) );
904static inline void Vec_PtrReverseOrder(
Vec_Ptr_t *
p )
908 for ( i = 0; i <
p->nSize/2; i++ )
911 p->pArray[i] =
p->pArray[
p->nSize-1-i];
912 p->pArray[
p->nSize-1-i] = Temp;
930 if ( p1->nSize != p2->nSize )
932 for ( i = 0; i < p1->nSize; i++ )
933 if ( p1->pArray[i] != p2->pArray[i] )
949static int Vec_PtrSortComparePtr(
void ** pp1,
void ** pp2 )
969static void Vec_PtrSort(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *) )
___unused;
970static void Vec_PtrSort(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *) )
974 if ( Vec_PtrSortCompare == NULL )
975 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
976 (int (*)(
const void *,
const void *)) Vec_PtrSortComparePtr );
978 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
void *),
979 (int (*)(
const void *,
const void *)) Vec_PtrSortCompare );
993static void Vec_PtrUniqify(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *) )
___unused;
994static void Vec_PtrUniqify(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *) )
999 Vec_PtrSort(
p, Vec_PtrSortCompare );
1000 for ( i = k = 1; i <
p->nSize; i++ )
1001 if (
p->pArray[i] !=
p->pArray[i-1] )
1002 p->pArray[k++] =
p->pArray[i];
1005static void Vec_PtrUniqify2(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *),
void (*Vec_PtrObjFree)(
void*),
Vec_Int_t * vCounts )
___unused;
1006static void Vec_PtrUniqify2(
Vec_Ptr_t *
p,
int (*Vec_PtrSortCompare)(
const void *,
const void *),
void (*Vec_PtrObjFree)(
void*),
Vec_Int_t * vCounts )
1010 Vec_IntFill( vCounts, 1, 1 );
1013 Vec_PtrSort(
p, Vec_PtrSortCompare );
1014 for ( i = k = 1; i <
p->nSize; i++ )
1015 if ( Vec_PtrSortCompare(
p->pArray+i,
p->pArray+k-1) != 0 )
1017 p->pArray[k++] =
p->pArray[i];
1019 Vec_IntPush( vCounts, 1 );
1023 if ( Vec_PtrObjFree )
1024 Vec_PtrObjFree(
p->pArray[i] );
1026 Vec_IntAddToEntry( vCounts, Vec_IntSize(vCounts)-1, 1 );
1029 assert( vCounts == NULL || Vec_IntSize(vCounts) == Vec_PtrSize(
p) );
1048static inline Vec_Ptr_t * Vec_PtrAllocSimInfo(
int nEntries,
int nWords )
1053 pMemory = (
void **)
ABC_ALLOC(
char, (
sizeof(
void *) +
sizeof(
unsigned) * (
size_t)
nWords) * nEntries );
1054 pInfo = (
unsigned *)(pMemory + nEntries);
1055 for ( i = 0; i < nEntries; i++ )
1056 pMemory[i] = pInfo + i *
nWords;
1057 return Vec_PtrAllocArray( pMemory, nEntries );
1071static inline int Vec_PtrReadWordsSimInfo(
Vec_Ptr_t *
p )
1073 return (
unsigned *)Vec_PtrEntry(
p,1) - (
unsigned *)Vec_PtrEntry(
p,0);
1087static inline void Vec_PtrCleanSimInfo(
Vec_Ptr_t * vInfo,
int iWord,
int nWords )
1090 for ( i = 0; i < vInfo->nSize; i++ )
1091 memset( (
char*)Vec_PtrEntry(vInfo,i) + 4*iWord, 0, (
size_t)(4*(
nWords-iWord)) );
1105static inline void Vec_PtrFillSimInfo(
Vec_Ptr_t * vInfo,
int iWord,
int nWords )
1108 for ( i = 0; i < vInfo->nSize; i++ )
1109 memset( (
char*)Vec_PtrEntry(vInfo,i) + 4*iWord, 0xFF, (
size_t)(4*(
nWords-iWord)) );
1123static inline void Vec_PtrDoubleSimInfo(
Vec_Ptr_t * vInfo )
1127 assert( Vec_PtrSize(vInfo) > 1 );
1129 nWords = (
unsigned *)Vec_PtrEntry(vInfo,1) - (
unsigned *)Vec_PtrEntry(vInfo,0);
1130 vInfoNew = Vec_PtrAllocSimInfo( 2*Vec_PtrSize(vInfo),
nWords );
1132 memcpy( Vec_PtrEntry(vInfoNew,0), Vec_PtrEntry(vInfo,0), (
size_t)(Vec_PtrSize(vInfo) *
nWords * 4) );
1135 vInfo->pArray = vInfoNew->pArray;
1139 vInfoNew->pArray = NULL;
1154static inline void Vec_PtrReallocSimInfo(
Vec_Ptr_t * vInfo )
1158 assert( Vec_PtrSize(vInfo) > 1 );
1160 nWords = (
unsigned *)Vec_PtrEntry(vInfo,1) - (
unsigned *)Vec_PtrEntry(vInfo,0);
1161 vInfoNew = Vec_PtrAllocSimInfo( Vec_PtrSize(vInfo), 2*
nWords );
1163 for ( i = 0; i < vInfo->nSize; i++ )
1164 memcpy( Vec_PtrEntry(vInfoNew,i), Vec_PtrEntry(vInfo,i), (
size_t)(
nWords * 4) );
1167 vInfo->pArray = vInfoNew->pArray;
1169 vInfoNew->pArray = NULL;
1184static inline Vec_Ptr_t * Vec_PtrAllocTruthTables(
int nVars )
1187 unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
1190 nWords = (nVars <= 5 ? 1 : (1 << (nVars - 5)));
1191 p = Vec_PtrAllocSimInfo( nVars,
nWords );
1192 for ( i = 0; i < nVars; i++ )
1194 pTruth = (
unsigned *)
p->pArray[i];
1197 for ( k = 0; k <
nWords; k++ )
1198 pTruth[k] = Masks[i];
1202 for ( k = 0; k <
nWords; k++ )
1203 if ( k & (1 << (i-5)) )
1204 pTruth[k] = ~(unsigned)0;
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, 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_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.