Add bitarray test. Fixes and add dump function.
authorasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 31 Aug 2010 09:12:43 +0000 (09:12 +0000)
committerasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 31 Aug 2010 09:12:43 +0000 (09:12 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4210 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/struct/bitarray.h
bertos/struct/bitarray_test.c

index 60dd26112bf3aa6d0a2ce4ceb6cfe1ce75ccf8b6..8fbef32c0089bc9c20fc1bf8bf0dee0a3d192235 100644 (file)
@@ -53,14 +53,14 @@ typedef struct BitArray
 } BitArray;
 
 
-#define ALLOC_BITARRAY(name, size)   uint8_t name[DIV_ROUNDUP((size),8)]
+#define ALLOC_BITARRAY(name, size)   uint8_t name[DIV_ROUNDUP((size), 8)]
 
 
 INLINE void bitarray_set(BitArray *ctx, int idx)
 {
        ASSERT((size_t)idx <= ctx->size);
        int page = idx / 8;
-       int bit = idx % 8;
+       uint8_t bit = idx % 8;
 
        ctx->array[page] |= BV(bit);
 }
@@ -69,7 +69,7 @@ INLINE void bitarray_clear(BitArray *ctx, int idx)
 {
        ASSERT((size_t)idx <= ctx->size);
        int page = idx / 8;
-       int bit = idx % 8;
+       uint8_t bit = idx % 8;
 
        ctx->array[page] &= ~BV(bit);
 }
@@ -78,17 +78,40 @@ INLINE bool bitarray_check(BitArray *ctx, int idx)
 {
        ASSERT((size_t)idx <= ctx->size);
        int page = idx / 8;
-       int bit = idx % 8;
+       uint8_t bit = idx % 8;
 
        return (ctx->array[page] & BV(bit));
 }
 
 INLINE void init_bitarray(BitArray *ctx, uint8_t *array, size_t size)
 {
-       ctx->size = size;
+       ctx->size = size * 8;
        ctx->array = array;
 }
 
+INLINE size_t bitarray_size(BitArray *ctx)
+{
+       return ctx->size;
+}
+
+INLINE void bitarray_dump(BitArray *ctx)
+{
+       int i = 0;
+       int j = 0;
+       size_t len = ctx->size;
+       kprintf("bitarray size[%zu]\n", ctx->size);
+       while (len--)
+       {
+               kprintf("%d", bitarray_check(ctx, i++));
+               if (j == 7)
+               {
+                       kprintf("..%02x [%d] %d\n", ctx->array[i / 8], len, i);
+                       j = 0;
+                       continue;
+               }
+               j++;
+       }
+}
 
 int bitarray_testSetup(void);
 int bitarray_testRun(void);
index fa65c44a0791f625f47c3a0b40b26d043c0a99ab..dde22981d17dcf231d8e4d2cd9b34b4dd7f7ef3d 100644 (file)
@@ -41,7 +41,9 @@
 #include <cfg/test.h>
 #include <cfg/debug.h>
 
-ALLOC_BITARRAY(test1, 128);
+#include <string.h>
+
+ALLOC_BITARRAY(test1, 31);
 BitArray ctx;
 
 int bitarray_testSetup(void)
@@ -53,6 +55,55 @@ int bitarray_testSetup(void)
 
 int bitarray_testRun(void)
 {
+       memset(test1, 0xaa, sizeof(test1));
+       bitarray_dump(&ctx);
+
+       for (int i = 0; i < bitarray_size(&ctx); i++)
+       {
+               if (!((bool)(i % 2) == bitarray_check(&ctx, i)))
+               {
+                       kprintf("Error!\n");
+                       return -1;
+               }
+       }
+
+       memset(test1, 0, sizeof(test1));
+       for (int i = 0; i < bitarray_size(&ctx); i++)
+       {
+               if ((i % 2) == 0)
+                       bitarray_clear(&ctx, i);
+               else
+                       bitarray_set(&ctx, i);
+       }
+
+       bitarray_dump(&ctx);
+       for (int i = 0; i < bitarray_size(&ctx); i++)
+       {
+               if (!((bool)(i % 2) == bitarray_check(&ctx, i)))
+               {
+                       kprintf("Error!\n");
+                       return -1;
+               }
+       }
+
+       memset(test1, 0, sizeof(test1));
+       bitarray_set(&ctx, 0);
+       bitarray_dump(&ctx);
+       if (!bitarray_check(&ctx, 0))
+       {
+               kprintf("Error!\n");
+               return -1;
+       }
+
+       memset(test1, 0, sizeof(test1));
+       bitarray_set(&ctx, bitarray_size(&ctx));
+       bitarray_dump(&ctx);
+       if (!bitarray_check(&ctx, bitarray_size(&ctx)))
+       {
+               kprintf("Error!\n");
+               return -1;
+       }
+
        return 0;
 }