Browse Source

bitmap: Add helper macro to statically declare bitmaps

For use as direct locals, or when the size is a constant, inside
structure definitions.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson 12 years ago
parent
commit
6a9c567b38
3 changed files with 29 additions and 8 deletions
  1. 1 0
      ccan/bitmap/_info
  2. 3 0
      ccan/bitmap/bitmap.h
  3. 25 8
      ccan/bitmap/test/run.c

+ 1 - 0
ccan/bitmap/_info

@@ -23,6 +23,7 @@ int main(int argc, char *argv[])
 
         if (strcmp(argv[1], "testdepends") == 0) {
                 printf("ccan/array_size\n");
+		printf("ccan/foreach\n");
                 return 0;
         }
 

+ 3 - 0
ccan/bitmap/bitmap.h

@@ -22,6 +22,9 @@ typedef struct {
 	bitmap_word w;
 } bitmap;
 
+#define BITMAP_DECLARE(_name, _nbits) \
+	bitmap (_name)[BITMAP_NWORDS(_nbits)]
+
 static inline size_t bitmap_sizeof(int nbits)
 {
 	return BITMAP_NWORDS(nbits) * sizeof(bitmap_word);

+ 25 - 8
ccan/bitmap/test/run.c

@@ -1,6 +1,7 @@
 #include <ccan/bitmap/bitmap.h>
 #include <ccan/tap/tap.h>
 #include <ccan/array_size/array_size.h>
+#include <ccan/foreach/foreach.h>
 
 int bitmap_sizes[] = {
 	1, 2, 3, 4, 5, 6, 7, 8,
@@ -11,13 +12,21 @@ int bitmap_sizes[] = {
 #define NSIZES ARRAY_SIZE(bitmap_sizes)
 #define NTESTS 9
 
-static void test_sizes(int nbits)
+static void test_sizes(int nbits, bool dynalloc)
 {
-	bitmap *bitmap = bitmap_alloc(nbits);
+	BITMAP_DECLARE(sbitmap, nbits);
+	uint32_t marker;
+	bitmap *bitmap;
 	int i, j;
 	bool wrong;
 
-	ok1(bitmap != NULL);
+	if (dynalloc) {
+		bitmap = bitmap_alloc(nbits);
+		ok1(bitmap != NULL);
+	} else {
+		bitmap = sbitmap;
+		marker = 0xdeadbeef;
+	}
 
 	bitmap_zero(bitmap, nbits);
 	wrong = false;
@@ -78,20 +87,28 @@ static void test_sizes(int nbits)
 		wrong = wrong || bitmap_full(bitmap, nbits);
 	}
 	ok1(!wrong);
-		
-	free(bitmap);
+	
+	if (dynalloc) {
+		free(bitmap);
+	} else {
+		ok1(marker == 0xdeadbeef);
+	}
 }
 
 int main(void)
 {
 	int i;
+	bool dynalloc;
 
 	/* This is how many tests you plan to run */
-	plan_tests(NSIZES * NTESTS);
+	plan_tests(NSIZES * NTESTS * 2);
 
 	for (i = 0; i < NSIZES; i++) {
-		diag("Testing %d-bit bitmap", bitmap_sizes[i]);
-		test_sizes(bitmap_sizes[i]);
+		foreach_int(dynalloc, false, true) {
+			diag("Testing %d-bit bitmap (%s allocation)",
+			     bitmap_sizes[i], dynalloc ? "dynamic" : "static");
+			test_sizes(bitmap_sizes[i], dynalloc);
+		}
 	}
 
 	/* This exits depending on whether all tests passed */