43 #define SORTTPL_SHELLSORTMAX 25 44 #define SORTTPL_MINSIZENINTHER 729 46 #ifndef SORTTPL_NAMEEXT 47 #error You need to define SORTTPL_NAMEEXT. 49 #ifndef SORTTPL_KEYTYPE 50 #error You need to define SORTTPL_KEYTYPE. 53 #ifdef SORTTPL_EXPANDNAME 54 #undef SORTTPL_EXPANDNAME 61 #ifdef SORTTPL_FIELD1TYPE 62 #define SORTTPL_HASFIELD1(x) x 63 #define SORTTPL_HASFIELD1PAR(x) x, 65 #define SORTTPL_HASFIELD1(x) 66 #define SORTTPL_HASFIELD1PAR(x) 68 #ifdef SORTTPL_FIELD2TYPE 69 #define SORTTPL_HASFIELD2(x) x 70 #define SORTTPL_HASFIELD2PAR(x) x, 72 #define SORTTPL_HASFIELD2(x) 73 #define SORTTPL_HASFIELD2PAR(x) 75 #ifdef SORTTPL_FIELD3TYPE 76 #define SORTTPL_HASFIELD3(x) x 77 #define SORTTPL_HASFIELD3PAR(x) x, 79 #define SORTTPL_HASFIELD3(x) 80 #define SORTTPL_HASFIELD3PAR(x) 82 #ifdef SORTTPL_FIELD4TYPE 83 #define SORTTPL_HASFIELD4(x) x 84 #define SORTTPL_HASFIELD4PAR(x) x, 86 #define SORTTPL_HASFIELD4(x) 87 #define SORTTPL_HASFIELD4PAR(x) 89 #ifdef SORTTPL_FIELD5TYPE 90 #define SORTTPL_HASFIELD5(x) x 91 #define SORTTPL_HASFIELD5PAR(x) x, 93 #define SORTTPL_HASFIELD5(x) 94 #define SORTTPL_HASFIELD5PAR(x) 96 #ifdef SORTTPL_FIELD6TYPE 97 #define SORTTPL_HASFIELD6(x) x 98 #define SORTTPL_HASFIELD6PAR(x) x, 100 #define SORTTPL_HASFIELD6(x) 101 #define SORTTPL_HASFIELD6PAR(x) 108 #define SORTTPL_EXPANDNAME(method, methodname) \ 110 #define SORTTPL_NAME(method, methodname) \ 111 SORTTPL_EXPANDNAME(method, methodname) 139 #ifdef SORTTPL_BACKWARDS 140 #define SORTTPL_ISLEXBETTER(x1,x2,y1,y2) (SORTTPL_CMP(x1,x2,y1,y2) > 0) 141 #define SORTTPL_ISLEXWORSE(x1,x2,y1,y2) (SORTTPL_CMP(x1,x2,y1,y2) < 0) 143 #define SORTTPL_ISLEXBETTER(x1,x2,y1,y2) (SORTTPL_CMP(x1,x2,y1,y2) < 0) 144 #define SORTTPL_ISLEXWORSE(x1,x2,y1,y2) (SORTTPL_CMP(x1,x2,y1,y2) > 0) 148 #define SORTTPL_SWAP(T,x,y) \ 172 static const int incs[3] = {1, 5, 19};
175 assert( key1 != NULL );
176 assert( key2 != NULL );
177 assert( start <= end );
179 for (k = 2; k >= 0; --k)
182 int first = h + start;
185 for (i = first; i <= end; ++i)
291 pivotindex = (start + end) / 2;
295 int mid = (start + end) / 2;
301 int gap = (end - start + 1) / 9;
307 assert( start + 8 * gap <= end );
339 assert( start <= end );
352 pivotkey1 = key1[mid];
353 pivotkey2 = key2[mid];
390 assert( (hi == lo-1) || (type && hi == start) || (!type && lo == end) );
417 while ( hi > start && !
SORTTPL_ISLEXWORSE(pivotkey1, pivotkey2, key1[hi], key2[hi]) )
439 if ( hi - start <= end - lo )
481 if ( end - start >= 1 )
507 for ( i = 0; i < len-1; i++ )
564 #undef SORTTPL_NAMEEXT 565 #undef SORTTPL_KEYTYPE 566 #undef SORTTPL_FIELD1TYPE 567 #undef SORTTPL_FIELD2TYPE 568 #undef SORTTPL_FIELD3TYPE 569 #undef SORTTPL_FIELD4TYPE 570 #undef SORTTPL_FIELD5TYPE 571 #undef SORTTPL_FIELD6TYPE 572 #undef SORTTPL_HASFIELD1 573 #undef SORTTPL_HASFIELD2 574 #undef SORTTPL_HASFIELD3 575 #undef SORTTPL_HASFIELD4 576 #undef SORTTPL_HASFIELD5 577 #undef SORTTPL_HASFIELD6 578 #undef SORTTPL_HASFIELD1PAR 579 #undef SORTTPL_HASFIELD2PAR 580 #undef SORTTPL_HASFIELD3PAR 581 #undef SORTTPL_HASFIELD4PAR 582 #undef SORTTPL_HASFIELD5PAR 583 #undef SORTTPL_HASFIELD6PAR 584 #undef SORTTPL_ISLEXBETTER 585 #undef SORTTPL_ISLEXWORSE 588 #undef SORTTPL_SHELLSORTMAX 589 #undef SORTTPL_MINSIZENINTHER #define SORTTPL_HASFIELD3(x)
static int SORTTPL_CMP(SORTTPL_KEYTYPE x1, SORTTPL_KEYTYPE x2, SORTTPL_KEYTYPE y1, SORTTPL_KEYTYPE y2)
#define SORTTPL_HASFIELD4(x)
#define SORTTPL_HASFIELD3PAR(x)
#define SORTTPL_SHELLSORTMAX
#define SORTTPL_HASFIELD6PAR(x)
#define SORTTPL_HASFIELD5(x)
#define SORTTPL_HASFIELD2PAR(x)
#define SORTTPL_HASFIELD4PAR(x)
#define SORTTPL_HASFIELD5PAR(x)
#define SORTTPL_ISLEXBETTER(x1, x2, y1, y2)
#define SORTTPL_HASFIELD1PAR(x)
#define SORTTPL_NAME(method, methodname)
#define SORTTPL_HASFIELD6(x)
#define SORTTPL_HASFIELD2(x)
#define SORTTPL_ISLEXWORSE(x1, x2, y1, y2)
#define SORTTPL_HASFIELD1(x)
#define SORTTPL_SWAP(T, x, y)
#define SORTTPL_MINSIZENINTHER
#define SORTTPL_FIELD1TYPE