]> git.seodisparate.com - SimpleArchiver/commitdiff
Improve priorty_heap iter fn, improve ds unit test
authorStephen Seo <seo.disparate@gmail.com>
Thu, 2 Jan 2025 12:14:07 +0000 (21:14 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 2 Jan 2025 12:14:07 +0000 (21:14 +0900)
src/data_structures/priority_heap.c
src/data_structures/priority_heap.h
src/data_structures/test.c

index 5fdfb5c0a54100e5fd3fde6cc2725e32f2aec17e..9a1dd926324ae9c846ead8eae0a3eb993eb95557 100644 (file)
@@ -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;
index a597f31b0ea738a85e40c6c3ab06d017ff3111e1..e6aa36cbdaea02f164fc470390eb2de0fdda2bb2 100644 (file)
@@ -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
index 327049d92c85617c48caaf91b51fe055023019f8..fe88bb1213db39bced84260a2fa6cb7ca94d5d16 100644 (file)
@@ -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);
   }