#pragma once

#include <parlib/arch/bitmask.h>

__BEGIN_DECLS

static inline bool BITMASK_IS_SET_IN_RANGE(const uint8_t *m, size_t beg,
                                           size_t end)
{
	size_t i;

	for (i = beg; i < end; i++) {
		if (!GET_BITMASK_BIT(m, i))
			return FALSE;
	}
	return TRUE;
}

static inline bool BITMASK_IS_CLR_IN_RANGE(const uint8_t *m, size_t beg,
                                           size_t end)
{
	size_t i;

	for (i = beg; i < end; i++) {
		if (GET_BITMASK_BIT(m, i))
			return FALSE;
	}
	return TRUE;
}

static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
{
	size_t i;

	for (i = beg; i < end; i++)
		SET_BITMASK_BIT(m, i);
}

static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
{
	size_t i;

	for (i = beg; i < end; i++)
		CLR_BITMASK_BIT(m, i);
}

/* Runs *work on every bit in the bitmask, passing *work the value of the bit
 * that is set.  Optionally clears the bit from the bitmask. 
 *
 * We need this to be a macro, so that the calling code doesn't need the
 * address for work_fn.  This matters for code that has nested functions that
 * use local variables, since taking the address of work_fn will force the
 * compiler to put the function on the stack and incur icache coherency
 * overheads. */
#define BITMASK_FOREACH_SET(name, size, work_fn, clear)                        \
{                                                                              \
	int i;                                                                 \
	for (i = 0; i < (size); i++) {                                         \
		bool present = GET_BITMASK_BIT((name), i);                     \
		if (present && (clear))                                        \
			CLR_BITMASK_BIT_ATOMIC((name), i);                     \
		if (present)                                                   \
			(work_fn)(i);                                          \
	}                                                                      \
}                                                                              
                                                                               
__END_DECLS
