From: Taylor Blau Date: Thu, 23 May 2024 21:27:02 +0000 (-0400) Subject: ewah: implement `ewah_bitmap_popcount()` X-Git-Tag: v2.46.0-rc0~36^2~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0481cbf912e23d96076e3a7e149e76a0327a7a70;p=thirdparty%2Fgit.git ewah: implement `ewah_bitmap_popcount()` Some of the pseudo-merge test helpers (which will be introduced in the following commit) will want to indicate the total number of commits in or objects reachable from a pseudo-merge. Implement a popcount() function that operates on EWAH bitmaps to quickly determine how many bits are set in each of the respective bitmaps. Signed-off-by: Taylor Blau Signed-off-by: Junio C Hamano --- diff --git a/ewah/bitmap.c b/ewah/bitmap.c index d352fec54c..dc2ca190f1 100644 --- a/ewah/bitmap.c +++ b/ewah/bitmap.c @@ -212,6 +212,20 @@ size_t bitmap_popcount(struct bitmap *self) return count; } +size_t ewah_bitmap_popcount(struct ewah_bitmap *self) +{ + struct ewah_iterator it; + eword_t word; + size_t count = 0; + + ewah_iterator_init(&it, self); + + while (ewah_iterator_next(&word, &it)) + count += ewah_bit_popcount64(word); + + return count; +} + int bitmap_is_empty(struct bitmap *self) { size_t i; diff --git a/ewah/ewok.h b/ewah/ewok.h index 2b6c4ac499..7074a6347b 100644 --- a/ewah/ewok.h +++ b/ewah/ewok.h @@ -195,6 +195,7 @@ void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other); void bitmap_or(struct bitmap *self, const struct bitmap *other); size_t bitmap_popcount(struct bitmap *self); +size_t ewah_bitmap_popcount(struct ewah_bitmap *self); int bitmap_is_empty(struct bitmap *self); #endif