diff options
Diffstat (limited to 'linux/sort.c')
-rw-r--r-- | linux/sort.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/linux/sort.c b/linux/sort.c index ffa4817b..ecce71c5 100644 --- a/linux/sort.c +++ b/linux/sort.c @@ -277,92 +277,3 @@ void sort_r(void *base, size_t num, size_t size, } } EXPORT_SYMBOL(sort_r); - -#include <linux/eytzinger.h> - -static inline int eytzinger0_do_cmp(void *base, size_t n, size_t size, - cmp_r_func_t cmp_func, const void *priv, - size_t l, size_t r) -{ - return do_cmp(base + inorder_to_eytzinger0(l, n) * size, - base + inorder_to_eytzinger0(r, n) * size, - cmp_func, priv); -} - -static inline void eytzinger0_do_swap(void *base, size_t n, size_t size, - swap_r_func_t swap_func, const void *priv, - size_t l, size_t r) -{ - do_swap(base + inorder_to_eytzinger0(l, n) * size, - base + inorder_to_eytzinger0(r, n) * size, - size, swap_func, priv); -} - -void eytzinger0_sort_r(void *base, size_t n, size_t size, - cmp_r_func_t cmp_func, - swap_r_func_t swap_func, - const void *priv) -{ - int i, c, r; - - /* called from 'sort' without swap function, let's pick the default */ - if (swap_func == SWAP_WRAPPER && !((struct wrapper *)priv)->swap) - swap_func = NULL; - - if (!swap_func) { - if (is_aligned(base, size, 8)) - swap_func = SWAP_WORDS_64; - else if (is_aligned(base, size, 4)) - swap_func = SWAP_WORDS_32; - else - swap_func = SWAP_BYTES; - } - - /* heapify */ - for (i = n / 2 - 1; i >= 0; --i) { - for (r = i; r * 2 + 1 < n; r = c) { - c = r * 2 + 1; - - if (c + 1 < n && - eytzinger0_do_cmp(base, n, size, cmp_func, priv, c, c + 1) < 0) - c++; - - if (eytzinger0_do_cmp(base, n, size, cmp_func, priv, r, c) >= 0) - break; - - eytzinger0_do_swap(base, n, size, swap_func, priv, r, c); - } - } - - /* sort */ - for (i = n - 1; i > 0; --i) { - eytzinger0_do_swap(base, n, size, swap_func, priv, 0, i); - - for (r = 0; r * 2 + 1 < i; r = c) { - c = r * 2 + 1; - - if (c + 1 < i && - eytzinger0_do_cmp(base, n, size, cmp_func, priv, c, c + 1) < 0) - c++; - - if (eytzinger0_do_cmp(base, n, size, cmp_func, priv, r, c) >= 0) - break; - - eytzinger0_do_swap(base, n, size, swap_func, priv, r, c); - } - } -} -EXPORT_SYMBOL_GPL(eytzinger0_sort_r); - -void eytzinger0_sort(void *base, size_t n, size_t size, - cmp_func_t cmp_func, - swap_func_t swap_func) -{ - struct wrapper w = { - .cmp = cmp_func, - .swap = swap_func, - }; - - return eytzinger0_sort_r(base, n, size, _CMP_WRAPPER, SWAP_WRAPPER, &w); -} -EXPORT_SYMBOL_GPL(eytzinger0_sort); |