Sparse Indices prototype
This commit is contained in:
parent
26c3dbfeea
commit
fb1230bcc2
@ -35,16 +35,13 @@
|
|||||||
TALLOC(usz, c0, C); usz *c0o=c0+C/2; \
|
TALLOC(usz, c0, C); usz *c0o=c0+C/2; \
|
||||||
for (usz j=0; j<C; j++) c0[j]=0; \
|
for (usz j=0; j<C; j++) c0[j]=0; \
|
||||||
for (usz i=0; i<n; i++) c0o[xp[i]]++; \
|
for (usz i=0; i<n; i++) c0o[xp[i]]++; \
|
||||||
if (n <= C*8) { /* Sum-based */ \
|
if (n/16 <= C) { /* Sum-based */ \
|
||||||
for (usz i=1; i<n; i++) rp[i]=0; \
|
for (usz i=0; i<n; i++) rp[i]=0; \
|
||||||
GRADE_UD( \
|
usz j=GRADE_UD(0,C-1), i; \
|
||||||
rp[0]=-C/2; usz e=C-1; while (c0[e]==0) e--; \
|
while ((i=c0[j])==0) GRADE_UD(j++,j--); \
|
||||||
for (usz j=0 , i=0; j<e; j++) { i+=c0[j]; rp[i]++; } \
|
usz js = j - C/2; \
|
||||||
, \
|
while (i<n) { rp[i]++; i+=c0[GRADE_UD(++j,--j)]; } \
|
||||||
rp[0]=C/2-1; usz e=0; while (c0[e]==0) e++; \
|
for (usz i=0; i<n; i++) js=rp[i]+=js; \
|
||||||
for (usz j=C-1, i=0; j>e; j--) { i+=c0[j]; rp[i]--; } \
|
|
||||||
) \
|
|
||||||
for (usz i=1; i<n; i++) rp[i]+=rp[i-1]; \
|
|
||||||
} else { /* Branchy */ \
|
} else { /* Branchy */ \
|
||||||
FOR(j,C) for (usz c=c0[j]; c--; ) *rp++ = j-C/2; \
|
FOR(j,C) for (usz c=c0[j]; c--; ) *rp++ = j-C/2; \
|
||||||
} \
|
} \
|
||||||
|
|||||||
@ -374,13 +374,19 @@ B slash_c1(B t, B x) {
|
|||||||
i32* rp; r = m_i32arrv(&rp, s);
|
i32* rp; r = m_i32arrv(&rp, s);
|
||||||
if (xe==el_i8) {
|
if (xe==el_i8) {
|
||||||
i8* xp = i8any_ptr(x);
|
i8* xp = i8any_ptr(x);
|
||||||
|
if (s/16 <= xia) {
|
||||||
|
usz b = 1<<10;
|
||||||
|
for (usz k=0, j=0, js=0, ij=xp[0]; ; ) {
|
||||||
|
usz e = b<s-k? k+b : s;
|
||||||
|
for (usz i=k; i<e; i++) rp[i]=0;
|
||||||
|
while (ij<e) { rp[ij]++; ij+=xp[++j]; }
|
||||||
|
for (usz i=k; i<e; i++) js=rp[i]+=js;
|
||||||
|
if (e==s) break; k=e;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
while (xia>0 && !xp[xia-1]) xia--;
|
while (xia>0 && !xp[xia-1]) xia--;
|
||||||
for (u64 i = 0; i < xia; i++) {
|
for (u64 i = 0; i < xia; i++) {
|
||||||
i32 c = xp[i];
|
i32 c = xp[i];
|
||||||
if (LIKELY(c==0 || c==1)) {
|
|
||||||
*rp = i;
|
|
||||||
rp+= c;
|
|
||||||
} else {
|
|
||||||
for (i32 j = 0; j < c; j++) *rp++ = i;
|
for (i32 j = 0; j < c; j++) *rp++ = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user