af02b83b88
Basic bitmap is obvious. Hierarchical bitmap is structure of several bitmaps, where higher levels are conjunctions of intervals on level below, allowing for efficient lookup of first unset bit.
62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
/*
|
|
* BIRD Library -- Bitmaps
|
|
*
|
|
* (c) 2019 Ondrej Zajicek <santiago@crfreenet.org>
|
|
* (c) 2019 CZ.NIC z.s.p.o.
|
|
*
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
*/
|
|
|
|
#ifndef _BIRD_BITMAP_H_
|
|
#define _BIRD_BITMAP_H_
|
|
|
|
struct bmap
|
|
{
|
|
u32 size;
|
|
u32 *data;
|
|
};
|
|
|
|
void bmap_init(struct bmap *b, pool *p, uint size);
|
|
void bmap_grow(struct bmap *b, uint need);
|
|
void bmap_free(struct bmap *b);
|
|
|
|
static inline uint bmap_max(struct bmap *b)
|
|
{ return 8 * b->size; }
|
|
|
|
static inline int bmap_test(struct bmap *b, uint n)
|
|
{ return (n < bmap_max(b)) && BIT32_TEST(b->data, n); }
|
|
|
|
static inline void bmap_set(struct bmap *b, uint n)
|
|
{
|
|
if (n >= bmap_max(b)) bmap_grow(b, n/8 + 1);
|
|
BIT32_SET(b->data, n);
|
|
}
|
|
|
|
static inline void bmap_clear(struct bmap *b, uint n)
|
|
{
|
|
if (n >= bmap_max(b)) return;
|
|
BIT32_CLR(b->data, n);
|
|
}
|
|
|
|
|
|
struct hmap
|
|
{
|
|
u32 size[4];
|
|
u32 *data[4];
|
|
u32 root[8];
|
|
};
|
|
|
|
static inline uint hmap_max(struct hmap *b)
|
|
{ return 8 * b->size[0]; }
|
|
|
|
static inline int hmap_test(struct hmap *b, uint n)
|
|
{ return (n < hmap_max(b)) && BIT32_TEST(b->data[0], n); }
|
|
|
|
void hmap_init(struct hmap *b, pool *p, uint size);
|
|
void hmap_free(struct hmap *b);
|
|
void hmap_set(struct hmap *b, uint n);
|
|
void hmap_clear(struct hmap *b, uint n);
|
|
u32 hmap_first_zero(struct hmap *b);
|
|
void hmap_check(struct hmap *b);
|
|
|
|
#endif
|