Refactor priority-heap insert fn
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 6s
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 6s
priority-heap insert now takes a pointer to a priority-heap instead of a double pointer.
This commit is contained in:
parent
2252b7d732
commit
6b862ab022
3 changed files with 34 additions and 35 deletions
|
@ -21,27 +21,27 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
void simple_archiver_priority_heap_internal_realloc(
|
void simple_archiver_priority_heap_internal_realloc(
|
||||||
SDArchiverPHeap **priority_heap) {
|
SDArchiverPHeap *priority_heap) {
|
||||||
SDArchiverPHeap *new_priority_heap = malloc(sizeof(SDArchiverPHeap));
|
SDArchiverPHeap new_priority_heap;
|
||||||
|
|
||||||
new_priority_heap->capacity = (*priority_heap)->capacity * 2;
|
new_priority_heap.capacity = priority_heap->capacity * 2;
|
||||||
new_priority_heap->size = 0;
|
new_priority_heap.size = 0;
|
||||||
new_priority_heap->less_fn = (*priority_heap)->less_fn;
|
new_priority_heap.less_fn = priority_heap->less_fn;
|
||||||
|
|
||||||
new_priority_heap->nodes =
|
new_priority_heap.nodes =
|
||||||
calloc(new_priority_heap->capacity, sizeof(SDArchiverPHNode));
|
calloc(new_priority_heap.capacity, sizeof(SDArchiverPHNode));
|
||||||
|
|
||||||
for (size_t idx = 1; idx < (*priority_heap)->size + 1; ++idx) {
|
for (size_t idx = 1; idx < priority_heap->size + 1; ++idx) {
|
||||||
if ((*priority_heap)->nodes[idx].is_valid != 0) {
|
if (priority_heap->nodes[idx].is_valid != 0) {
|
||||||
simple_archiver_priority_heap_insert(
|
simple_archiver_priority_heap_insert(
|
||||||
&new_priority_heap, (*priority_heap)->nodes[idx].priority,
|
&new_priority_heap, priority_heap->nodes[idx].priority,
|
||||||
(*priority_heap)->nodes[idx].data,
|
priority_heap->nodes[idx].data,
|
||||||
(*priority_heap)->nodes[idx].data_cleanup_fn);
|
priority_heap->nodes[idx].data_cleanup_fn);
|
||||||
(*priority_heap)->nodes[idx].is_valid = 0;
|
priority_heap->nodes[idx].is_valid = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
simple_archiver_priority_heap_free(priority_heap);
|
free(priority_heap->nodes);
|
||||||
|
|
||||||
*priority_heap = new_priority_heap;
|
*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,
|
long long priority, void *data,
|
||||||
void (*data_cleanup_fn)(void *)) {
|
void (*data_cleanup_fn)(void *)) {
|
||||||
if (!priority_heap || !*priority_heap) {
|
if (!priority_heap) {
|
||||||
return;
|
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);
|
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 &&
|
while (hole > 1 &&
|
||||||
(*priority_heap)
|
priority_heap->less_fn(priority,
|
||||||
->less_fn(priority,
|
priority_heap->nodes[hole / 2].priority) != 0) {
|
||||||
(*priority_heap)->nodes[hole / 2].priority) != 0) {
|
priority_heap->nodes[hole] = priority_heap->nodes[hole / 2];
|
||||||
(*priority_heap)->nodes[hole] = (*priority_heap)->nodes[hole / 2];
|
|
||||||
hole /= 2;
|
hole /= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*priority_heap)->nodes[hole].priority = priority;
|
priority_heap->nodes[hole].priority = priority;
|
||||||
(*priority_heap)->nodes[hole].data = data;
|
priority_heap->nodes[hole].data = data;
|
||||||
(*priority_heap)->nodes[hole].data_cleanup_fn = data_cleanup_fn;
|
priority_heap->nodes[hole].data_cleanup_fn = data_cleanup_fn;
|
||||||
(*priority_heap)->nodes[hole].is_valid = 1;
|
priority_heap->nodes[hole].is_valid = 1;
|
||||||
|
|
||||||
++(*priority_heap)->size;
|
++priority_heap->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *simple_archiver_priority_heap_top(SDArchiverPHeap *priority_heap) {
|
void *simple_archiver_priority_heap_top(SDArchiverPHeap *priority_heap) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ SDArchiverPHeap *simple_archiver_priority_heap_init_less_fn(
|
||||||
void simple_archiver_priority_heap_free(SDArchiverPHeap **priority_heap);
|
void simple_archiver_priority_heap_free(SDArchiverPHeap **priority_heap);
|
||||||
|
|
||||||
/// If data_cleanup_fn is NULL, then "free()" is used on data when freed.
|
/// 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,
|
long long priority, void *data,
|
||||||
void (*data_cleanup_fn)(void *));
|
void (*data_cleanup_fn)(void *));
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ int main(void) {
|
||||||
for (unsigned int idx = 0; idx < 3; ++idx) {
|
for (unsigned int idx = 0; idx < 3; ++idx) {
|
||||||
unsigned int *data = malloc(sizeof(unsigned int));
|
unsigned int *data = malloc(sizeof(unsigned int));
|
||||||
*data = idx;
|
*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) {
|
for (unsigned int idx = 0; idx < 3; ++idx) {
|
||||||
unsigned int *data = simple_archiver_priority_heap_top(priority_heap);
|
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) {
|
for (unsigned int idx = 0; idx < max; ++idx) {
|
||||||
unsigned int *data = malloc(sizeof(unsigned int));
|
unsigned int *data = malloc(sizeof(unsigned int));
|
||||||
*data = idx;
|
*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) {
|
for (unsigned int idx = 0; idx < max; ++idx) {
|
||||||
|
@ -266,7 +266,7 @@ int main(void) {
|
||||||
for (unsigned int idx = max; idx-- > 0;) {
|
for (unsigned int idx = max; idx-- > 0;) {
|
||||||
unsigned int *data = malloc(sizeof(unsigned int));
|
unsigned int *data = malloc(sizeof(unsigned int));
|
||||||
*data = idx;
|
*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) {
|
for (unsigned int idx = 0; idx < max; ++idx) {
|
||||||
|
@ -296,7 +296,7 @@ int main(void) {
|
||||||
|
|
||||||
// Insert the deterministically randomized array.
|
// Insert the deterministically randomized array.
|
||||||
for (unsigned int idx = 0; idx < max; ++idx) {
|
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);
|
array + idx, no_free_fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ int main(void) {
|
||||||
for (unsigned int idx = 0; idx < max; ++idx) {
|
for (unsigned int idx = 0; idx < max; ++idx) {
|
||||||
unsigned int *data = malloc(sizeof(unsigned int));
|
unsigned int *data = malloc(sizeof(unsigned int));
|
||||||
*data = idx;
|
*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);
|
simple_archiver_priority_heap_free(&priority_heap);
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ int main(void) {
|
||||||
for (unsigned int idx = 0; idx < max; ++idx) {
|
for (unsigned int idx = 0; idx < max; ++idx) {
|
||||||
unsigned int *data = malloc(sizeof(unsigned int));
|
unsigned int *data = malloc(sizeof(unsigned int));
|
||||||
*data = idx;
|
*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;) {
|
for (unsigned int idx = max; idx-- > 0;) {
|
||||||
|
@ -364,7 +364,7 @@ int main(void) {
|
||||||
|
|
||||||
// Insert the deterministically randomized array.
|
// Insert the deterministically randomized array.
|
||||||
for (unsigned int idx = 0; idx < max; ++idx) {
|
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);
|
array + idx, no_free_fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue