#pragma once

#include <sys/types.h>
#include <sys/param.h>
#include <parlib/arch/atomic.h>

__BEGIN_DECLS

#define DECL_BITMASK(name, size) \
	uint8_t (name)[BYTES_FOR_BITMASK((size))]

#define BYTES_FOR_BITMASK(size) \
	(((size) - 1) / 8 + 1)

static inline bool GET_BITMASK_BIT(const uint8_t *name, size_t bit)
{
	return name[bit / 8] & (1 << (bit % 8)) ? TRUE : FALSE;
}

static inline void SET_BITMASK_BIT(uint8_t *name, size_t bit)
{
	name[bit / 8] |= 1 << (bit % 8);
}

static inline void CLR_BITMASK_BIT(uint8_t *name, size_t bit)
{
	name[bit / 8] &= ~(1 << (bit % 8));
}

static inline void SET_BITMASK_BIT_ATOMIC(uint8_t *name, size_t bit)
{
	atomic_orb(&name[bit / 8], 1 << (bit % 8));
}

static inline void CLR_BITMASK_BIT_ATOMIC(uint8_t *name, size_t bit)
{
	atomic_andb(&name[bit / 8], ~(1 << (bit % 8)));
}

static inline void CLR_BITMASK(uint8_t *name, size_t size)
{
	memset(name, 0, BYTES_FOR_BITMASK(size));
}

static inline void FILL_BITMASK(uint8_t *name, size_t size)
{
	memset(name, 255, BYTES_FOR_BITMASK(size));
	name[BYTES_FOR_BITMASK(size) - 1] >>= ((size % 8) ? (8 - (size % 8)) : 0);
}

static inline void COPY_BITMASK(uint8_t *newmask, const uint8_t *oldmask,
                                size_t size)
{
	memcpy(newmask, oldmask, BYTES_FOR_BITMASK(size));
}

/* this checks the entire last byte, so keep it 0 in the other functions */
static bool BITMASK_IS_CLEAR(const uint8_t *name, size_t size)
{
	uint32_t __n = BYTES_FOR_BITMASK(size);
	bool clear = TRUE;

	while (__n-- > 0) {
		if (name[__n]) {
			clear = FALSE;
			break;
		}
	}
	return clear;
}

static inline bool BITMASK_IS_FULL(const uint8_t *map, size_t size)
{
	size_t nr_bytes = BYTES_FOR_BITMASK(size);
	int i, j;

	for (i = 0; i < nr_bytes; i++) {
		for (j = 0; j < MIN(8, size); j++) {
			if (!((map[i] >> j) & 1))
				return FALSE;
			size--;
		}
	}
	return TRUE;
}

__END_DECLS
