#include <stdint.h>
#include "bitset.h"

#define BITSET_ARRAY_N BITSET_SIZE / 32 + 1

typedef uint32_t word_t;

enum { WORD_SIZE = sizeof(word_t) * 8 };

word_t data[BITSET_ARRAY_N] = {0};

inline int bindex(int b) 
{ 
    return b / WORD_SIZE; 
}

inline int boffset(int b) 
{ 
    return b % WORD_SIZE; 
}

void bitset_set_bit(int b) 
{
    data[bindex(b)] |= 1 << (boffset(b)); 
}

void bitset_clear_bit(int b) 
{
    data[bindex(b)] &= ~(1 << (boffset(b)));
}

int bitset_has(int b) 
{ 
    return ((data[bindex(b)] & (1 << (boffset(b)))) > 0);
}

void bitset_clear_all() 
{ 
    /* set all elements of data to zero */ 
    int i;
    for(i = 0; i < BITSET_ARRAY_N; i++)
        data[i] &= 0;
}

size_t bitset_size()
{
    return sizeof(data);
}

