| 2268 | } |
| 2269 | |
| 2270 | NPY_NO_EXPORT int |
| 2271 | npy_timsort(void *start, npy_intp num, void *varr) |
| 2272 | { |
| 2273 | PyArrayObject *arr = reinterpret_cast<PyArrayObject *>(varr); |
| 2274 | size_t len = PyArray_ITEMSIZE(arr); |
| 2275 | PyArray_CompareFunc *cmp = PyArray_DESCR(arr)->f->compare; |
| 2276 | int ret; |
| 2277 | npy_intp l, n, stack_ptr, minrun; |
| 2278 | run stack[TIMSORT_STACK_SIZE]; |
| 2279 | buffer_char buffer; |
| 2280 | |
| 2281 | /* Items that have zero size don't make sense to sort */ |
| 2282 | if (len == 0) { |
| 2283 | return 0; |
| 2284 | } |
| 2285 | |
| 2286 | buffer.pw = NULL; |
| 2287 | buffer.size = 0; |
| 2288 | buffer.len = len; |
| 2289 | stack_ptr = 0; |
| 2290 | minrun = compute_min_run_short(num); |
| 2291 | |
| 2292 | /* used for insertion sort and gallop key */ |
| 2293 | ret = resize_buffer_char(&buffer, len); |
| 2294 | |
| 2295 | if (NPY_UNLIKELY(ret < 0)) { |
| 2296 | goto cleanup; |
| 2297 | } |
| 2298 | |
| 2299 | for (l = 0; l < num;) { |
| 2300 | n = npy_count_run((char *)start, l, num, minrun, buffer.pw, len, cmp, |
| 2301 | arr); |
| 2302 | |
| 2303 | /* both s and l are scaled by len */ |
| 2304 | stack[stack_ptr].s = l; |
| 2305 | stack[stack_ptr].l = n; |
| 2306 | ++stack_ptr; |
| 2307 | ret = npy_try_collapse((char *)start, stack, &stack_ptr, &buffer, len, |
| 2308 | cmp, arr); |
| 2309 | |
| 2310 | if (NPY_UNLIKELY(ret < 0)) { |
| 2311 | goto cleanup; |
| 2312 | } |
| 2313 | |
| 2314 | l += n; |
| 2315 | } |
| 2316 | |
| 2317 | ret = npy_force_collapse((char *)start, stack, &stack_ptr, &buffer, len, |
| 2318 | cmp, arr); |
| 2319 | |
| 2320 | if (NPY_UNLIKELY(ret < 0)) { |
| 2321 | goto cleanup; |
| 2322 | } |
| 2323 | |
| 2324 | ret = 0; |
| 2325 | |
| 2326 | cleanup: |
| 2327 | if (buffer.pw != NULL) { |
nothing calls this directly
no test coverage detected