summaryrefslogtreecommitdiff
path: root/lib/bitmap.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bitmap.h')
-rw-r--r--lib/bitmap.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/bitmap.h b/lib/bitmap.h
new file mode 100644
index 00000000..df2945a1
--- /dev/null
+++ b/lib/bitmap.h
@@ -0,0 +1,62 @@
+/*
+ * 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