This commit is contained in:
Gregory Burd 2024-05-16 12:00:09 -04:00
parent a5c62cfe1e
commit e398d014e8
4 changed files with 23 additions and 11 deletions

View file

@ -79,3 +79,9 @@ target_link_libraries(test PRIVATE sparsemap)
target_include_directories(test PRIVATE ${HEADER_DIR}) target_include_directories(test PRIVATE ${HEADER_DIR})
add_custom_target(run_test COMMAND test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_custom_target(run_test COMMAND test WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# Add soak program
add_executable(soak tests/soak.c lib/common.c lib/tdigest.c lib/roaring.c)
target_link_libraries(soak PRIVATE sparsemap)
target_include_directories(soak PRIVATE ${HEADER_DIR} lib)
target_link_libraries(soak PUBLIC m)
add_custom_target(run_soak COMMAND soak WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

View file

@ -186,15 +186,17 @@ main()
sparsemap_clear(map); sparsemap_clear(map);
for (int i = 0; i < 2048 * 3; i++) { for (int i = 0; i < 2048 * 3; i++) {
sparsemap_set(map, i, true); sparsemap_set(map, i, true);
assert(sparsemap_is_set(map, i) == true);
} }
sparsemap_split(map, 64, sm2); sparsemap_split(map, 64, sm2);
for (int i = 0; i < 64; i++) { for (int i = 0; i < 2048 * 3; i++) {
assert(sparsemap_is_set(map, i) == true); if (i < 64) {
assert(sparsemap_is_set(sm2, i) == false); assert(sparsemap_is_set(map, i) == true);
} assert(sparsemap_is_set(sm2, i) == false);
for (int i = 64; i < 2048 * 3; i++) { } else {
assert(sparsemap_is_set(map, i) == false); assert(sparsemap_is_set(map, i) == false);
assert(sparsemap_is_set(sm2, i) == true); assert(sparsemap_is_set(sm2, i) == true);
}
} }
fprintf(stderr, " ok\n"); fprintf(stderr, " ok\n");

View file

@ -1075,7 +1075,7 @@ void
sparsemap_open(sparsemap_t *map, uint8_t *data, size_t size) sparsemap_open(sparsemap_t *map, uint8_t *data, size_t size)
{ {
map->m_data = data; map->m_data = data;
map->m_data_used = map->m_data_used > 0 ? map->m_data_used : 0; map->m_data_used = __sm_get_size_impl(map);
map->m_capacity = size; map->m_capacity = size;
} }
@ -1183,7 +1183,7 @@ sparsemap_set(sparsemap_t *map, sparsemap_idx_t idx, bool value)
__sm_append_data(map, &buf[0], sizeof(buf)); __sm_append_data(map, &buf[0], sizeof(buf));
uint8_t *p = __sm_get_chunk_data(map, 0); 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);
__sm_set_chunk_count(map, 1); __sm_set_chunk_count(map, 1);
@ -1209,7 +1209,7 @@ sparsemap_set(sparsemap_t *map, sparsemap_idx_t idx, bool value)
uint8_t buf[sizeof(sm_idx_t) + sizeof(sm_bitvec_t) * 2] = { 0 }; uint8_t buf[sizeof(sm_idx_t) + sizeof(sm_bitvec_t) * 2] = { 0 };
__sm_insert_data(map, offset, &buf[0], sizeof(buf)); __sm_insert_data(map, offset, &buf[0], sizeof(buf));
size_t aligned_idx = __sm_get_vector_aligned_offset(idx); // TODO: vector or chunk alignment? size_t aligned_idx = __sm_get_chunk_aligned_offset(idx);
if (start - aligned_idx < SM_CHUNK_MAX_CAPACITY) { if (start - aligned_idx < SM_CHUNK_MAX_CAPACITY) {
__sm_chunk_t chunk; __sm_chunk_t chunk;
__sm_chunk_init(&chunk, p + sizeof(sm_idx_t)); __sm_chunk_init(&chunk, p + sizeof(sm_idx_t));
@ -1402,6 +1402,10 @@ size_t
sparsemap_get_size(sparsemap_t *map) sparsemap_get_size(sparsemap_t *map)
{ {
if (map->m_data_used) { if (map->m_data_used) {
size_t size = __sm_get_size_impl(map);
if (size != map->m_data_used) {
map->m_data_used = size;
}
__sm_when_diag({ __sm_assert(map->m_data_used == __sm_get_size_impl(map)); }); __sm_when_diag({ __sm_assert(map->m_data_used == __sm_get_size_impl(map)); });
return map->m_data_used; return map->m_data_used;
} }
@ -1621,7 +1625,7 @@ sparsemap_split(sparsemap_t *map, sparsemap_idx_t offset, sparsemap_t *other)
uint8_t buf[sizeof(sm_idx_t) + sizeof(sm_bitvec_t) * 2] = { 0 }; uint8_t buf[sizeof(sm_idx_t) + sizeof(sm_bitvec_t) * 2] = { 0 };
memcpy(dst, &buf[0], sizeof(buf)); memcpy(dst, &buf[0], sizeof(buf));
*(sm_idx_t *)dst = __sm_get_vector_aligned_offset(offset); // TODO: was simply "offset" *(sm_idx_t *)dst = __sm_get_vector_aligned_offset(offset);
dst += sizeof(sm_idx_t); dst += sizeof(sm_idx_t);
/* the |other| sparsemap_t now has one additional chunk */ /* the |other| sparsemap_t now has one additional chunk */