21#ifndef ABC__misc__vec__vecBit_h
22#define ABC__misc__vec__vecBit_h
54#define Vec_BitForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
56#define Vec_BitForEachEntryStart( vVec, Entry, i, Start ) \
57 for ( i = Start; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
58#define Vec_BitForEachEntryStop( vVec, Entry, i, Stop ) \
59 for ( i = 0; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
60#define Vec_BitForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
61 for ( i = Start; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
62#define Vec_BitForEachEntryReverse( vVec, pEntry, i ) \
63 for ( i = Vec_BitSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_BitEntry(vVec, i)), 1); i-- )
80static inline Vec_Bit_t * Vec_BitAlloc(
int nCap )
83 nCap = (nCap >> 5) + ((nCap & 31) > 0);
87 p->pArray = nCap?
ABC_ALLOC(
int, nCap ) : NULL;
102static inline Vec_Bit_t * Vec_BitStart(
int nSize )
105 nSize = (nSize >> 5) + ((nSize & 31) > 0);
106 p = Vec_BitAlloc( nSize * 32 );
107 p->nSize = nSize * 32;
108 memset(
p->pArray, 0,
sizeof(
int) * (
size_t)nSize );
123static inline Vec_Bit_t * Vec_BitStartFull(
int nSize )
126 nSize = (nSize >> 5) + ((nSize & 31) > 0);
127 p = Vec_BitAlloc( nSize * 32 );
128 p->nSize = nSize * 32;
129 memset(
p->pArray, 0xff,
sizeof(
int) * (
size_t)nSize );
147 assert( (pVec->nSize & 31) == 0 );
149 p->nSize = pVec->nSize;
150 p->nCap = pVec->nSize;
151 p->pArray =
p->nCap?
ABC_ALLOC(
int,
p->nCap >> 5 ) : NULL;
152 memcpy(
p->pArray, pVec->pArray,
sizeof(
int) * (
size_t)(
p->nCap >> 5) );
167static inline void Vec_BitFree(
Vec_Bit_t *
p )
184static inline void Vec_BitFreeP(
Vec_Bit_t **
p )
203static inline int * Vec_BitReleaseArray(
Vec_Bit_t *
p )
205 int * pArray =
p->pArray;
223static inline int * Vec_BitArray(
Vec_Bit_t *
p )
271static inline double Vec_BitMemory(
Vec_Bit_t *
p )
273 return !
p ? 0.0 : 1.0 *
sizeof(int) *
p->nCap +
sizeof(
Vec_Bit_t);
287static inline int Vec_BitEntry(
Vec_Bit_t *
p,
int i )
289 assert( i >= 0 && i < p->nSize );
290 return (
p->pArray[i >> 5] >> (i & 31)) & 1;
304static inline void Vec_BitWriteEntry(
Vec_Bit_t *
p,
int i,
int Entry )
306 assert( i >= 0 && i < p->nSize );
308 p->pArray[i >> 5] |= (1 << (i & 31));
309 else if ( Entry == 0 )
310 p->pArray[i >> 5] &= ~(1 << (i & 31));
313static inline int Vec_BitAddEntry(
Vec_Bit_t *
p,
int i )
315 if ( Vec_BitEntry(
p, i) )
317 Vec_BitWriteEntry(
p, i, 1 );
332static inline int Vec_BitEntryLast(
Vec_Bit_t *
p )
335 return Vec_BitEntry(
p,
p->nSize-1 );
349static inline void Vec_BitGrow(
Vec_Bit_t *
p,
int nCapMin )
351 if (
p->nCap >= nCapMin )
354 nCapMin = (nCapMin >> 5) + ((nCapMin & 31) > 0);
357 p->nCap = nCapMin * 32;
371static inline void Vec_BitFill(
Vec_Bit_t *
p,
int nSize,
int Fill )
374 Vec_BitGrow(
p, nSize );
375 nSize = (nSize >> 5) + ((nSize & 31) > 0);
378 for ( i = 0; i < nSize; i++ )
381 else if ( Fill == 1 )
383 for ( i = 0; i < nSize; i++ )
387 p->nSize = nSize * 32;
401static inline void Vec_BitFillExtra(
Vec_Bit_t *
p,
int nSize,
int Fill )
404 if ( nSize <= p->nSize )
406 if ( nSize > 2 *
p->nCap )
407 Vec_BitGrow(
p, nSize );
408 else if ( nSize >
p->nCap )
412 if ( (
p->nSize >> 5) == (nSize >> 5) )
414 unsigned Mask = (~(~0 << (nSize-
p->nSize)) <<
p->nSize);
416 p->pArray[nSize >> 5] |= Mask;
417 else if ( Fill == 0 )
418 p->pArray[nSize >> 5] &= ~Mask;
423 unsigned Mask1 = (
p->nSize & 31) ? ~0 << (
p->nSize & 31) : 0;
424 unsigned Mask2 = (nSize & 31) ? ~(~0 << (nSize & 31)) : 0;
425 int w1 = (
p->nSize >> 5);
426 int w2 = (nSize >> 5);
429 p->pArray[w1] |= Mask1;
430 p->pArray[w2] |= Mask2;
431 for ( i = w1 + 1; i < w2; i++ )
434 else if ( Fill == 0 )
436 p->pArray[w1] &= ~Mask1;
437 p->pArray[w2] &= ~Mask2;
438 for ( i = w1 + 1; i < w2; i++ )
457static inline int Vec_BitGetEntry(
Vec_Bit_t *
p,
int i )
459 Vec_BitFillExtra(
p, i + 1, 0 );
460 return Vec_BitEntry(
p, i );
474static inline void Vec_BitSetEntry(
Vec_Bit_t *
p,
int i,
int Entry )
476 Vec_BitFillExtra(
p, i + 1, 0 );
477 Vec_BitWriteEntry(
p, i, Entry );
491static inline void Vec_BitShrink(
Vec_Bit_t *
p,
int nSizeNew )
493 assert(
p->nSize >= nSizeNew );
508static inline void Vec_BitClear(
Vec_Bit_t *
p )
524static inline void Vec_BitPush(
Vec_Bit_t *
p,
int Entry )
526 if (
p->nSize ==
p->nCap )
529 Vec_BitGrow(
p, 16 );
534 p->pArray[
p->nSize >> 5] |= (1 << (
p->nSize & 31));
535 else if ( Entry == 0 )
536 p->pArray[
p->nSize >> 5] &= ~(1 << (
p->nSize & 31));
556 Entry = Vec_BitEntryLast(
p );
572static inline int Vec_BitCountWord(
unsigned uWord )
574 uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
575 uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
576 uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
577 uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
578 return (uWord & 0x0000FFFF) + (uWord>>16);
592static inline int Vec_BitCount(
Vec_Bit_t *
p )
594 unsigned * pArray = (
unsigned *)
p->pArray;
595 int nWords = (
p->nSize >> 5) + ((
p->nSize & 31) > 0);
600 for ( i = 0; i <
nWords-1; i++ )
601 Counter += Vec_BitCountWord( pArray[i] );
602 Counter += Vec_BitCountWord( pArray[i] & ~(~0 << (
p->nSize & 31)) );
606 for ( i = 0; i <
nWords; i++ )
607 Counter += Vec_BitCountWord( pArray[i] );
623static inline void Vec_BitReset(
Vec_Bit_t *
p )
625 int i,
nWords = (
p->nSize >> 5) + ((
p->nSize & 31) > 0);
626 for ( i = 0; i <
nWords; i++ )
642static inline void Vec_BitPrint(
Vec_Bit_t *
p )
645 printf(
"Vector has %d entries: {", Vec_BitSize(
p) );
647 printf(
" %d", Entry );
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define Vec_BitForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.