path: root/ewah
diff options
authorJeff King <>2020-02-14 18:22:34 (GMT)
committerJunio C Hamano <>2020-02-14 18:46:22 (GMT)
commitcc4aa28506e079e0c17cfbe78743530795803ea8 (patch)
treef8881832cb2e89da9722e2330712db21a406fa62 /ewah
parent2aaeb9ac414d75f875efa968480db1ce85dc8dc5 (diff)
bitmap: add bitmap_unset() function
We've never needed to unset an individual bit in a bitmap until now. Typically they start with all bits unset and we bitmap_set() them, or we are applying another bitmap as a mask. But the easiest way to apply an object filter to a bitmap result will be to unset the individual bits. Signed-off-by: Jeff King <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'ewah')
2 files changed, 9 insertions, 0 deletions
diff --git a/ewah/bitmap.c b/ewah/bitmap.c
index 52f1178..1c31b3e 100644
--- a/ewah/bitmap.c
+++ b/ewah/bitmap.c
@@ -45,6 +45,14 @@ void bitmap_set(struct bitmap *self, size_t pos)
self->words[block] |= EWAH_MASK(pos);
+void bitmap_unset(struct bitmap *self, size_t pos)
+ size_t block = EWAH_BLOCK(pos);
+ if (block < self->word_alloc)
+ self->words[block] &= ~EWAH_MASK(pos);
int bitmap_get(struct bitmap *self, size_t pos)
size_t block = EWAH_BLOCK(pos);
diff --git a/ewah/ewok.h b/ewah/ewok.h
index 84b2a29..59f4ef7 100644
--- a/ewah/ewok.h
+++ b/ewah/ewok.h
@@ -173,6 +173,7 @@ struct bitmap {
struct bitmap *bitmap_new(void);
void bitmap_set(struct bitmap *self, size_t pos);
+void bitmap_unset(struct bitmap *self, size_t pos);
int bitmap_get(struct bitmap *self, size_t pos);
void bitmap_reset(struct bitmap *self);
void bitmap_free(struct bitmap *self);