bitmap: implement bitmap_set_range, bitmap_get and bitmap_destroy

This commit is contained in:
2026-04-25 16:48:58 -03:00
committed by Matheus
parent 1d1e66fe32
commit 1dea5f12a8
2 changed files with 45 additions and 6 deletions
+41 -5
View File
@@ -4,22 +4,58 @@
#include <util.h>
#include <logging.h>
#define BYTE_INDEX(idx) ((idx) / (sizeof(long) * 8))
#define BIT_INDEX(idx) ((idx) % (sizeof(long) * 8))
int bitmap_init(bitmap_t *bitmap, size_t size) {
bitmap->data = alloc(size);
bitmap->size = size;
if (bitmap->data != NULL)
memset(bitmap->data, 0, size);
return bitmap->data ? 0 : ENOMEM;
}
void bitmap_set(bitmap_t *bitmap, long idx, int v) {
__assert(bitmap->size > idx);
void bitmap_destroy(bitmap_t *bitmap) {
free(bitmap->data);
bitmap->data = NULL;
bitmap->size = 0;
}
long bit = 1llu << (idx % sizeof(*bitmap->data));
void bitmap_set(bitmap_t *bitmap, long idx, int v) {
__assert(idx < bitmap->size);
long *ptr = &bitmap->data[BYTE_INDEX(idx)];
long bit = 1lu << BIT_INDEX(idx);
if (v)
bitmap->data[idx / sizeof(*bitmap->data)] |= bit;
*ptr |= bit;
else
bitmap->data[idx / sizeof(*bitmap->data)] &= ~bit;
*ptr &= ~bit;
}
void bitmap_set_range(bitmap_t *bitmap, long start, long count, int v) {
__assert(start + count <= bitmap->size);
for (long i = 0; i < count; ++i) {
long idx = start + i;
long *ptr = &bitmap->data[BYTE_INDEX(idx)];
long bit = 1lu << BIT_INDEX(idx);
if (v)
*ptr |= bit;
else
*ptr &= ~bit;
}
}
bool bitmap_get(bitmap_t *bitmap, long idx) {
__assert(idx < bitmap->size);
long bit = 1lu << BIT_INDEX(idx);
return bitmap->data[BYTE_INDEX(idx)] & bit;
}
long bitmap_find_first_set(bitmap_t *bitmap) {