cython
1# mode: run
2
3from libc.stdlib cimport abs as c_int_abs, qsort as libc_qsort
4
5
6def libc_int_abs(int x):
7"""
8>>> libc_int_abs(5)
95
10>>> libc_int_abs(-5)
115
12"""
13return c_int_abs(x)
14
15
16cdef int gt(const void* v1, const void* v2) noexcept nogil:
17return ((<int*>v1)[0] - (<int*>v2)[0])
18
19cdef int lt(const void* v1, const void* v2) noexcept nogil:
20return - gt(v1, v2)
21
22def qsort(values, direction='lt'):
23"""
24>>> data = [1, 9, 3, 2, 5]
25>>> qsort(data, 'gt')
26[1, 2, 3, 5, 9]
27>>> qsort(data, 'lt')
28[9, 5, 3, 2, 1]
29"""
30cdef int[5] carray = values[:5]
31libc_qsort(carray, 5, sizeof(int), lt if direction == 'lt' else gt)
32return carray
33