]> git.seodisparate.com - SimpleArchiver/commitdiff
Add priority_heap iter and unit test
authorStephen Seo <seo.disparate@gmail.com>
Wed, 4 Dec 2024 06:16:12 +0000 (15:16 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 4 Dec 2024 06:16:12 +0000 (15:16 +0900)
src/data_structures/priority_heap.c
src/data_structures/priority_heap.h
src/data_structures/test.c

index ff1a068f0c6d8679c114cf46a20abc5feeceb312..593b512be203dc4c84ea3b89cbdc1b5f7fe0b069 100644 (file)
@@ -189,3 +189,16 @@ void *simple_archiver_priority_heap_pop(SDArchiverPHeap *priority_heap) {
 
   return data;
 }
+
+void simple_archiver_priority_heap_iter(SDArchiverPHeap *priority_heap,
+                                        void(*iter_fn)(void*)) {
+  if (priority_heap->size == 0) {
+    return;
+  }
+  for (uint64_t idx = 0; idx < priority_heap->size; ++idx) {
+    if (priority_heap->nodes[idx].is_valid) {
+      iter_fn(priority_heap->nodes[idx].data);
+    }
+  }
+  return;
+}
index 3416421d9302a05374f1985c00a8dbb6306b3a25..a597f31b0ea738a85e40c6c3ab06d017ff3111e1 100644 (file)
@@ -67,4 +67,9 @@ void *simple_archiver_priority_heap_top(SDArchiverPHeap *priority_heap);
 /// ownership of the returned data pointer.
 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*));
+
 #endif
index 23c928b4c6992c19764c0f85abc86e0db83f5715..044c15bc9c1900713a92a24de9647bd9e0a10b1c 100644 (file)
@@ -89,6 +89,10 @@ 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));
+}
+
 int main(void) {
   // Test LinkedList.
   {
@@ -438,6 +442,18 @@ int main(void) {
     free(array);
 
     simple_archiver_priority_heap_free(&priority_heap);
+
+    priority_heap = simple_archiver_priority_heap_init();
+    for (uint32_t idx = 0; idx < 50; ++idx) {
+      uint32_t *data = malloc(sizeof(uint32_t));
+      *data = idx;
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
+    }
+    printf("Begin iteration of 50 elements:\n");
+
+    simple_archiver_priority_heap_iter(priority_heap,
+                                       test_iter_fn_priority_heap);
+    simple_archiver_priority_heap_free(&priority_heap);
   }
 
   printf("Checks checked: %" PRId32 "\n", checks_checked);