129#define ST_MAKE_PREFIX(a) CppConcat(a,_)
130#define ST_MAKE_NAME(a,b) ST_MAKE_NAME_(ST_MAKE_PREFIX(a),b)
131#define ST_MAKE_NAME_(a,b) CppConcat(a,b)
137#ifdef ST_ELEMENT_TYPE_VOID
138#define ST_ELEMENT_TYPE void
139#define ST_SORT_PROTO_ELEMENT_SIZE , size_t element_size
140#define ST_SORT_INVOKE_ELEMENT_SIZE , element_size
142#define ST_SORT_PROTO_ELEMENT_SIZE
143#define ST_SORT_INVOKE_ELEMENT_SIZE
150#ifdef ST_COMPARE_RUNTIME_POINTER
156#ifndef ST_COMPARATOR_TYPE_NAME
157#define ST_COMPARATOR_TYPE_NAME ST_MAKE_NAME(ST_SORT, compare_function)
159#define ST_COMPARE compare
160#ifndef ST_COMPARE_ARG_TYPE
161#define ST_SORT_PROTO_COMPARE , ST_COMPARATOR_TYPE_NAME compare
162#define ST_SORT_INVOKE_COMPARE , compare
164#define ST_SORT_PROTO_COMPARE , ST_COMPARATOR_TYPE_NAME compare
165#define ST_SORT_INVOKE_COMPARE , compare
168#define ST_SORT_PROTO_COMPARE
169#define ST_SORT_INVOKE_COMPARE
177#ifdef ST_COMPARE_ARG_TYPE
178#define ST_SORT_PROTO_ARG , ST_COMPARE_ARG_TYPE *arg
179#define ST_SORT_INVOKE_ARG , arg
181#define ST_SORT_PROTO_ARG
182#define ST_SORT_INVOKE_ARG
187#ifdef ST_COMPARE_RUNTIME_POINTER
203#define ST_MED3 ST_MAKE_NAME(ST_SORT, med3)
204#define ST_SWAP ST_MAKE_NAME(ST_SORT, swap)
205#define ST_SWAPN ST_MAKE_NAME(ST_SORT, swapn)
208#ifdef ST_CHECK_FOR_INTERRUPTS
209#define DO_CHECK_FOR_INTERRUPTS() CHECK_FOR_INTERRUPTS()
211#define DO_CHECK_FOR_INTERRUPTS()
218#ifdef ST_COMPARE_RUNTIME_POINTER
219#define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_) ST_SORT_INVOKE_ARG)
220#elif defined(ST_COMPARE_ARG_TYPE)
221#define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_), arg)
223#define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_))
225#define DO_MED3(a_, b_, c_) \
226 ST_MED3((a_), (b_), (c_) \
227 ST_SORT_INVOKE_COMPARE \
229#define DO_SORT(a_, n_) \
231 ST_SORT_INVOKE_ELEMENT_SIZE \
232 ST_SORT_INVOKE_COMPARE \
240#ifndef ST_ELEMENT_TYPE_VOID
241#define ST_POINTER_TYPE ST_ELEMENT_TYPE
242#define ST_POINTER_STEP 1
243#define DO_SWAPN(a_, b_, n_) ST_SWAPN((a_), (b_), (n_))
244#define DO_SWAP(a_, b_) ST_SWAP((a_), (b_))
246#define ST_POINTER_TYPE uint8
247#define ST_POINTER_STEP element_size
248#define DO_SWAPN(a_, b_, n_) ST_SWAPN((a_), (b_), (n_))
249#define DO_SWAP(a_, b_) DO_SWAPN((a_), (b_), element_size)
284 for (
size_t i = 0;
i < n; ++
i)
344 pm =
DO_MED3(pm - d, pm, pm + d);
417#undef DO_CHECK_FOR_INTERRUPTS
423#undef ST_CHECK_FOR_INTERRUPTS
424#undef ST_COMPARATOR_TYPE_NAME
426#undef ST_COMPARE_ARG_TYPE
427#undef ST_COMPARE_RUNTIME_POINTER
428#undef ST_ELEMENT_TYPE
429#undef ST_ELEMENT_TYPE_VOID
434#undef ST_POINTER_STEP
435#undef ST_POINTER_TYPE
438#undef ST_SORT_INVOKE_ARG
439#undef ST_SORT_INVOKE_COMPARE
440#undef ST_SORT_INVOKE_ELEMENT_SIZE
441#undef ST_SORT_PROTO_ARG
442#undef ST_SORT_PROTO_COMPARE
443#undef ST_SORT_PROTO_ELEMENT_SIZE
#define ST_COMPARATOR_TYPE_NAME
#define ST_SORT_PROTO_COMPARE
#define ST_SORT_PROTO_ELEMENT_SIZE
#define ST_SORT_PROTO_ARG