#define vecswap(a, b, n) if ((n) > 0) swapfunc((a), (b), (size_t)(n))
static SortTuple *
-med3(SortTuple *a, SortTuple *b, SortTuple *c, qsort_arg_comparator cmp, void *arg)
+med3(SortTuple *a, SortTuple *b, SortTuple *c, SortTupleComparator cmp,
+ Tuplesortstate *state)
{
- return cmp(a, b, arg) < 0 ?
- (cmp(b, c, arg) < 0 ? b : (cmp(a, c, arg) < 0 ? c : a))
- : (cmp(b, c, arg) > 0 ? b : (cmp(a, c, arg) < 0 ? a : c));
+ return cmp(a, b, state) < 0 ?
+ (cmp(b, c, state) < 0 ? b : (cmp(a, c, state) < 0 ? c : a))
+ : (cmp(b, c, state) > 0 ? b : (cmp(a, c, state) < 0 ? a : c));
}
static void
-qsort_tuple(SortTuple *a, size_t n, qsort_arg_comparator cmp, void *arg)
+qsort_tuple(SortTuple *a, size_t n, SortTupleComparator cmp,
+ Tuplesortstate *state)
{
SortTuple *pa,
*pb,
if (n < 7)
{
for (pm = a + 1; pm < a + n; pm++)
- for (pl = pm; pl > a && cmp(pl - 1, pl, arg) > 0; pl--)
+ for (pl = pm; pl > a && cmp(pl - 1, pl, state) > 0; pl--)
swap(pl, pl - 1);
return;
}
presorted = 1;
for (pm = a + 1; pm < a + n; pm++)
{
- if (cmp(pm - 1, pm, arg) > 0)
+ if (cmp(pm - 1, pm, state) > 0)
{
presorted = 0;
break;
if (n > 40)
{
d = (n / 8);
- pl = med3(pl, pl + d, pl + 2 * d, cmp, arg);
- pm = med3(pm - d, pm, pm + d, cmp, arg);
- pn = med3(pn - 2 * d, pn - d, pn, cmp, arg);
+ pl = med3(pl, pl + d, pl + 2 * d, cmp, state);
+ pm = med3(pm - d, pm, pm + d, cmp, state);
+ pn = med3(pn - 2 * d, pn - d, pn, cmp, state);
}
- pm = med3(pl, pm, pn, cmp, arg);
+ pm = med3(pl, pm, pn, cmp, state);
}
swap(a, pm);
pa = pb = a + 1;
pc = pd = a + (n - 1);
for (;;)
{
- while (pb <= pc && (r = cmp(pb, a, arg)) <= 0)
+ while (pb <= pc && (r = cmp(pb, a, state)) <= 0)
{
if (r == 0)
{
}
pb++;
}
- while (pb <= pc && (r = cmp(pc, a, arg)) >= 0)
+ while (pb <= pc && (r = cmp(pc, a, state)) >= 0)
{
if (r == 0)
{
r = Min(pd - pc, pn - pd - 1);
vecswap(pb, pn - r, r);
if ((r = pb - pa) > 1)
- qsort_tuple(a, r, cmp, arg);
+ qsort_tuple(a, r, cmp, state);
if ((r = pd - pc) > 1)
{
/* Iterate rather than recurse to save stack space */
n = r;
goto loop;
}
-/* qsort_tuple(pn - r, r, cmp, arg);*/
+/* qsort_tuple(pn - r, r, cmp, state);*/
}
#define TAPE_BUFFER_OVERHEAD (BLCKSZ * 3)
#define MERGE_BUFFER_SIZE (BLCKSZ * 32)
+typedef int (*SortTupleComparator) (const SortTuple *a, const SortTuple *b,
+ Tuplesortstate *state);
+
/*
* Private state of a Tuplesort operation.
*/
* <0, 0, >0 according as a<b, a=b, a>b. The API must match
* qsort_arg_comparator.
*/
- int (*comparetup) (const SortTuple *a, const SortTuple *b,
- Tuplesortstate *state);
+ SortTupleComparator comparetup;
/*
* Function to copy a supplied input tuple into palloc'd space and set up
* amount of memory. Just qsort 'em and we're done.
*/
if (state->memtupcount > 1)
- qsort_tuple((void *) state->memtuples,
+ qsort_tuple(state->memtuples,
state->memtupcount,
- (qsort_arg_comparator) state->comparetup,
- (void *) state);
+ state->comparetup,
+ state);
state->current = 0;
state->eof_reached = false;
state->markpos_offset = 0;