2#define REDUCT_BITMAP_H 1
16#define REDUCT_BITMAP_WIDTH 64
18#define REDUCT_BITMAP_INDEX_NONE (~(uint64_t)0)
25#define REDUCT_BITMAP_SIZE(_size) (((_size) + (REDUCT_BITMAP_WIDTH - 1)) / REDUCT_BITMAP_WIDTH)
33#define REDUCT_BITMAP_SET(_bitmap, _bit) \
34 ((_bitmap)[(_bit) / REDUCT_BITMAP_WIDTH] |= (1ULL << ((_bit) % REDUCT_BITMAP_WIDTH)))
42#define REDUCT_BITMAP_CLEAR(_bitmap, _bit) \
43 ((_bitmap)[(_bit) / REDUCT_BITMAP_WIDTH] &= ~(1ULL << ((_bit) % REDUCT_BITMAP_WIDTH)))
52#define REDUCT_BITMAP_TEST(_bitmap, _bit) \
53 (((_bitmap)[(_bit) / REDUCT_BITMAP_WIDTH] & (1ULL << ((_bit) % REDUCT_BITMAP_WIDTH))) != 0)
65 for (
size_t i = 0; i < count; i++)
81 for (
size_t i = 0; i < size; i++)
83 if (bitmap[i] != ~(uint64_t)0)
87 if (!(bitmap[i] & (1ULL << b)))
120 if (word & (1ULL << b))
127 for (i++; i < size; i++)
133 if (bitmap[i] & (1ULL << b))
167 if (word & (1ULL << b))
174 for (i++; i < size; i++)
176 if (bitmap[i] != ~(uint64_t)0)
180 if (!(bitmap[i] & (1ULL << b)))
205 for (
size_t i = size; i > 0; i--)
208 if (bitmap[idx] != 0)
212 if (bitmap[idx] & (1ULL << b))
#define REDUCT_BITMAP_INDEX_NONE
Invalid bitmap index.
uint64_t reduct_bitmap_t
A single word in a bitmap.
#define REDUCT_BITMAP_SET(_bitmap, _bit)
Set a bit in a bitmap.
static size_t reduct_bitmap_next_clear(const reduct_bitmap_t *bitmap, size_t size, size_t start)
Find the next clear bit in a bitmap starting from a given index.
#define REDUCT_BITMAP_WIDTH
The number of bits in a bitmap word.
static size_t reduct_bitmap_set_range(reduct_bitmap_t *bitmap, size_t start, size_t count)
Set a range of bits in a bitmap.
static size_t reduct_bitmap_find_first_clear(const reduct_bitmap_t *bitmap, size_t size)
Find the first clear bit in a bitmap.
static size_t reduct_bitmap_find_last_set(const reduct_bitmap_t *bitmap, size_t size)
Find the last set bit in a bitmap.
static size_t reduct_bitmap_next_set(const reduct_bitmap_t *bitmap, size_t size, size_t start)
Find the next set bit in a bitmap starting from a given index.