36 #if !defined(SORT_IMPL_LINKTYPE) || !defined(SORT_IMPL_FUNC)
37 # error "This file can't be compiled directly, include in another source file"
40 #define list_node SORT_IMPL_LINKTYPE
41 #define list_sort_do SORT_IMPL_FUNC
43 #ifdef SORT_IMPL_LINKTYPE_DATA
44 # define SORT_ARG(n) ((n)->SORT_IMPL_LINKTYPE_DATA)
46 # define SORT_ARG(n) (n)
49 #ifdef SORT_IMPL_USE_THUNK
50 # define THUNK_APPEND1(a, thunk) a, thunk
51 # define THUNK_PREPEND2(thunk, a, b) thunk, a, b
53 # define THUNK_APPEND1(a, thunk) a
54 # define THUNK_PREPEND2(thunk, a, b) a, b
57 #define _CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) MACRO_ARG1##MACRO_ARG2
58 #define _CONCAT(MACRO_ARG1, MACRO_ARG2) _CONCAT_AUX(MACRO_ARG1, MACRO_ARG2)
59 #define _SORT_PREFIX(id) _CONCAT(SORT_IMPL_FUNC, _##id)
62 #define SortInfo _SORT_PREFIX(SortInfo)
63 #define CompareFn _SORT_PREFIX(CompareFn)
64 #define init_sort_info _SORT_PREFIX(init_sort_info)
65 #define merge_lists _SORT_PREFIX(merge_lists)
66 #define sweep_up _SORT_PREFIX(sweep_up)
67 #define insert_list _SORT_PREFIX(insert_list)
70 #ifdef SORT_IMPL_USE_THUNK
112 #define FLOOR_LOG2(x) \
113 (((x) >= 2) + ((x) >= 4) + ((x) >= 8) + ((x) >= 16) + ((x) >= 32) + ((x) >= 64) + ((x) >= 128))
114 #define MAX_RANKS ((sizeof(size_t) * 8) - FLOOR_LOG2(sizeof(list_node)) - 1)
120 #ifdef SORT_IMPL_USE_THUNK
144 #ifdef SORT_IMPL_USE_THUNK
161 while (first && second) {
164 second = second->next;
170 pos = &((*pos)->next);
172 *
pos = first ? first : second;
183 for (i = si->
min_rank; i < upto; i++) {
229 for (i = si->
n_ranks; i < rank; i++) {
280 while (list && list->next) {
305 #undef init_sort_info
314 #undef THUNK_PREPEND2
#define SORT_IMPL_USE_THUNK
#define THUNK_PREPEND2(thunk, a, b)
#define THUNK_APPEND1(a, thunk)
list_node * ranks[MAX_RANKS]