ReactOS 0.4.15-dev-7918-g2a2556c
timsort.h File Reference
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Include dependency graph for timsort.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  TIM_SORT_RUN_T
 
struct  TEMP_STORAGE_T
 

Macros

#define SORT_CMP(x, y)   ((x) < (y) ? -1 : ((x) == (y) ? 0 : 1))
 
#define TIM_SORT_STACK_SIZE   128
 
#define SORT_SWAP(x, y)   {SORT_TYPE __SORT_SWAP_t = (x); (x) = (y); (y) = __SORT_SWAP_t;}
 
#define SORT_COMMON_H
 
#define MAX(x, y)   (((x) > (y) ? (x) : (y)))
 
#define MIN(x, y)   (((x) < (y) ? (x) : (y)))
 
#define CLZ   clzll
 
#define SORT_CONCAT(x, y)   x ## _ ## y
 
#define SORT_MAKE_STR1(x, y)   SORT_CONCAT(x,y)
 
#define SORT_MAKE_STR(x)   SORT_MAKE_STR1(SORT_NAME,x)
 
#define BINARY_INSERTION_FIND   SORT_MAKE_STR(binary_insertion_find)
 
#define BINARY_INSERTION_SORT_START   SORT_MAKE_STR(binary_insertion_sort_start)
 
#define BINARY_INSERTION_SORT   SORT_MAKE_STR(binary_insertion_sort)
 
#define REVERSE_ELEMENTS   SORT_MAKE_STR(reverse_elements)
 
#define COUNT_RUN   SORT_MAKE_STR(count_run)
 
#define CHECK_INVARIANT   SORT_MAKE_STR(check_invariant)
 
#define TIM_SORT   SORT_MAKE_STR(tim_sort)
 
#define TIM_SORT_RESIZE   SORT_MAKE_STR(tim_sort_resize)
 
#define TIM_SORT_MERGE   SORT_MAKE_STR(tim_sort_merge)
 
#define TIM_SORT_COLLAPSE   SORT_MAKE_STR(tim_sort_collapse)
 

Functions

static int compute_minrun (const uint64_t)
 
static int clzll (uint64_t)
 
void BINARY_INSERTION_SORT (SORT_TYPE *dst, const size_t size)
 
void TIM_SORT (SORT_TYPE *dst, const size_t size)
 
static __inline size_t BINARY_INSERTION_FIND (SORT_TYPE *dst, const SORT_TYPE x, const size_t size)
 
static void BINARY_INSERTION_SORT_START (SORT_TYPE *dst, const size_t start, const size_t size)
 
static __inline void REVERSE_ELEMENTS (SORT_TYPE *dst, size_t start, size_t end)
 
static size_t COUNT_RUN (SORT_TYPE *dst, const size_t start, const size_t size)
 
static int CHECK_INVARIANT (TIM_SORT_RUN_T *stack, const int stack_curr)
 
static void TIM_SORT_RESIZE (TEMP_STORAGE_T *store, const size_t new_size)
 
static void TIM_SORT_MERGE (SORT_TYPE *dst, const TIM_SORT_RUN_T *stack, const int stack_curr, TEMP_STORAGE_T *store)
 
static int TIM_SORT_COLLAPSE (SORT_TYPE *dst, TIM_SORT_RUN_T *stack, int stack_curr, TEMP_STORAGE_T *store, const size_t size)
 
static __inline int PUSH_NEXT (SORT_TYPE *dst, const size_t size, TEMP_STORAGE_T *store, const size_t minrun, TIM_SORT_RUN_T *run_stack, size_t *stack_curr, size_t *curr)
 

Macro Definition Documentation

◆ BINARY_INSERTION_FIND

#define BINARY_INSERTION_FIND   SORT_MAKE_STR(binary_insertion_find)

Definition at line 148 of file timsort.h.

◆ BINARY_INSERTION_SORT

#define BINARY_INSERTION_SORT   SORT_MAKE_STR(binary_insertion_sort)

Definition at line 150 of file timsort.h.

◆ BINARY_INSERTION_SORT_START

#define BINARY_INSERTION_SORT_START   SORT_MAKE_STR(binary_insertion_sort_start)

Definition at line 149 of file timsort.h.

◆ CHECK_INVARIANT

#define CHECK_INVARIANT   SORT_MAKE_STR(check_invariant)

Definition at line 153 of file timsort.h.

◆ CLZ

#define CLZ   clzll

Definition at line 125 of file timsort.h.

◆ COUNT_RUN

#define COUNT_RUN   SORT_MAKE_STR(count_run)

Definition at line 152 of file timsort.h.

◆ MAX

#define MAX (   x,
  y 
)    (((x) > (y) ? (x) : (y)))

Definition at line 67 of file timsort.h.

◆ MIN

#define MIN (   x,
  y 
)    (((x) < (y) ? (x) : (y)))

Definition at line 71 of file timsort.h.

◆ REVERSE_ELEMENTS

#define REVERSE_ELEMENTS   SORT_MAKE_STR(reverse_elements)

Definition at line 151 of file timsort.h.

◆ SORT_CMP

#define SORT_CMP (   x,
  y 
)    ((x) < (y) ? -1 : ((x) == (y) ? 0 : 1))

Definition at line 52 of file timsort.h.

◆ SORT_COMMON_H

#define SORT_COMMON_H

Definition at line 64 of file timsort.h.

◆ SORT_CONCAT

#define SORT_CONCAT (   x,
  y 
)    x ## _ ## y

Definition at line 144 of file timsort.h.

◆ SORT_MAKE_STR

#define SORT_MAKE_STR (   x)    SORT_MAKE_STR1(SORT_NAME,x)

Definition at line 146 of file timsort.h.

◆ SORT_MAKE_STR1

#define SORT_MAKE_STR1 (   x,
  y 
)    SORT_CONCAT(x,y)

Definition at line 145 of file timsort.h.

◆ SORT_SWAP

#define SORT_SWAP (   x,
  y 
)    {SORT_TYPE __SORT_SWAP_t = (x); (x) = (y); (y) = __SORT_SWAP_t;}

Definition at line 59 of file timsort.h.

◆ TIM_SORT

#define TIM_SORT   SORT_MAKE_STR(tim_sort)

Definition at line 154 of file timsort.h.

◆ TIM_SORT_COLLAPSE

#define TIM_SORT_COLLAPSE   SORT_MAKE_STR(tim_sort_collapse)

Definition at line 157 of file timsort.h.

◆ TIM_SORT_MERGE

#define TIM_SORT_MERGE   SORT_MAKE_STR(tim_sort_merge)

Definition at line 156 of file timsort.h.

◆ TIM_SORT_RESIZE

#define TIM_SORT_RESIZE   SORT_MAKE_STR(tim_sort_resize)

Definition at line 155 of file timsort.h.

◆ TIM_SORT_STACK_SIZE

#define TIM_SORT_STACK_SIZE   128

Definition at line 56 of file timsort.h.

Function Documentation

◆ BINARY_INSERTION_FIND()

static __inline size_t BINARY_INSERTION_FIND ( SORT_TYPE dst,
const SORT_TYPE  x,
const size_t  size 
)
static

Definition at line 177 of file timsort.h.

178 {
179 size_t l, c, r;
181 l = 0;
182 r = size - 1;
183 c = r >> 1;
184
185 /* check for out of bounds at the beginning. */
186 if (SORT_CMP(x, dst[0]) < 0) {
187 return 0;
188 } else if (SORT_CMP(x, dst[r]) > 0) {
189 return r;
190 }
191
192 cx = dst[c];
193
194 while (1) {
195 const int val = SORT_CMP(x, cx);
196
197 if (val < 0) {
198 if (c - l <= 1) {
199 return c;
200 }
201
202 r = c;
203 } else { /* allow = for stability. The binary search favors the right. */
204 if (r - c <= 1) {
205 return c + 1;
206 }
207
208 l = c;
209 }
210
211 c = l + ((r - l) >> 1);
212 cx = dst[c];
213 }
214}
r l[0]
Definition: byte_order.h:168
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLfloat * val
Definition: glext.h:7180
#define c
Definition: ke_i.h:80
_Out_opt_ int * cx
Definition: commctrl.h:585
#define SORT_CMP(x, y)
Definition: timsort.h:52
#define SORT_TYPE
Definition: xpath.c:440

◆ BINARY_INSERTION_SORT()

void BINARY_INSERTION_SORT ( SORT_TYPE dst,
const size_t  size 
)

Definition at line 247 of file timsort.h.

247 {
248 /* don't bother sorting an array of size <= 1 */
249 if (size <= 1) {
250 return;
251 }
252
254}
#define BINARY_INSERTION_SORT_START
Definition: timsort.h:149

◆ BINARY_INSERTION_SORT_START()

static void BINARY_INSERTION_SORT_START ( SORT_TYPE dst,
const size_t  start,
const size_t  size 
)
static

Definition at line 217 of file timsort.h.

217 {
218 size_t i;
219
220 for (i = start; i < size; i++) {
221 size_t j;
222 SORT_TYPE x;
223 size_t location;
224
225 /* If this entry is already correct, just move along */
226 if (SORT_CMP(dst[i - 1], dst[i]) <= 0) {
227 continue;
228 }
229
230 /* Else we need to find the right place, shift everything over, and squeeze in */
231 x = dst[i];
233
234 for (j = i - 1; j >= location; j--) {
235 dst[j + 1] = dst[j];
236
237 if (j == 0) { /* check edge case because j is unsigned */
238 break;
239 }
240 }
241
242 dst[location] = x;
243 }
244}
GLuint start
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define location(file, line)
Definition: kmtest.h:18
#define BINARY_INSERTION_FIND
Definition: timsort.h:148

◆ CHECK_INVARIANT()

static int CHECK_INVARIANT ( TIM_SORT_RUN_T stack,
const int  stack_curr 
)
static

Definition at line 322 of file timsort.h.

322 {
323 size_t A, B, C;
324
325 if (stack_curr < 2) {
326 return 1;
327 }
328
329 if (stack_curr == 2) {
330 const size_t A1 = stack[stack_curr - 2].length;
331 const size_t B1 = stack[stack_curr - 1].length;
332
333 if (A1 <= B1) {
334 return 0;
335 }
336
337 return 1;
338 }
339
340 A = stack[stack_curr - 3].length;
341 B = stack[stack_curr - 2].length;
342 C = stack[stack_curr - 1].length;
343
344 if ((A <= B + C) || (B <= C)) {
345 return 0;
346 }
347
348 return 1;
349}
#define C(c)
Definition: builtin.c:4556
Definition: ehthrow.cxx:93
Definition: ehthrow.cxx:54
Definition: terminate.cpp:24
Definition: _stack.h:55
#define A(row, col)
#define B(row, col)
#define A1

◆ clzll()

static int clzll ( uint64_t  x)
static

Definition at line 84 of file timsort.h.

84 {
85 int n;
86
87 if (x == 0) {
88 return 64;
89 }
90
91 n = 0;
92
93 if (x <= 0x00000000FFFFFFFFL) {
94 n = n + 32;
95 x = x << 32;
96 }
97
98 if (x <= 0x0000FFFFFFFFFFFFL) {
99 n = n + 16;
100 x = x << 16;
101 }
102
103 if (x <= 0x00FFFFFFFFFFFFFFL) {
104 n = n + 8;
105 x = x << 8;
106 }
107
108 if (x <= 0x0FFFFFFFFFFFFFFFL) {
109 n = n + 4;
110 x = x << 4;
111 }
112
113 if (x <= 0x3FFFFFFFFFFFFFFFL) {
114 n = n + 2;
115 x = x << 2;
116 }
117
118 if (x <= 0x7FFFFFFFFFFFFFFFL) {
119 n = n + 1;
120 }
121
122 return n;
123}
GLdouble n
Definition: glext.h:7729

◆ compute_minrun()

static __inline int compute_minrun ( const uint64_t  size)
static

Definition at line 129 of file timsort.h.

129 {
130 const int top_bit = 64 - CLZ(size);
131 const int shift = MAX(top_bit, 6) - 6;
132 const int minrun = size >> shift;
133 const uint64_t mask = (1ULL << shift) - 1;
134
135 if (mask & size) {
136 return minrun + 1;
137 }
138
139 return minrun;
140}
UINT64 uint64_t
Definition: types.h:77
GLenum GLint GLuint mask
Definition: glext.h:6028
#define shift
Definition: input.c:1755
#define MAX(x, y)
Definition: timsort.h:67
#define CLZ
Definition: timsort.h:125

Referenced by TIM_SORT().

◆ COUNT_RUN()

static size_t COUNT_RUN ( SORT_TYPE dst,
const size_t  start,
const size_t  size 
)
static

Definition at line 270 of file timsort.h.

270 {
271 size_t curr;
272
273 if (size - start == 1) {
274 return 1;
275 }
276
277 if (start >= size - 2) {
278 if (SORT_CMP(dst[size - 2], dst[size - 1]) > 0) {
279 SORT_SWAP(dst[size - 2], dst[size - 1]);
280 }
281
282 return 2;
283 }
284
285 curr = start + 2;
286
287 if (SORT_CMP(dst[start], dst[start + 1]) <= 0) {
288 /* increasing run */
289 while (1) {
290 if (curr == size - 1) {
291 break;
292 }
293
294 if (SORT_CMP(dst[curr - 1], dst[curr]) > 0) {
295 break;
296 }
297
298 curr++;
299 }
300
301 return curr - start;
302 } else {
303 /* decreasing run */
304 while (1) {
305 if (curr == size - 1) {
306 break;
307 }
308
309 if (SORT_CMP(dst[curr - 1], dst[curr]) <= 0) {
310 break;
311 }
312
313 curr++;
314 }
315
316 /* reverse in-place */
317 REVERSE_ELEMENTS(dst, start, curr - 1);
318 return curr - start;
319 }
320}
#define REVERSE_ELEMENTS
Definition: timsort.h:151
#define SORT_SWAP(x, y)
Definition: timsort.h:59

◆ PUSH_NEXT()

static __inline int PUSH_NEXT ( SORT_TYPE dst,
const size_t  size,
TEMP_STORAGE_T store,
const size_t  minrun,
TIM_SORT_RUN_T run_stack,
size_t stack_curr,
size_t curr 
)
static

Definition at line 488 of file timsort.h.

494 {
495 size_t len = COUNT_RUN(dst, *curr, size);
496 size_t run = minrun;
497
498 if (run > size - *curr) {
499 run = size - *curr;
500 }
501
502 if (run > len) {
503 BINARY_INSERTION_SORT_START(&dst[*curr], len, run);
504 len = run;
505 }
506
507 run_stack[*stack_curr].start = *curr;
508 run_stack[*stack_curr].length = len;
509 (*stack_curr)++;
510 *curr += len;
511
512 if (*curr == size) {
513 /* finish up */
514 while (*stack_curr > 1) {
515 TIM_SORT_MERGE(dst, run_stack, *stack_curr, store);
516 run_stack[*stack_curr - 2].length += run_stack[*stack_curr - 1].length;
517 (*stack_curr)--;
518 }
519
520 if (store->storage != NULL) {
521 free(store->storage);
522 store->storage = NULL;
523 }
524
525 return 0;
526 }
527
528 return 1;
529}
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
GLenum GLsizei len
Definition: glext.h:6722
SORT_TYPE * storage
Definition: timsort.h:353
size_t start
Definition: timsort.h:167
size_t length
Definition: timsort.h:168
#define TIM_SORT_MERGE
Definition: timsort.h:156
#define COUNT_RUN
Definition: timsort.h:152

Referenced by TIM_SORT().

◆ REVERSE_ELEMENTS()

static __inline void REVERSE_ELEMENTS ( SORT_TYPE dst,
size_t  start,
size_t  end 
)
static

Definition at line 258 of file timsort.h.

258 {
259 while (1) {
260 if (start >= end) {
261 return;
262 }
263
265 start++;
266 end--;
267 }
268}
GLuint GLuint end
Definition: gl.h:1545

◆ TIM_SORT()

void TIM_SORT ( SORT_TYPE dst,
const size_t  size 
)

Definition at line 531 of file timsort.h.

531 {
532 size_t minrun;
533 TEMP_STORAGE_T _store, *store;
535 size_t stack_curr = 0;
536 size_t curr = 0;
537
538 /* don't bother sorting an array of size 1 */
539 if (size <= 1) {
540 return;
541 }
542
543 if (size < 64) {
545 return;
546 }
547
548 /* compute the minimum run length */
549 minrun = compute_minrun(size);
550 /* temporary storage for merges */
551 store = &_store;
552 store->alloc = 0;
553 store->storage = NULL;
554
555 if (!PUSH_NEXT(dst, size, store, minrun, run_stack, &stack_curr, &curr)) {
556 return;
557 }
558
559 if (!PUSH_NEXT(dst, size, store, minrun, run_stack, &stack_curr, &curr)) {
560 return;
561 }
562
563 if (!PUSH_NEXT(dst, size, store, minrun, run_stack, &stack_curr, &curr)) {
564 return;
565 }
566
567 while (1) {
568 if (!CHECK_INVARIANT(run_stack, stack_curr)) {
569 stack_curr = TIM_SORT_COLLAPSE(dst, run_stack, stack_curr, store, size);
570 continue;
571 }
572
573 if (!PUSH_NEXT(dst, size, store, minrun, run_stack, &stack_curr, &curr)) {
574 return;
575 }
576 }
577}
size_t alloc
Definition: timsort.h:352
#define TIM_SORT_COLLAPSE
Definition: timsort.h:157
#define CHECK_INVARIANT
Definition: timsort.h:153
#define TIM_SORT_STACK_SIZE
Definition: timsort.h:56
static int compute_minrun(const uint64_t)
Definition: timsort.h:129
#define BINARY_INSERTION_SORT
Definition: timsort.h:150
static __inline int PUSH_NEXT(SORT_TYPE *dst, const size_t size, TEMP_STORAGE_T *store, const size_t minrun, TIM_SORT_RUN_T *run_stack, size_t *stack_curr, size_t *curr)
Definition: timsort.h:488

◆ TIM_SORT_COLLAPSE()

static int TIM_SORT_COLLAPSE ( SORT_TYPE dst,
TIM_SORT_RUN_T stack,
int  stack_curr,
TEMP_STORAGE_T store,
const size_t  size 
)
static

Definition at line 424 of file timsort.h.

425 {
426 while (1) {
427 size_t A, B, C, D;
428 int ABC, BCD, CD;
429
430 /* if the stack only has one thing on it, we are done with the collapse */
431 if (stack_curr <= 1) {
432 break;
433 }
434
435 /* if this is the last merge, just do it */
436 if ((stack_curr == 2) && (stack[0].length + stack[1].length == size)) {
437 TIM_SORT_MERGE(dst, stack, stack_curr, store);
438 stack[0].length += stack[1].length;
439 stack_curr--;
440 break;
441 }
442 /* check if the invariant is off for a stack of 2 elements */
443 else if ((stack_curr == 2) && (stack[0].length <= stack[1].length)) {
444 TIM_SORT_MERGE(dst, stack, stack_curr, store);
445 stack[0].length += stack[1].length;
446 stack_curr--;
447 break;
448 } else if (stack_curr == 2) {
449 break;
450 }
451
452 B = stack[stack_curr - 3].length;
453 C = stack[stack_curr - 2].length;
454 D = stack[stack_curr - 1].length;
455
456 if (stack_curr >= 4) {
457 A = stack[stack_curr - 4].length;
458 ABC = (A <= B + C);
459 } else {
460 ABC = 0;
461 }
462
463 BCD = (B <= C + D) || ABC;
464 CD = (C <= D);
465
466 /* Both invariants are good */
467 if (!BCD && !CD) {
468 break;
469 }
470
471 /* left merge */
472 if (BCD && !CD) {
473 TIM_SORT_MERGE(dst, stack, stack_curr - 1, store);
474 stack[stack_curr - 3].length += stack[stack_curr - 2].length;
475 stack[stack_curr - 2] = stack[stack_curr - 1];
476 stack_curr--;
477 } else {
478 /* right merge */
479 TIM_SORT_MERGE(dst, stack, stack_curr, store);
480 stack[stack_curr - 2].length += stack[stack_curr - 1].length;
481 stack_curr--;
482 }
483 }
484
485 return stack_curr;
486}
#define D(d)
Definition: builtin.c:4557
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
static const WCHAR BCD[]
Definition: reginf.c:61
Definition: wingdi.h:1410
struct _ABC ABC

◆ TIM_SORT_MERGE()

static void TIM_SORT_MERGE ( SORT_TYPE dst,
const TIM_SORT_RUN_T stack,
const int  stack_curr,
TEMP_STORAGE_T store 
)
static

Definition at line 371 of file timsort.h.

372 {
373 const size_t A = stack[stack_curr - 2].length;
374 const size_t B = stack[stack_curr - 1].length;
375 const size_t curr = stack[stack_curr - 2].start;
376 SORT_TYPE *storage;
377 size_t i, j, k;
378 TIM_SORT_RESIZE(store, MIN(A, B));
379 storage = store->storage;
380
381 /* left merge */
382 if (A < B) {
383 memcpy(storage, &dst[curr], A * sizeof(SORT_TYPE));
384 i = 0;
385 j = curr + A;
386
387 for (k = curr; k < curr + A + B; k++) {
388 if ((i < A) && (j < curr + A + B)) {
389 if (SORT_CMP(storage[i], dst[j]) <= 0) {
390 dst[k] = storage[i++];
391 } else {
392 dst[k] = dst[j++];
393 }
394 } else if (i < A) {
395 dst[k] = storage[i++];
396 } else {
397 break;
398 }
399 }
400 } else {
401 /* right merge */
402 memcpy(storage, &dst[curr + A], B * sizeof(SORT_TYPE));
403 i = B;
404 j = curr + A;
405 k = curr + A + B;
406
407 while (k > curr) {
408 k--;
409 if ((i > 0) && (j > curr)) {
410 if (SORT_CMP(dst[j - 1], storage[i - 1]) > 0) {
411 dst[k] = dst[--j];
412 } else {
413 dst[k] = storage[--i];
414 }
415 } else if (i > 0) {
416 dst[k] = storage[--i];
417 } else {
418 break;
419 }
420 }
421 }
422}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
int k
Definition: mpi.c:3369
#define TIM_SORT_RESIZE
Definition: timsort.h:155
#define MIN(x, y)
Definition: timsort.h:71

◆ TIM_SORT_RESIZE()

static void TIM_SORT_RESIZE ( TEMP_STORAGE_T store,
const size_t  new_size 
)
static

Definition at line 356 of file timsort.h.

356 {
357 if (store->alloc < new_size) {
358 SORT_TYPE *tempstore = (SORT_TYPE *)realloc(store->storage, new_size * sizeof(SORT_TYPE));
359
360 if (tempstore == NULL) {
361 fprintf(stderr, "Error allocating temporary storage for tim sort: need %lu bytes",
362 (unsigned long)(sizeof(SORT_TYPE) * new_size));
363 exit(1);
364 }
365
366 store->storage = tempstore;
367 store->alloc = new_size;
368 }
369}
#define realloc
Definition: debug_ros.c:6
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define exit(n)
Definition: config.h:202