#ifndef _H_BITFIELD
#define _H_BITFIELD


#include <stdlib.h>
#include <string.h>
#include "_stdint.h"

typedef unsigned char bitfield_t;

extern inline bitfield_t *
bitfield_calloc(int size)
{
        return calloc(1, 1 + ((size_t)size / 8));
}

extern inline int
change_bit(bitfield_t *addr, int nr, int wh)
{
        int	mask, retval;

        addr += nr >> 3;
        mask = 1 << (nr & 0x7);
        retval = (mask & *addr) != 0;
        if(wh)
                *addr |= mask;
        else
                *addr &= ~mask;
        return retval;
}

extern inline int
set_bit(bitfield_t * addr, int nr)
{
	int	mask, retval;

	addr += nr >> 3;
	mask = 1 << (nr & 0x7);
	retval = (mask & *addr) != 0;
	*addr |= mask;
	return retval;
}

extern inline int
clear_bit(bitfield_t * addr, int nr)
{
	int	mask, retval;

	addr += nr >> 3;
	mask = 1 << (nr & 0x7);
	retval = (mask & *addr) != 0;
	*addr &= ~mask;
	return retval;
}

extern inline int
test_bit(bitfield_t * addr, int nr)
{
	int	mask;

	addr += nr >> 3;
	mask = 1 << (nr & 0x7);
	return ((mask & *addr) != 0);
}

extern inline void
bitfield_clear(bitfield_t * addr, int nr)
{
        memset(addr, 0, 1 + (nr / 8));
}


extern inline uint32_t
bit_count(uint32_t x)
{
    x -=  (x>>1) & 0x55555555;
    x  = ((x>>2) & 0x33333333) + (x & 0x33333333);
    x  = ((x>>4) + x) & 0x0f0f0f0f;
    x *= 0x01010101;
    return  x>>24;
}

#endif


