#ifndef BITMAP_H_
#define BITMAP_H_
#include "system/mm_allocator.h"
#define BITMAP_BLOCK_ELEMENTS 64
#define BITMAP_BLOCK_MASK 0x0000000000000001ul
#define BITMAP_PREFETCH_BLOCK(bm,position) \
PREFETCH(bm->bitmap_blocks+(position/BITMAP_BLOCK_ELEMENTS))
#define BITMAP_GET_BLOCK(bm,position,block_bitmap_ptr) \
const uint64_t block_num = position / BITMAP_BLOCK_ELEMENTS; \
uint64_t* const block_bitmap_ptr = &(bm->bitmap_blocks[block_num].bitmap)
#define BM_BLOCK_IS_SET(block_bitmap,position) \
(block_bitmap & (BITMAP_BLOCK_MASK << (position % BITMAP_BLOCK_ELEMENTS)))
#define BM_BLOCK_SET(block_bitmap,position) \
(block_bitmap |= (BITMAP_BLOCK_MASK << (position % BITMAP_BLOCK_ELEMENTS)))
typedef struct {
uint64_t counter;
uint64_t bitmap;
} bitmap_block_t;
typedef struct {
uint64_t num_blocks;
bitmap_block_t* bitmap_blocks;
mm_allocator_t* mm_allocator;
} bitmap_t;
bitmap_t* bitmap_new(
const uint64_t length,
mm_allocator_t* const mm_allocator);
void bitmap_delete(
bitmap_t* const bitmap);
void bitmap_set(
bitmap_t* const bitmap,
const uint64_t pos);
bool bitmap_is_set(
bitmap_t* const bitmap,
const uint64_t pos);
bool bitmap_check__set(
bitmap_t* const bitmap,
const uint64_t pos);
void bitmap_update_counters(
bitmap_t* const bitmap);
uint64_t bitmap_erank(
bitmap_t* const bitmap,
const uint64_t pos);
#endif