21#ifndef ABC__misc__vec__vecStr_h
22#define ABC__misc__vec__vecStr_h
54#define Vec_StrForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_StrSize(vVec)) && (((Entry) = Vec_StrEntry(vVec, i)), 1); i++ )
72static inline Vec_Str_t * Vec_StrAlloc(
int nCap )
76 if ( nCap > 0 && nCap < 16 )
83static inline Vec_Str_t * Vec_StrAllocExact(
int nCap )
105static inline Vec_Str_t * Vec_StrStart(
int nSize )
108 p = Vec_StrAlloc( nSize );
110 memset(
p->pArray, 0,
sizeof(
char) * (
size_t)nSize );
125static inline Vec_Str_t * Vec_StrAllocArray(
char * pArray,
int nSize )
146static inline Vec_Str_t * Vec_StrAllocArrayCopy(
char * pArray,
int nSize )
153 memcpy(
p->pArray, pArray,
sizeof(
char) * (
size_t)nSize );
173 p->nCap = pVec->
nCap;
195 p->nCap = pVec->
nCap;
214static inline void Vec_StrZero(
Vec_Str_t *
p )
220static inline void Vec_StrErase(
Vec_Str_t *
p )
226static inline void Vec_StrFree(
Vec_Str_t *
p )
243static inline void Vec_StrFreeP(
Vec_Str_t **
p )
262static inline char * Vec_StrReleaseArray(
Vec_Str_t *
p )
264 char * pArray =
p->pArray;
282static inline char * Vec_StrArray(
Vec_Str_t *
p )
286static inline char * Vec_StrLimit(
Vec_Str_t *
p )
288 return p->pArray +
p->nSize;
306static inline void Vec_StrSetSize(
Vec_Str_t *
p,
int nSize )
338static inline double Vec_StrMemory(
Vec_Str_t *
p )
340 return !
p ? 0.0 : 1.0 *
sizeof(char) * (
size_t)
p->nCap +
sizeof(
Vec_Str_t);
354static inline char Vec_StrEntry(
Vec_Str_t *
p,
int i )
356 assert( i >= 0 && i < p->nSize );
371static inline char * Vec_StrEntryP(
Vec_Str_t *
p,
int i )
373 assert( i >= 0 && i < p->nSize );
374 return p->pArray + i;
388static inline void Vec_StrWriteEntry(
Vec_Str_t *
p,
int i,
char Entry )
390 assert( i >= 0 && i < p->nSize );
391 p->pArray[i] = Entry;
405static inline char Vec_StrEntryLast(
Vec_Str_t *
p )
408 return p->pArray[
p->nSize-1];
422static inline void Vec_StrGrow(
Vec_Str_t *
p,
int nCapMin )
424 if (
p->nCap >= nCapMin )
442static inline void Vec_StrFill(
Vec_Str_t *
p,
int nSize,
char Fill )
445 Vec_StrGrow(
p, nSize );
447 for ( i = 0; i <
p->nSize; i++ )
462static inline void Vec_StrFillExtra(
Vec_Str_t *
p,
int nSize,
char Fill )
465 if ( nSize <= p->nSize )
467 if ( nSize > 2 *
p->nCap )
468 Vec_StrGrow(
p, nSize );
469 else if ( nSize >
p->nCap )
471 for ( i =
p->nSize; i < nSize; i++ )
487static inline char Vec_StrGetEntry(
Vec_Str_t *
p,
int i )
489 Vec_StrFillExtra(
p, i + 1, 0 );
490 return Vec_StrEntry(
p, i );
504static inline void Vec_StrSetEntry(
Vec_Str_t *
p,
int i,
char Entry )
506 Vec_StrFillExtra(
p, i + 1, 0 );
507 Vec_StrWriteEntry(
p, i, Entry );
521static inline void Vec_StrShrink(
Vec_Str_t *
p,
int nSizeNew )
523 assert(
p->nSize >= nSizeNew );
538static inline void Vec_StrClear(
Vec_Str_t *
p )
554static inline void Vec_StrPush(
Vec_Str_t *
p,
char Entry )
556 if (
p->nSize ==
p->nCap )
559 Vec_StrGrow(
p, 16 );
563 p->pArray[
p->nSize++] = Entry;
565static inline void Vec_StrPushTwo(
Vec_Str_t *
p,
char Entry1,
char Entry2 )
567 Vec_StrPush(
p, Entry1 );
568 Vec_StrPush(
p, Entry2 );
570static inline void Vec_StrPushBuffer(
Vec_Str_t *
p,
char * pBuffer,
int nSize )
572 if (
p->nSize + nSize >
p->nCap )
573 Vec_StrGrow(
p, 2 * (
p->nSize + nSize) );
574 memcpy(
p->pArray +
p->nSize, pBuffer, (
size_t)nSize );
592 return p->pArray[--
p->nSize];
606static inline void Vec_StrIntPrint(
Vec_Str_t *
p )
609 printf(
"Vector has %d entries: {", Vec_StrSize(
p) );
610 for ( i = 0; i < Vec_StrSize(
p); i++ )
611 printf(
" %d", (
int)Vec_StrEntry(
p, i) );
626static inline void Vec_StrPrintNum(
Vec_Str_t *
p,
int Num )
632 Vec_StrPush(
p,
'0' );
637 Vec_StrPush(
p,
'-' );
640 for ( i = 0; Num; Num /= 10, i++ )
641 Digits[i] = Num % 10;
642 for ( i--; i >= 0; i-- )
643 Vec_StrPush(
p, (
char)(
'0' + Digits[i]) );
645static inline void Vec_StrPrintNumStar(
Vec_Str_t *
p,
int Num,
int nDigits )
648 char Digits[16] = {0};
651 for ( i = 0; i < nDigits; i++ )
652 Vec_StrPush(
p,
'0' );
657 Vec_StrPush(
p,
'-' );
661 for ( i = 0; Num; Num /= 10, i++ )
662 Digits[i] = Num % 10;
663 for ( i = Abc_MaxInt(i, nDigits)-1; i >= 0; i-- )
664 Vec_StrPush(
p, (
char)(
'0' + Digits[i]) );
678static inline void Vec_StrPrintStr(
Vec_Str_t *
p,
const char * pStr )
680 int i, Length = (int)
strlen(pStr);
681 for ( i = 0; i < Length; i++ )
682 Vec_StrPush(
p, pStr[i] );
698#define vsnprintf _vsnprintf
701static inline char * Vec_StrPrintF(
Vec_Str_t *
p,
const char * format, ... )
703 int nAdded, nSize = 1000;
704 va_list args; va_start( args, format );
705 Vec_StrGrow(
p, Vec_StrSize(
p) + nSize );
706 nAdded = vsnprintf( Vec_StrLimit(
p), nSize, format, args );
707 if ( nAdded > nSize )
709 Vec_StrGrow(
p, Vec_StrSize(
p) + nAdded + nSize );
710 nSize = vsnprintf( Vec_StrLimit(
p), nAdded, format, args );
711 assert( nSize == nAdded );
715 return Vec_StrLimit(
p) - nAdded;
729static inline void Vec_StrAppend(
Vec_Str_t *
p,
const char * pString )
731 Vec_StrPrintStr(
p, pString );
733static inline void Vec_StrCopy(
Vec_Str_t *
p,
const char * pString )
736 Vec_StrAppend(
p, pString );
737 Vec_StrPush(
p,
'\0' );
751static inline void Vec_StrReverseOrder(
Vec_Str_t *
p )
754 for ( i = 0; i <
p->nSize/2; i++ )
757 p->pArray[i] =
p->pArray[
p->nSize-1-i];
758 p->pArray[
p->nSize-1-i] = Temp;
776 for ( i = 0; i <
p->nSize; i++ )
777 Counter += (
int)
p->pArray[i];
792static inline int Vec_StrCountEntry(
Vec_Str_t *
p,
char Entry )
795 for ( i = 0; i <
p->nSize; i++ )
796 Counter += (
p->pArray[i] == Entry);
799static inline int Vec_StrCountLarger(
Vec_Str_t *
p,
char Entry )
802 for ( i = 0; i <
p->nSize; i++ )
803 Counter += (
p->pArray[i] > Entry);
806static inline int Vec_StrCountSmaller(
Vec_Str_t *
p,
char Entry )
809 for ( i = 0; i <
p->nSize; i++ )
810 Counter += (
p->pArray[i] < Entry);
825static inline int Vec_StrCountEntryLit(
Vec_Str_t *
p,
char Entry )
828 for ( i = 0; i <
p->nSize; i++ )
829 Counter += (Abc_Lit2Var((
int)
p->pArray[i]) == Entry);
832static inline int Vec_StrCountLargerLit(
Vec_Str_t *
p,
char Entry )
835 for ( i = 0; i <
p->nSize; i++ )
836 Counter += (Abc_Lit2Var((
int)
p->pArray[i]) > Entry);
839static inline int Vec_StrCountSmallerLit(
Vec_Str_t *
p,
char Entry )
842 for ( i = 0; i <
p->nSize; i++ )
843 Counter += (Abc_Lit2Var((
int)
p->pArray[i]) < Entry);
861 if ( p1->nSize != p2->nSize )
863 for ( i = 0; i < p1->nSize; i++ )
864 if ( p1->pArray[i] != p2->pArray[i] )
880static int Vec_StrSortCompare1(
char * pp1,
char * pp2 )
901static int Vec_StrSortCompare2(
char * pp1,
char * pp2 )
922static inline void Vec_StrSort(
Vec_Str_t *
p,
int fReverse )
925 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
char),
926 (int (*)(
const void *,
const void *)) Vec_StrSortCompare2 );
928 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
char),
929 (int (*)(
const void *,
const void *)) Vec_StrSortCompare1 );
945 if ( p1 == NULL || p2 == NULL )
946 return (p1 != NULL) - (p2 != NULL);
947 if ( Vec_StrSize(p1) != Vec_StrSize(p2) )
948 return Vec_StrSize(p1) - Vec_StrSize(p2);
949 return memcmp( Vec_StrArray(p1), Vec_StrArray(p2), (
size_t)Vec_StrSize(p1) );
964static inline void Vec_StrPutI_ne(
Vec_Str_t * vOut,
int Val )
968 for ( i = 3; i >= 0; i-- )
969 Vec_StrPush( vOut, (
char)(Val >> (8*i)) );
971static inline int Vec_StrGetI_ne(
Vec_Str_t * vOut,
int * pPos )
976 for ( i = 3; i >= 0; i-- )
977 Val |= ((
int)(
unsigned char)Vec_StrEntry(vOut, (*pPos)++) << (8*i));
981static inline void Vec_StrPutI(
Vec_Str_t * vOut,
int Val )
983 for ( ; Val >= 0x80; Val >>= 7 )
984 Vec_StrPush( vOut, (
unsigned char)(Val | 0x80) );
985 Vec_StrPush( vOut, (
unsigned char)Val );
987static inline int Vec_StrGetI(
Vec_Str_t * vOut,
int * pPos )
991 while ( (ch = Vec_StrEntry(vOut, (*pPos)++)) & 0x80 )
992 Val |= ((ch & 0x7f) << (7 * i++));
993 return Val | (ch << (7 * i));
999 for ( i = 0; i < 8; i++ )
1000 Vec_StrPush( vOut, (
char)(Val >> (8*i)) );
1002static inline word Vec_StrGetW(
Vec_Str_t * vOut,
int * pPos )
1006 for ( i = 0; i < 8; i++ )
1007 Val |= ((
word)(
unsigned char)Vec_StrEntry(vOut, (*pPos)++) << (8*i));
1011static inline void Vec_StrPutF(
Vec_Str_t * vOut,
float Val )
1013 union {
float num;
unsigned char data[4]; } tmp;
1015 Vec_StrPush( vOut, tmp.data[0] );
1016 Vec_StrPush( vOut, tmp.data[1] );
1017 Vec_StrPush( vOut, tmp.data[2] );
1018 Vec_StrPush( vOut, tmp.data[3] );
1020static inline float Vec_StrGetF(
Vec_Str_t * vOut,
int * pPos )
1022 union {
float num;
unsigned char data[4]; } tmp;
1023 tmp.data[0] = Vec_StrEntry( vOut, (*pPos)++ );
1024 tmp.data[1] = Vec_StrEntry( vOut, (*pPos)++ );
1025 tmp.data[2] = Vec_StrEntry( vOut, (*pPos)++ );
1026 tmp.data[3] = Vec_StrEntry( vOut, (*pPos)++ );
1030static inline void Vec_StrPutD(
Vec_Str_t * vOut,
double Val )
1032 union {
double num;
unsigned char data[8]; } tmp;
1033 int i, Lim =
sizeof(double);
1035 for ( i = 0; i < Lim; i++ )
1036 Vec_StrPush( vOut, tmp.data[i] );
1038static inline double Vec_StrGetD(
Vec_Str_t * vOut,
int * pPos )
1040 union {
double num;
unsigned char data[8]; } tmp;
1041 int i, Lim =
sizeof(double);
1042 for ( i = 0; i < Lim; i++ )
1043 tmp.data[i] = Vec_StrEntry( vOut, (*pPos)++ );
1047static inline void Vec_StrPutS(
Vec_Str_t * vOut,
char * pStr )
1050 Vec_StrPush( vOut, *pStr++ );
1051 Vec_StrPush( vOut, (
char)0 );
1053static inline char * Vec_StrGetS(
Vec_Str_t * vOut,
int * pPos )
1055 char * pStr = Vec_StrEntryP( vOut, *pPos );
1056 while ( Vec_StrEntry(vOut, (*pPos)++) );
1057 return Abc_UtilStrsav(pStr);
1060static inline void Vec_StrPutC(
Vec_Str_t * vOut,
char c )
1062 Vec_StrPush( vOut, c );
1064static inline char Vec_StrGetC(
Vec_Str_t * vOut,
int * pPos )
1066 return Vec_StrEntry(vOut, (*pPos)++);
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
struct Vec_Str_t_ Vec_Str_t
unsigned __int64 word
DECLARATIONS ///.