diff --git a/src/data/bitfield.c b/src/data/bitfield.c index f63cca3..99c65bc 100644 --- a/src/data/bitfield.c +++ b/src/data/bitfield.c @@ -20,7 +20,6 @@ int tl_bitfield_hamming(tl_bitfield *b1, tl_bitfield *b2, int32_t* dist) int32_t len = b1->alloc_len; int32_t count = 0; for(int i = 0; i < len; i++){ - /* fprintf(stderr, "b1->m[%d] = %llX b2->m[%d] = %llX\n", i, b1->m[i], i, b2->m[i]); */ count += _tl_bitfield_popcount_branchless(b1->m[i] ^ b2->m[i]); } *dist = count; @@ -51,12 +50,13 @@ int tl_bitfield_set(tl_bitfield *b, int32_t index) return OK; } -int tl_bitfield_get(tl_bitfield *b, int32_t index) +int tl_bitfield_get(tl_bitfield *b, int32_t index, uint8_t* bit) { if(index < 0 || index >= b->len){ return FAIL; } - return (b->m[index >> BIT_SHIFT] & (1ULL << (index & BIT_MASK))) != 0; + *bit = (b->m[index >> BIT_SHIFT] & (1ULL << (index & BIT_MASK))) != 0; + return OK; } int tl_bitfield_clear(tl_bitfield *b, int32_t index) @@ -101,7 +101,6 @@ void tl_bitfield_free(tl_bitfield *b) } - #undef BIT_MASK #undef BIT_SHIFT #undef BITS_W diff --git a/src/data/bitfield.h b/src/data/bitfield.h index c35c10e..676dfea 100644 --- a/src/data/bitfield.h +++ b/src/data/bitfield.h @@ -15,7 +15,7 @@ tld_external int tl_bitfield_hamming(tl_bitfield *b1, tl_bitfield *b2, int32_t* tld_external int tl_bitfield_set(tl_bitfield *b, int32_t index); -tld_external int tl_bitfield_get(tl_bitfield *b, int32_t index); +tld_external int tl_bitfield_get(tl_bitfield *b, int32_t index, uint8_t* bit); tld_external int tl_bitfield_clear(tl_bitfield *b, int32_t index); tld_external int tl_bitfield_reset(tl_bitfield *b); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index afbc438..d0e68b1 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,13 +17,13 @@ target_link_libraries(unit-tpool PRIVATE tld-dev Threads::Threads) endif(Threads_FOUND) -add_executable(unit_bit +add_executable(unit-bit utests/unit_bitfield.c ) -target_link_libraries(unit_bit PRIVATE tld-dev) +target_link_libraries(unit-bit PRIVATE tld-dev) add_test( - NAME unit_bit - COMMAND unit_bit + NAME unit-bit + COMMAND unit-bit ) add_executable(unit-kdtree utests/unit_kdtree.c) diff --git a/tests/utests/unit_bitfield.c b/tests/utests/unit_bitfield.c index db45a00..1d43193 100644 --- a/tests/utests/unit_bitfield.c +++ b/tests/utests/unit_bitfield.c @@ -51,19 +51,20 @@ To make sure bits are set and can be retrieved int tl_bitfield_test3(void) { tl_bitfield *b = NULL; int status = 0; + uint8_t bit = 0; tl_bitfield_alloc(&b, 100); for(int i = 0; i < 100; i++){ tl_bitfield_set(b, i); } for(int i = 0; i < 100; i++){ - status = tl_bitfield_get(b, i); - if(status != 1){ + RUN(tl_bitfield_get(b, i,&bit)); + if(bit != 1){ ERROR_MSG("tl_bitfield_get failed"); } } - status = tl_bitfield_get(b, 100); + status = tl_bitfield_get(b, 100,&bit); if(status != FAIL){ ERROR_MSG("tl_bitfield_get failed"); } @@ -106,7 +107,33 @@ int tl_bitfield_test4(void) return OK; ERROR: return FAIL; +} + +/* Test to set and get bits */ +int tl_bitfield_test5(void) +{ + tl_bitfield *b = NULL; + int status = 0; + uint8_t bit = 0; + tl_bitfield_alloc(&b, 100); + for(int i = 0; i < 100; i++){ + tl_bitfield_set(b, i); + } + + for(int i = 0; i < 100; i++){ + RUN(tl_bitfield_get(b, i,&bit)); + if(bit != 1){ + ERROR_MSG("tl_bitfield_get failed"); + } + } + status = tl_bitfield_get(b, 100, &bit); + if(status != FAIL){ + ERROR_MSG("tl_bitfield_get failed"); + } + return OK; +ERROR: + return FAIL; } int main(void) @@ -117,6 +144,7 @@ int main(void) RUN(tl_bitfield_test3()); RUN(tl_bitfield_test4()); + RUN(tl_bitfield_test5()); return EXIT_SUCCESS; ERROR: return EXIT_FAILURE;