#include "../core.h" #include "../utils/hash.h" #include "../utils/mut.h" #include "../utils/talloc.h" B memberOf_c1(B t, B x) { if (isAtm(x) || RNK(x)==0) thrM("∊: Argument cannot have rank 0"); usz n = *SH(x); if (n==0) { decG(x); return emptyIVec(); } if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); #define BRUTE(T) \ i##T* xp = i##T##any_ptr(x); \ u64* rp; B r = m_bitarrv(&rp, n); bitp_set(rp, 0, 1); \ for (usz i=1; i8 && n3*n?tn:3*n)+(2*rx+1)*sizeof(usz))); // timeline // Allocations len count radix hash deradix bytes layout: usz *c0 = (usz*)(alloc)+1; // rx [+++................] c0 rx # usz *c1 = (usz*)(c0+rx); // rx [++................] c1 rx # u8 *k0 = (u8 *)(c1+rx); // n [+.............] k0 n ## u32 *v2 = (u32*)(k0+n); // n+1 [+.......] v2 4*n+4 ######## u8 *k1 = (u8 *)(v2+n+1); // n [+............] k1 n ## u32 *v1 = (u32*)(k1); // n [+-] v1 4*n ######## u8 *r2 = (u8 *)(v2); // n [+.....] r2 n ## u8 *r1 = (u8 *)(k1+n); // n [+..] r1 n ## u8 *tab= (u8 *)(r1); // tn [+] tab tn ##### // Count keys for (usz j=0; j<2*rx; j++) c0[j] = 0; for (usz i=0; i>24)]++; c1[(u8)(v>>16)]++; } // Exclusive prefix sum usz s0=0, s1=0; for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } // Table lookup u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=1; } for (; i(usz)I32_MAX+1) thrM("⊒: Argument length >2⋆31 not supported"); if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); #define BRUTE(T) \ i##T* xp = i##T##any_ptr(x); \ i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ for (usz i=1; i8 && nn?tn:n)+(2*rx+1)*sizeof(usz))); // timeline // Allocations len count radix hash deradix bytes layout: usz *c0 = (usz*)(alloc)+1; // rx [+++................] c0 rx # usz *c1 = (usz*)(c0+rx); // rx [++................] c1 rx # u8 *k0 = (u8 *)(c1+rx); // n [+.............] k0 n ## u8 *k1 = (u8 *)(k0+n); // n [+............] k1 n ## u32 *v2 = (u32*)(k1+n); // n+1 [+....-] v2 4*n ######## u32 *v1 = (u32*)(v2+n+1); // n [+..] v1 4*n ######## u32 *r2 = (u32*)v2; // n [+.....] r2 4*n ######## u32 *r1 = (u32*)v1; // n [+..] r1 4*n ######## u32 *tab= (u32*)v1; // tn [+] tab 4*tn ########### // Count keys for (usz j=0; j<2*rx; j++) c0[j] = 0; for (usz i=0; i>24)]++; c1[(u8)(v>>16)]++; } // Exclusive prefix sum usz s0=0, s1=0; for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } // Table lookup u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=0; } for (; ia[p].val : (map->a[p].val = 0); } decG(x); free_b2i(map); return r; } extern B rt_indexOf; B indexOf_c1(B t, B x) { if (isAtm(x) || RNK(x)==0) thrM("⊐: 𝕩 cannot have rank 0"); usz n = *SH(x); if (n==0) { decG(x); return emptyIVec(); } if (n>(usz)I32_MAX+1) thrM("⊐: Argument length >2⋆31 not supported"); if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); #define BRUTE(T) \ i##T* xp = i##T##any_ptr(x); \ i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ TALLOC(i##T, uniq, n); uniq[0]=xp[0]; \ for (usz i=1, u=1; i8 && nmax) max = c; } i64 dst = 1 + (max-(i64)min); if ((dsta[p].val; else rp[i] = map->a[p].val = ctr++; } free_b2i(map); decG(x); return r; } B slash_c2(B t, B w, B x); extern B rt_find; B find_c1(B t, B x) { if (isAtm(x) || RNK(x)==0) thrM("⍷: Argument cannot have rank 0"); usz n = *SH(x); if (n<=1) return x; return slash_c2(m_f64(0), memberOf_c1(m_f64(0), inc(x)), x); }