From: Stephen Seo Date: Thu, 2 Jan 2025 12:14:07 +0000 (+0900) Subject: Improve priorty_heap iter fn, improve ds unit test X-Git-Tag: 1.11^2~21 X-Git-Url: https://git.seodisparate.com/stephenseo/server_config?a=commitdiff_plain;h=210665df8b98161cd10f0fc3f2a8539aa2e973f2;p=SimpleArchiver Improve priorty_heap iter fn, improve ds unit test --- diff --git a/src/data_structures/priority_heap.c b/src/data_structures/priority_heap.c index 5fdfb5c..9a1dd92 100644 --- a/src/data_structures/priority_heap.c +++ b/src/data_structures/priority_heap.c @@ -191,13 +191,14 @@ void *simple_archiver_priority_heap_pop(SDArchiverPHeap *priority_heap) { } void simple_archiver_priority_heap_iter(SDArchiverPHeap *priority_heap, - void(*iter_fn)(void*)) { + void(*iter_fn)(void*, void*), + void *user_data) { if (priority_heap->size == 0) { return; } for (uint64_t idx = 0; idx < priority_heap->capacity; ++idx) { if (priority_heap->nodes[idx].is_valid) { - iter_fn(priority_heap->nodes[idx].data); + iter_fn(priority_heap->nodes[idx].data, user_data); } } return; diff --git a/src/data_structures/priority_heap.h b/src/data_structures/priority_heap.h index a597f31..e6aa36c 100644 --- a/src/data_structures/priority_heap.h +++ b/src/data_structures/priority_heap.h @@ -70,6 +70,7 @@ void *simple_archiver_priority_heap_pop(SDArchiverPHeap *priority_heap); /// Iterates through all items in the priority heap (breadth-width search not /// depth-first search). void simple_archiver_priority_heap_iter(SDArchiverPHeap *priority_heap, - void(*iter_fn)(void*)); + void(*iter_fn)(void*, void*), + void *user_data); #endif diff --git a/src/data_structures/test.c b/src/data_structures/test.c index 327049d..fe88bb1 100644 --- a/src/data_structures/test.c +++ b/src/data_structures/test.c @@ -89,8 +89,24 @@ int hash_map_iter_check_fn2(__attribute__((unused)) const void *key, return 2; } -void test_iter_fn_priority_heap(void *data) { - printf("Got data %" PRIu32 "\n", *((uint32_t*)data)); +void test_iter_fn_priority_heap(void *data, void *user_data) { + void **ptrs = user_data; + char *elems = ptrs[0]; + const uint32_t *size = ptrs[1]; + + uint32_t *uint_data = data; + if (uint_data) { + printf("Got data %" PRIu32 "\n", *uint_data); + if (*uint_data < *size) { + elems[*uint_data] = 1; + } else { + printf( + "WARNING: data in priorty heap is invalid: \"%" PRIu32 "\"!\n", + *uint_data); + } + } else { + printf("WARNING: data in priority heap is NULL!\n"); + } } int main(void) { @@ -446,15 +462,31 @@ int main(void) { simple_archiver_priority_heap_free(&priority_heap); priority_heap = simple_archiver_priority_heap_init(); - for (uint32_t idx = 0; idx < 15; ++idx) { - uint32_t *data = malloc(sizeof(uint32_t)); - *data = idx; - simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL); - } - printf("Begin iteration of 15 elements:\n"); - simple_archiver_priority_heap_iter(priority_heap, - test_iter_fn_priority_heap); + { + const uint32_t size = 15; + char elems[15]; + + for (uint32_t idx = 0; idx < size; ++idx) { + uint32_t *data = malloc(sizeof(uint32_t)); + *data = idx; + simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL); + elems[idx] = 0; + } + printf("Begin iteration of 15 elements:\n"); + + void **ptrs = malloc(sizeof(void*) * 2); + ptrs[0] = elems; + ptrs[1] = (void*)&size; + simple_archiver_priority_heap_iter(priority_heap, + test_iter_fn_priority_heap, + ptrs); + free(ptrs); + + for (uint32_t idx = 0; idx < size; ++idx) { + CHECK_TRUE(elems[idx]); + } + } simple_archiver_priority_heap_free(&priority_heap); }