ref: a4a9799d91c55b7b5922148a661a5141ba22b6db
dir: /parse/ds.c/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <limits.h>
#include "parse.h"
#define Uintbits (CHAR_BIT*sizeof(int))
Bitset *mkbs()
{
Bitset *bs;
bs = xalloc(sizeof(Bitset));
bs->nchunks = 1;
bs->chunks = xalloc(1*sizeof(uint));
return bs;
}
void delbs(Bitset *bs)
{
free(bs->chunks);
free(bs);
}
void bsput(Bitset *bs, uint elt)
{
if (elt >= bs->nchunks*Uintbits) {
bs->nchunks = (elt/Uintbits)+1;
bs->chunks = xrealloc(bs->chunks, bs->nchunks*sizeof(uint));
}
bs->chunks[elt/Uintbits] |= 1 << (elt % Uintbits);
}
void bsdel(Bitset *bs, uint elt)
{
if (elt < bs->nchunks*Uintbits)
bs->chunks[elt/Uintbits] &= ~(1 << (elt % Uintbits));
}
int bshas(Bitset *bs, uint elt)
{
if (elt >= bs->nchunks*Uintbits)
return 0;
else
return bs->chunks[elt/Uintbits] & (1 << (elt % Uintbits));
}