#ifndef _TKBITFIELD
# error "do not include this private header file"
#endif
#ifndef _TKBITFIELDPRIV
#define _TKBITFIELDPRIV
MODULE_SCOPE bool TkBitNone_(const TkBitWord *buf, unsigned words);
#endif
#ifdef _TK_NEED_IMPLEMENTATION
#include <assert.h>
#ifdef _MSC_VER
# if _MSC_VER >= 1900
# define inline __inline
# else
# define inline
# endif
#elif __STDC_VERSION__ < 199901L
# define inline
#endif
#define TK_BIT_WORD_INDEX(n) ((n) >> ((TK_BIT_NBITS + 128) >> 5))
#define TK_BIT_INDEX(n) ((n) & (TK_BIT_NBITS - 1))
#define TK_BIT_MASK(n) (((TkBitWord) 1) << (n))
#define TK_BIT_COUNT_WORDS(n) ((n + TK_BIT_NBITS - 1)/TK_BIT_NBITS)
inline
const unsigned char *
TkBitData(
const TkBitField *bf)
{
assert(bf);
return (const void *) bf->bits;
}
inline
unsigned
TkBitByteSize(
const TkBitField *bf)
{
assert(bf);
return TK_BIT_COUNT_WORDS(bf->size);
}
inline
unsigned
TkBitAdjustSize(
unsigned size)
{
return ((size + (TK_BIT_NBITS - 1))/TK_BIT_NBITS)*TK_BIT_NBITS;
}
inline
TkBitField *
TkBitNew(
unsigned size)
{
TkBitField *bf = TkBitResize(NULL, size);
bf->refCount = 0;
return bf;
}
inline
unsigned
TkBitRefCount(
const TkBitField *bf)
{
assert(bf);
return bf->refCount;
}
inline
void
TkBitIncrRefCount(
TkBitField *bf)
{
assert(bf);
bf->refCount += 1;
}
inline
unsigned
TkBitDecrRefCount(
TkBitField *bf)
{
unsigned refCount;
assert(bf);
assert(TkBitRefCount(bf) > 0);
if ((refCount = --bf->refCount) == 0) {
TkBitDestroy(&bf);
}
return refCount;
}
inline
unsigned
TkBitSize(
const TkBitField *bf)
{
assert(bf);
return bf->size;
}
inline
bool
TkBitIsEmpty(
const TkBitField *bf)
{
assert(bf);
return bf->size == 0;
}
inline
bool
TkBitNone(
const TkBitField *bf)
{
assert(bf);
return bf->size == 0 || TkBitNone_(bf->bits, TK_BIT_COUNT_WORDS(bf->size));
}
inline
bool
TkBitIntersects(
const TkBitField *bf1,
const TkBitField *bf2)
{
return !TkBitDisjunctive(bf1, bf2);
}
inline
bool
TkBitTest(
const TkBitField *bf,
unsigned n)
{
assert(bf);
assert(n < TkBitSize(bf));
return !!(bf->bits[TK_BIT_WORD_INDEX(n)] & TK_BIT_MASK(TK_BIT_INDEX(n)));
}
inline
void
TkBitSet(
TkBitField *bf,
unsigned n)
{
assert(bf);
assert(n < TkBitSize(bf));
bf->bits[TK_BIT_WORD_INDEX(n)] |= TK_BIT_MASK(TK_BIT_INDEX(n));
}
inline
void
TkBitUnset(
TkBitField *bf,
unsigned n)
{
assert(bf);
assert(n < TkBitSize(bf));
bf->bits[TK_BIT_WORD_INDEX(n)] &= ~TK_BIT_MASK(TK_BIT_INDEX(n));
}
inline
void
TkBitPut(
TkBitField *bf,
unsigned n,
bool value)
{
if (value) {
TkBitSet(bf, n);
} else {
TkBitUnset(bf, n);
}
}
#undef _TK_NEED_IMPLEMENTATION
#endif