2 * sgen-qsort.c: Quicksort.
4 * Copyright (C) 2013 Xamarin Inc
6 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
13 #include "sgen/sgen-gc.h"
15 #define ELEM(i) (((unsigned char*)base) + ((i) * width))
16 #define SWAP(i,j) do { \
17 size_t __i = (i), __j = (j); \
19 memcpy (swap_tmp, ELEM (__i), width); \
20 memcpy (ELEM (__i), ELEM (__j), width); \
21 memcpy (ELEM (__j), swap_tmp, width); \
26 partition (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*), unsigned char *pivot_tmp, unsigned char *swap_tmp)
28 size_t pivot_idx = nel >> 1;
31 memcpy (pivot_tmp, ELEM (pivot_idx), width);
32 SWAP (pivot_idx, nel - 1);
34 for (i = 0; i < nel - 1; ++i) {
35 if (compar (ELEM (i), pivot_tmp) <= 0) {
45 qsort_rec (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*), unsigned char *pivot_tmp, unsigned char *swap_tmp)
52 pivot_idx = partition (base, nel, width, compar, pivot_tmp, swap_tmp);
53 qsort_rec (base, pivot_idx, width, compar, pivot_tmp, swap_tmp);
55 qsort_rec (ELEM (pivot_idx + 1), nel - pivot_idx - 1, width, compar, pivot_tmp, swap_tmp);
59 sgen_qsort (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*))
62 unsigned char pivot_tmp [width];
63 unsigned char swap_tmp [width];
65 unsigned char* pivot_tmp = (unsigned char*) alloca(width);
66 unsigned char* swap_tmp = (unsigned char*) alloca(width);
69 qsort_rec (base, nel, width, compar, pivot_tmp, swap_tmp);