diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4cdf5ff..cd5dd71 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,7 @@ set(SOURCES
bitmap.c
)
+add_compile_definitions(CU_64BIT)
add_library(cutil STATIC ${SOURCES} ${HEADERS})
add_executable(test test.c)
diff --git a/bitmap.h b/bitmap.h
index 9782c52..d3db538 100644
--- a/bitmap.h
+++ b/bitmap.h
@@ -3,7 +3,17 @@
#include "cutypes.h"
-#define bit_align2(v, p) (((v>>p)+!!(v&((1<
>(p))&1)
+#define bit_test(v, p) (!!(v&(1<<(p))))
+#define bit_sub2_up(v, p) ((v>>(p))+!!(v&((1<<(p))-1)))
+#define bit_align2(v, p) (bit_sub2_up(v, (p))<<(p))
uint bit_log2(uint64_t value);
+#define bitmap(name, s) uword name[bit_sub2_up(s, CU_WORD_POW2)] = {0}
+#define bitmap_set(m, p, b) \
+ bit_set((m)[p>>CU_WORD_POW2], p&((1<>CU_WORD_POW2], p&((1<
#include
-typedef unsigned int uint;
+#if (!defined(CU_64BIT) && !defined(CU_32BIT))
+# define CU_64BIT
+#endif
+
+#if defined(CU_64BIT)
+#define CU_WORD_BITS 64
+#define CU_WORD_POW2 6
+typedef uint64_t uword;
+typedef int64_t iword;
+#elif defined(CU_32BIT)
+#define CU_WORD_BITS 32
+#define CU_WORD_POW2 5
+typedef uint32_t uword;
+typedef int32_t iword;
+#else
+# warning "define CU_32BIT or CU_64BIT"
+#endif
+
+typedef uint32_t uint;
#define CU_UINT_SIZE sizeof(uint)
typedef void* cu_ptr;
diff --git a/test.c b/test.c
index 98b8b78..00a1d07 100644
--- a/test.c
+++ b/test.c
@@ -52,8 +52,24 @@ int main()
array.size, array.count, array.align);
array_clear(&array);
+ printf("[cutypes]\n");
+ printf("uword\t%u\n", sizeof(uword) * 8);
+ printf("uint\t%u\n", sizeof(uint) * 8);
+
printf("[bitmap]\n");
printf("bit_align2\t%u\n", bit_align2(354, 3));
printf("bit_log2\t%u\n", bit_log2(34));
+ num = 5;
+ bit_set(num, 1, 1);
+ printf("bit_get\t%u\n", bit_get(num, 0));
+ printf("num\t%u\n", num);
+ bitmap(m, 128);
+ bitmap_set(m, 0, 1);
+ bitmap_set(m, 5, 1);
+ bitmap_set(m, 64, 1);
+ printf("bitmap\t%u\t%u\n", m[0], m[1]);
+ printf("bitmap\t%u\t%u\n", bitmap_get(m, 0), bitmap_get(m, 64));
+ bitmap_set(m, 5, 0);
+ printf("bitmap\t%u\n", bitmap_get(m, 5));
return 0;
}
\ No newline at end of file