MCPcopy Create free account
hub / github.com/numpy/numpy / string_timsort_

Function string_timsort_

numpy/core/src/npysort/timsort.cpp:1381–1439  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1379
1380template <typename Tag>
1381NPY_NO_EXPORT int
1382string_timsort_(void *start, npy_intp num, void *varr)
1383{
1384 using type = typename Tag::type;
1385 PyArrayObject *arr = reinterpret_cast<PyArrayObject *>(varr);
1386 size_t elsize = PyArray_ITEMSIZE(arr);
1387 size_t len = elsize / sizeof(type);
1388 int ret;
1389 npy_intp l, n, stack_ptr, minrun;
1390 run stack[TIMSORT_STACK_SIZE];
1391 string_buffer_<Tag> buffer;
1392
1393 /* Items that have zero size don't make sense to sort */
1394 if (len == 0) {
1395 return 0;
1396 }
1397
1398 buffer.pw = NULL;
1399 buffer.size = 0;
1400 buffer.len = len;
1401 stack_ptr = 0;
1402 minrun = compute_min_run_short(num);
1403 /* used for insertion sort and gallop key */
1404 ret = resize_buffer_<Tag>(&buffer, 1);
1405
1406 if (NPY_UNLIKELY(ret < 0)) {
1407 goto cleanup;
1408 }
1409
1410 for (l = 0; l < num;) {
1411 n = count_run_<Tag>((type *)start, l, num, minrun, buffer.pw, len);
1412 /* both s and l are scaled by len */
1413 stack[stack_ptr].s = l;
1414 stack[stack_ptr].l = n;
1415 ++stack_ptr;
1416 ret = try_collapse_<Tag>((type *)start, stack, &stack_ptr, &buffer,
1417 len);
1418
1419 if (NPY_UNLIKELY(ret < 0)) {
1420 goto cleanup;
1421 }
1422
1423 l += n;
1424 }
1425
1426 ret = force_collapse_<Tag>((type *)start, stack, &stack_ptr, &buffer, len);
1427
1428 if (NPY_UNLIKELY(ret < 0)) {
1429 goto cleanup;
1430 }
1431
1432 ret = 0;
1433
1434cleanup:
1435 if (buffer.pw != NULL) {
1436 free(buffer.pw);
1437 }
1438 return ret;

Callers

nothing calls this directly

Calls 2

PyArray_ITEMSIZEFunction · 0.85
compute_min_run_shortFunction · 0.85

Tested by

no test coverage detected