diff --git a/include/sparsemap.h b/include/sparsemap.h index 8378690..f3a1ab6 100644 --- a/include/sparsemap.h +++ b/include/sparsemap.h @@ -285,6 +285,13 @@ sparsemap_idx_t sparsemap_get_starting_offset(sparsemap_t *map); */ sparsemap_idx_t sparsemap_get_ending_offset(sparsemap_t *map); +/** @brief Returns the percent of bits set in the map. + * + * @param[in] map The sparsemap reference. + * @returns the percent of bits set. + */ +double sparsemap_fill_factor(sparsemap_t *map); + /** @brief Provides a method for a callback function to examine every bit set in * the index. * diff --git a/src/sparsemap.c b/src/sparsemap.c index ac11708..44994a2 100644 --- a/src/sparsemap.c +++ b/src/sparsemap.c @@ -1183,7 +1183,7 @@ sparsemap_set(sparsemap_t *map, sparsemap_idx_t idx, bool value) __sm_append_data(map, &buf[0], sizeof(buf)); uint8_t *p = __sm_get_chunk_data(map, 0); - *(sm_idx_t *)p = __sm_get_vector_aligned_offset(idx); // TODO: vector or chunk aligned? + *(sm_idx_t *)p = __sm_get_chunk_aligned_offset(idx); // TODO: vector or chunk aligned? __sm_set_chunk_count(map, 1); @@ -1384,6 +1384,14 @@ sparsemap_get_ending_offset(sparsemap_t *map) return offset; } +double +sparsemap_fill_factor(sparsemap_t *map) +{ + size_t rank = sparsemap_rank(map, 0, SPARSEMAP_IDX_MAX, true); + sparsemap_idx_t end = sparsemap_get_ending_offset(map); + return (double)rank / (double)end * 100.0; +} + void * sparsemap_get_data(sparsemap_t *map) {