]> git.seodisparate.com - SimpleArchiver/commitdiff
Refactor priority-heap insert fn
authorStephen Seo <seo.disparate@gmail.com>
Fri, 13 Sep 2024 02:33:15 +0000 (11:33 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Fri, 13 Sep 2024 02:33:15 +0000 (11:33 +0900)
priority-heap insert now takes a pointer to a priority-heap instead of a
double pointer.

src/data_structures/priority_heap.c
src/data_structures/priority_heap.h
src/data_structures/test.c

index af7e400bc5a6572bbc13bd7002fc4cd86b7ae3d8..437aea2406d09281ba0b845f5bbfcff52bacf091 100644 (file)
 #include <stdlib.h>
 
 void simple_archiver_priority_heap_internal_realloc(
-    SDArchiverPHeap **priority_heap) {
-  SDArchiverPHeap *new_priority_heap = malloc(sizeof(SDArchiverPHeap));
+    SDArchiverPHeap *priority_heap) {
+  SDArchiverPHeap new_priority_heap;
 
-  new_priority_heap->capacity = (*priority_heap)->capacity * 2;
-  new_priority_heap->size = 0;
-  new_priority_heap->less_fn = (*priority_heap)->less_fn;
+  new_priority_heap.capacity = priority_heap->capacity * 2;
+  new_priority_heap.size = 0;
+  new_priority_heap.less_fn = priority_heap->less_fn;
 
-  new_priority_heap->nodes =
-      calloc(new_priority_heap->capacity, sizeof(SDArchiverPHNode));
+  new_priority_heap.nodes =
+      calloc(new_priority_heap.capacity, sizeof(SDArchiverPHNode));
 
-  for (size_t idx = 1; idx < (*priority_heap)->size + 1; ++idx) {
-    if ((*priority_heap)->nodes[idx].is_valid != 0) {
+  for (size_t idx = 1; idx < priority_heap->size + 1; ++idx) {
+    if (priority_heap->nodes[idx].is_valid != 0) {
       simple_archiver_priority_heap_insert(
-          &new_priority_heap, (*priority_heap)->nodes[idx].priority,
-          (*priority_heap)->nodes[idx].data,
-          (*priority_heap)->nodes[idx].data_cleanup_fn);
-      (*priority_heap)->nodes[idx].is_valid = 0;
+          &new_priority_heap, priority_heap->nodes[idx].priority,
+          priority_heap->nodes[idx].data,
+          priority_heap->nodes[idx].data_cleanup_fn);
+      priority_heap->nodes[idx].is_valid = 0;
     }
   }
 
-  simple_archiver_priority_heap_free(priority_heap);
+  free(priority_heap->nodes);
 
   *priority_heap = new_priority_heap;
 }
@@ -98,33 +98,32 @@ void simple_archiver_priority_heap_free(SDArchiverPHeap **priority_heap) {
   }
 }
 
-void simple_archiver_priority_heap_insert(SDArchiverPHeap **priority_heap,
+void simple_archiver_priority_heap_insert(SDArchiverPHeap *priority_heap,
                                           long long priority, void *data,
                                           void (*data_cleanup_fn)(void *)) {
-  if (!priority_heap || !*priority_heap) {
+  if (!priority_heap) {
     return;
   }
 
-  if ((*priority_heap)->size + 1 >= (*priority_heap)->capacity) {
+  if (priority_heap->size + 1 >= priority_heap->capacity) {
     simple_archiver_priority_heap_internal_realloc(priority_heap);
   }
 
-  size_t hole = (*priority_heap)->size + 1;
+  size_t hole = priority_heap->size + 1;
 
   while (hole > 1 &&
-         (*priority_heap)
-                 ->less_fn(priority,
-                           (*priority_heap)->nodes[hole / 2].priority) != 0) {
-    (*priority_heap)->nodes[hole] = (*priority_heap)->nodes[hole / 2];
+         priority_heap->less_fn(priority,
+                                priority_heap->nodes[hole / 2].priority) != 0) {
+    priority_heap->nodes[hole] = priority_heap->nodes[hole / 2];
     hole /= 2;
   }
 
-  (*priority_heap)->nodes[hole].priority = priority;
-  (*priority_heap)->nodes[hole].data = data;
-  (*priority_heap)->nodes[hole].data_cleanup_fn = data_cleanup_fn;
-  (*priority_heap)->nodes[hole].is_valid = 1;
+  priority_heap->nodes[hole].priority = priority;
+  priority_heap->nodes[hole].data = data;
+  priority_heap->nodes[hole].data_cleanup_fn = data_cleanup_fn;
+  priority_heap->nodes[hole].is_valid = 1;
 
-  ++(*priority_heap)->size;
+  ++priority_heap->size;
 }
 
 void *simple_archiver_priority_heap_top(SDArchiverPHeap *priority_heap) {
index 8e9e3035e2256acc2da8bd56e02c91648504ed50..0ec1b02de06ffdd489b12d2c4c33337b2e8decfd 100644 (file)
@@ -46,7 +46,7 @@ SDArchiverPHeap *simple_archiver_priority_heap_init_less_fn(
 void simple_archiver_priority_heap_free(SDArchiverPHeap **priority_heap);
 
 /// If data_cleanup_fn is NULL, then "free()" is used on data when freed.
-void simple_archiver_priority_heap_insert(SDArchiverPHeap **priority_heap,
+void simple_archiver_priority_heap_insert(SDArchiverPHeap *priority_heap,
                                           long long priority, void *data,
                                           void (*data_cleanup_fn)(void *));
 
index 01445537991faaa0174bf868b635c07f38265675..d34e3f11da38d1915f9bff5854987d50fdd75b62 100644 (file)
@@ -229,7 +229,7 @@ int main(void) {
     for (unsigned int idx = 0; idx < 3; ++idx) {
       unsigned int *data = malloc(sizeof(unsigned int));
       *data = idx;
-      simple_archiver_priority_heap_insert(&priority_heap, idx, data, NULL);
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
     }
     for (unsigned int idx = 0; idx < 3; ++idx) {
       unsigned int *data = simple_archiver_priority_heap_top(priority_heap);
@@ -251,7 +251,7 @@ int main(void) {
     for (unsigned int idx = 0; idx < max; ++idx) {
       unsigned int *data = malloc(sizeof(unsigned int));
       *data = idx;
-      simple_archiver_priority_heap_insert(&priority_heap, idx, data, NULL);
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
     }
 
     for (unsigned int idx = 0; idx < max; ++idx) {
@@ -266,7 +266,7 @@ int main(void) {
     for (unsigned int idx = max; idx-- > 0;) {
       unsigned int *data = malloc(sizeof(unsigned int));
       *data = idx;
-      simple_archiver_priority_heap_insert(&priority_heap, idx, data, NULL);
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
     }
 
     for (unsigned int idx = 0; idx < max; ++idx) {
@@ -296,7 +296,7 @@ int main(void) {
 
     // Insert the deterministically randomized array.
     for (unsigned int idx = 0; idx < max; ++idx) {
-      simple_archiver_priority_heap_insert(&priority_heap, array[idx],
+      simple_archiver_priority_heap_insert(priority_heap, array[idx],
                                            array + idx, no_free_fn);
     }
 
@@ -321,7 +321,7 @@ int main(void) {
     for (unsigned int idx = 0; idx < max; ++idx) {
       unsigned int *data = malloc(sizeof(unsigned int));
       *data = idx;
-      simple_archiver_priority_heap_insert(&priority_heap, idx, data, NULL);
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
     }
     simple_archiver_priority_heap_free(&priority_heap);
 
@@ -331,7 +331,7 @@ int main(void) {
     for (unsigned int idx = 0; idx < max; ++idx) {
       unsigned int *data = malloc(sizeof(unsigned int));
       *data = idx;
-      simple_archiver_priority_heap_insert(&priority_heap, idx, data, NULL);
+      simple_archiver_priority_heap_insert(priority_heap, idx, data, NULL);
     }
 
     for (unsigned int idx = max; idx-- > 0;) {
@@ -364,7 +364,7 @@ int main(void) {
 
     // Insert the deterministically randomized array.
     for (unsigned int idx = 0; idx < max; ++idx) {
-      simple_archiver_priority_heap_insert(&priority_heap, array[idx],
+      simple_archiver_priority_heap_insert(priority_heap, array[idx],
                                            array + idx, no_free_fn);
     }