New utility routine: sort with a context parameter.

I'm about to have a need to sort an array based on auxiliary data held
in a variable that's not globally accessible, so I need a sort routine
that accepts an extra parameter and passes it through to the compare
function.

Sorting algorithm is heapsort, because it's the N log N algorithm I
can implement most reliably.
This commit is contained in:
Simon Tatham
2019-04-05 19:23:21 +01:00
parent b0c73d5c58
commit 5c4d6b8f35
2 changed files with 174 additions and 0 deletions

View File

@ -590,6 +590,20 @@ bool findloop_run(struct findloopstate *state, int nvertices,
*/
bool findloop_is_loop_edge(struct findloopstate *state, int u, int v);
/*
* Helper function to sort an array. Differs from standard qsort in
* that it takes a context parameter that is passed to the compare
* function.
*
* I wrap it in a macro so that you only need to give the element
* count of the array. The element size is determined by sizeof.
*/
typedef int (*arraysort_cmpfn_t)(const void *av, const void *bv, void *ctx);
void arraysort_fn(void *array, size_t nmemb, size_t size,
arraysort_cmpfn_t cmp, void *ctx);
#define arraysort(array, nmemb, cmp, ctx) \
arraysort_fn(array, nmemb, sizeof(*(array)), cmp, ctx)
/*
* Data structure containing the function calls and data specific
* to a particular game. This is enclosed in a data structure so