#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 && n>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 && n>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; } 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; if (RNK(x)>1) return c1(rt_find, x); B xf = getFillQ(x); B r = emptyHVec(); H_Sb* set = m_Sb(64); SGetU(x) for (usz i = 0; i < n; i++) { B c = GetU(x,i); if (!ins_Sb(&set, c)) r = vec_add(r, inc(c)); } free_Sb(set); decG(x); return withFill(r, xf); }