diff --git a/src/builtins/sort.c b/src/builtins/sort.c index 7c274800..d270c073 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -1,8 +1,6 @@ #include "../core.h" #include "../utils/talloc.h" - - #define CAT0(A,B) A##_##B #define CAT(A,B) CAT0(A,B) typedef struct BI32p { B k; i32 v; } BI32p; @@ -17,148 +15,7 @@ typedef struct I32I32p { i32 k; i32 v; } I32I32p; #define GRADE_CHR "⍒" #include "grade.h" -#define SORT_CMP(W, X) compare(W, X) -#define SORT_NAME bA -#define SORT_TYPE B -#include "sortTemplate.h" - -#define SORT_CMP(W, X) ((W) - (i64)(X)) -#define SORT_NAME iA -#define SORT_TYPE i32 -#include "sortTemplate.h" - -#define INSERTION_SORT(T, CMP) \ - rp[0] = xp[0]; \ - for (usz i=0; ie; j--) { i+=c0[j]; rp[i]--; } \ - for (usz i=1; i0; ) for (usz c=c0[j]; c--; ) *rp++ = j-C/2; \ - } - -B and_c1(B t, B x) { - if (isAtm(x) || RNK(x)==0) thrM("∧: Argument cannot have rank 0"); - if (RNK(x)!=1) return bqn_merge(and_c1(t, toCells(x))); - usz xia = IA(x); - if (xia <= 1) return x; - u8 xe = TI(x,elType); - if (xe<=el_i32) { - if (xe==el_i8) { - i8* xp = i8any_ptr(x); usz n=xia; - i8* rp; B r = m_i8arrv(&rp, n); - if (n<16) { - INSERTION_SORT(i8,<); - } else if (n<=256) { - // Radix/bucket sort - TALLOC(u8, c0, 256); u8 *c0o=c0+128; // Offset for signedness - for (usz j=0; j<256; j++) c0[j]=0; - for (usz i=0; i>=56; - } - for (usz i=0; i); - } else if (n<=256) { - // Radix/bucket sort - TALLOC(u8, c0, 256); u8 *c0o=c0+128; // Offset for signedness - for (usz j=0; j<256; j++) c0[j]=0; - for (usz i=0; i>8; s+=s>>16; s+=s>>32; - cw[j] = p|(s>>8); s<<=56; - } - for (usz i=0; i) + +#define TIM_B SORT_UD(bA,bD) +#define TIM_I SORT_UD(iA,iD) + +#define SORT_CMP(W, X) SORT_UD(compare(W, X), compare(X, W)) +#define SORT_NAME TIM_B +#define SORT_TYPE B +#include "sortTemplate.h" + +#define SORT_CMP(W, X) (SORT_UD((W) - (i64)(X), (X) - (i64)(W))) +#define SORT_NAME TIM_I +#define SORT_TYPE i32 +#include "sortTemplate.h" + +#define INSERTION_SORT(T) \ + rp[0] = xp[0]; \ + for (usz i=0; ie; j--) { i+=c0[j]; rp[i]--; } \ + ) \ + for (usz i=1; i0; )) \ + for (usz c=c0[j]; c--; ) *rp++ = j-C/2; \ + } \ + TFREE(c0) + +B SORT_C1(B t, B x) { + if (isAtm(x) || RNK(x)==0) thrM(SORT_UD("∧","∨")": Argument cannot have rank 0"); + if (RNK(x)!=1) return bqn_merge(SORT_C1(t, toCells(x))); + usz xia = IA(x); + if (xia <= 1) return x; + u8 xe = TI(x,elType); + B r; + if (xe==el_i8) { + i8* xp = i8any_ptr(x); usz n=xia; + i8* rp; r = m_i8arrv(&rp, n); + if (n<16) { + INSERTION_SORT(i8); + } else if (n<=256) { + // Radix/bucket sort + TALLOC(u8, c0, 256); u8 *c0o=c0+128; // Offset for signedness + for (usz j=0; j<256; j++) c0[j]=0; + for (usz i=0; i>=56; + } + , + for (usz j=256/8; j--; ) { + u64 p=s; s+=cw[j]; s+=s>>8; s+=s>>16; s+=s>>32; + cw[j] = p|(s>>8); s<<=56; + } + ) + for (usz i=0; i