88 #ifndef XT_QUICKSORT_BASE_H 89 #define XT_QUICKSORT_BASE_H 90 #define TOKEN_PASTE(a,b) a##_##b 91 #define NAME_COMPOSE(a,b) TOKEN_PASTE(a,b) 94 #error "must define type to sort on" 96 #ifndef SORT_TYPE_SUFFIX 97 #error "must define suffix for type to name functions" 99 #ifndef SORT_TYPE_CMP_LT 100 #error "must define suffix for type to name functions" 103 #define MED3 NAME_COMPOSE(med3,SORT_TYPE_SUFFIX) 104 #define VECSWAP NAME_COMPOSE(vecswap,SORT_TYPE_SUFFIX) 105 #define XT_QUICKSORT NAME_COMPOSE(xt_quicksort,SORT_TYPE_SUFFIX) 116 #define SWAP(a,b) do { \ 117 SORT_TYPE t = a; a = b; b = t; \ 124 for (
size_t i = 0; i < n; ++i) {
133 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 136 bool swap_cnt =
false;
138 for (
SORT_TYPE *pm = a + 1; pm < a + n; ++pm)
150 pl =
MED3(pl, pl + d, pl + 2 * d);
151 pm =
MED3(pm - d, pm, pm + d);
152 pn =
MED3(pn - 2 * d, pn - d, pn);
154 pm =
MED3(pl, pm, pn);
186 for (
SORT_TYPE *pm = a + 1; pm < a + n; ++pm)
193 ptrdiff_t pdiff =
MIN(pa - a, pb - pa);
194 VECSWAP(a, pb - pdiff, (
size_t)pdiff);
195 pdiff =
MIN(pd - pc, pn - pd - 1);
196 VECSWAP(pb, pn - pdiff, (
size_t)pdiff);
197 if ((pdiff = pb - pa) > (ptrdiff_t)1)
199 if ((pdiff = pd - pc) > (ptrdiff_t)1) {
#define SORT_TYPE_CMP_LE(a, b)
#define SORT_TYPE_CMP_LT(a, b)
#define SORT_TYPE_CMP_EQ(a, b)