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