#include "c.h"
Go to the source code of this file.
Defines | |
| #define | swapcode(TYPE, parmi, parmj, n) |
| #define | SWAPINIT(a, es) |
| #define | swap(a, b) |
| #define | vecswap(a, b, n) if ((n) > 0) swapfunc((a), (b), (size_t)(n), swaptype) |
Functions | |
| static char * | med3 (char *a, char *b, char *c, qsort_arg_comparator cmp, void *arg) |
| static void | swapfunc (char *, char *, size_t, int) |
| void | qsort_arg (void *a, size_t n, size_t es, qsort_arg_comparator cmp, void *arg) |
| #define swap | ( | a, | ||
| b | ||||
| ) |
if (swaptype == 0) { \ long t = *(long *)(void *)(a); \ *(long *)(void *)(a) = *(long *)(void *)(b); \ *(long *)(void *)(b) = t; \ } else \ swapfunc(a, b, es, swaptype)
Definition at line 84 of file qsort_arg.c.
Referenced by qsort_arg().
| #define swapcode | ( | TYPE, | ||
| parmi, | ||||
| parmj, | ||||
| n | ||||
| ) |
do { \ size_t i = (n) / sizeof (TYPE); \ TYPE *pi = (TYPE *)(void *)(parmi); \ TYPE *pj = (TYPE *)(void *)(parmj); \ do { \ TYPE t = *pi; \ *pi++ = *pj; \ *pj++ = t; \ } while (--i > 0); \ } while (0)
Definition at line 60 of file qsort_arg.c.
Referenced by swapfunc().
| #define SWAPINIT | ( | a, | ||
| es | ||||
| ) |
swaptype = ((char *)(a) - (char *)0) % sizeof(long) || \ (es) % sizeof(long) ? 2 : (es) == sizeof(long)? 0 : 1;
Definition at line 72 of file qsort_arg.c.
Referenced by qsort_arg().
| #define vecswap | ( | a, | ||
| b, | ||||
| n | ||||
| ) | if ((n) > 0) swapfunc((a), (b), (size_t)(n), swaptype) |
Definition at line 92 of file qsort_arg.c.
Referenced by qsort_arg().
| static char * med3 | ( | char * | a, | |
| char * | b, | |||
| char * | c, | |||
| qsort_arg_comparator | cmp, | |||
| void * | arg | |||
| ) | [static] |
| void qsort_arg | ( | void * | a, | |
| size_t | n, | |||
| size_t | es, | |||
| qsort_arg_comparator | cmp, | |||
| void * | arg | |||
| ) |
Definition at line 103 of file qsort_arg.c.
References cmp(), med3(), Min, qsort_arg(), swap, SWAPINIT, and vecswap.
Referenced by _bt_sort_array_elements(), compute_range_stats(), compute_scalar_stats(), gbt_var_picksplit(), ginExtractEntries(), mcelem_array_selec(), qsort_arg(), range_gist_double_sorting_split(), range_gist_single_sorting_split(), SortAndUniqItems(), spg_range_quad_picksplit(), tsvectorrecv(), and uniqueentry().
{
char *pa,
*pb,
*pc,
*pd,
*pl,
*pm,
*pn;
int d,
r,
swaptype,
presorted;
loop:SWAPINIT(a, es);
if (n < 7)
{
for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
for (pl = pm; pl > (char *) a && cmp(pl - es, pl, arg) > 0;
pl -= es)
swap(pl, pl - es);
return;
}
presorted = 1;
for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
{
if (cmp(pm - es, pm, arg) > 0)
{
presorted = 0;
break;
}
}
if (presorted)
return;
pm = (char *) a + (n / 2) * es;
if (n > 7)
{
pl = (char *) a;
pn = (char *) a + (n - 1) * es;
if (n > 40)
{
d = (n / 8) * es;
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);
}
pm = med3(pl, pm, pn, cmp, arg);
}
swap(a, pm);
pa = pb = (char *) a + es;
pc = pd = (char *) a + (n - 1) * es;
for (;;)
{
while (pb <= pc && (r = cmp(pb, a, arg)) <= 0)
{
if (r == 0)
{
swap(pa, pb);
pa += es;
}
pb += es;
}
while (pb <= pc && (r = cmp(pc, a, arg)) >= 0)
{
if (r == 0)
{
swap(pc, pd);
pd -= es;
}
pc -= es;
}
if (pb > pc)
break;
swap(pb, pc);
pb += es;
pc -= es;
}
pn = (char *) a + n * es;
r = Min(pa - (char *) a, pb - pa);
vecswap(a, pb - r, r);
r = Min(pd - pc, pn - pd - es);
vecswap(pb, pn - r, r);
if ((r = pb - pa) > es)
qsort_arg(a, r / es, es, cmp, arg);
if ((r = pd - pc) > es)
{
/* Iterate rather than recurse to save stack space */
a = pn - r;
n = r / es;
goto loop;
}
/* qsort_arg(pn - r, r / es, es, cmp, arg);*/
}
| static void swapfunc | ( | char * | a, | |
| char * | b, | |||
| size_t | n, | |||
| int | swaptype | |||
| ) | [static] |
Definition at line 76 of file qsort_arg.c.
References swapcode.
1.7.1