From: Ben Pfaff Date: Mon, 23 Dec 2013 20:56:14 +0000 (-0800) Subject: bitmap: add bitmap_count1 function X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=6ec6fa25511666513ee661f457e48c0aeafe32a6 bitmap: add bitmap_count1 function Signed-off-by: Alexander Wu Signed-off-by: Ben Pfaff --- diff --git a/lib/bitmap.c b/lib/bitmap.c index ac568e97b..51ad5bf91 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -17,6 +17,7 @@ #include #include "bitmap.h" #include +#include "util.h" /* Allocates and returns a bitmap initialized to all-1-bits. */ unsigned long * @@ -92,3 +93,18 @@ bitmap_scan(const unsigned long int *bitmap, size_t start, size_t end) } return i; } + +/* Returns the number of 1-bits in the 'n'-bit bitmap at 'bitmap'. */ +size_t +bitmap_count1(const unsigned long int *bitmap, size_t n) +{ + size_t i; + size_t count = 0; + + BUILD_ASSERT(ULONG_MAX <= UINT64_MAX); + for (i = 0; i < BITMAP_N_LONGS(n); i++) { + count += count_1bits(bitmap[i]); + } + + return count; +} diff --git a/lib/bitmap.h b/lib/bitmap.h index 645f15f22..5e6f8ed0c 100644 --- a/lib/bitmap.h +++ b/lib/bitmap.h @@ -101,6 +101,7 @@ void bitmap_set_multiple(unsigned long *, size_t start, size_t count, bool value); bool bitmap_equal(const unsigned long *, const unsigned long *, size_t n); size_t bitmap_scan(const unsigned long int *, size_t start, size_t end); +size_t bitmap_count1(const unsigned long *, size_t n); #define BITMAP_FOR_EACH_1(IDX, SIZE, BITMAP) \ for ((IDX) = bitmap_scan(BITMAP, 0, SIZE); (IDX) < (SIZE); \