From 7ffa0dac4a275bb34fbed44fb5badcd0bdb216fd Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 24 Aug 2022 11:08:27 -0400 Subject: [PATCH] Switch from using IA to *SH for length --- src/builtins/selfsearch.c | 65 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index 2a166357..f2d79d0a 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -5,13 +5,13 @@ 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); - usz xia = IA(x); - if (xia==0) { decG(x); return emptyIVec(); } u8 xe = TI(x,elType); #define LOOKUP(T) \ - usz tn = 1<=16 && xe==el_i8) { LOOKUP(8); } - if (xia>=256 && xe==el_i16) { LOOKUP(16); } + if (n>=16 && xe==el_i8) { LOOKUP(8); } + if (n>=256 && xe==el_i16) { LOOKUP(16); } #undef LOOKUP // Radix-assisted lookup - if (xia>=256 && xe==el_i32) { + if (n>=256 && xe==el_i32) { usz rx = 256, tn = 1<<16; // Radix; table length - usz n = xia; u32* v0 = (u32*)i32any_ptr(x); i8* r0; B r = m_i8arrv(&r0, n); @@ -71,23 +70,23 @@ B memberOf_c1(B t, B x) { return num_squeeze(r); } - u64* rp; B r = m_bitarrv(&rp, xia); + u64* rp; B r = m_bitarrv(&rp, n); H_Sb* set = m_Sb(64); SGetU(x) - for (usz i = 0; i < xia; i++) bitp_set(rp, i, !ins_Sb(&set, GetU(x,i))); + for (usz i = 0; i < n; i++) bitp_set(rp, i, !ins_Sb(&set, GetU(x,i))); free_Sb(set); decG(x); return r; } B count_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); - usz xia = IA(x); - if (xia==0) { decG(x); return emptyIVec(); } u8 xe = TI(x,elType); #define LOOKUP(T) \ - usz tn = 1<=16 && xe==el_i8 && xia<=(usz)I32_MAX+1) { LOOKUP(8); } - if (xia>=256 && xe==el_i16 && xia<=(usz)I32_MAX+1) { LOOKUP(16); } + if (n>=16 && xe==el_i8 && n<=(usz)I32_MAX+1) { LOOKUP(8); } + if (n>=256 && xe==el_i16 && n<=(usz)I32_MAX+1) { LOOKUP(16); } #undef LOOKUP - i32* rp; B r = m_i32arrv(&rp, xia); + i32* rp; B r = m_i32arrv(&rp, n); H_b2i* map = m_b2i(64); SGetU(x) - for (usz i = 0; i < xia; i++) { + for (usz i = 0; i < n; i++) { bool had; u64 p = mk_b2i(&map, GetU(x,i), &had); rp[i] = had? ++map->a[p].val : (map->a[p].val = 0); } @@ -113,13 +112,13 @@ B count_c1(B t, B x) { 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 (RNK(x)>1) x = toCells(x); - usz xia = IA(x); - if (xia==0) { decG(x); return emptyIVec(); } u8 xe = TI(x,elType); #define LOOKUP(T) \ - usz tn = 1<=16 && xe==el_i8 && xia<=(usz)I32_MAX+1) { LOOKUP(8); } - if (xia>=256 && xe==el_i16 && xia<=(usz)I32_MAX+1) { LOOKUP(16); } + if (n>=16 && xe==el_i8 && n<=(usz)I32_MAX+1) { LOOKUP(8); } + if (n>=256 && xe==el_i16 && n<=(usz)I32_MAX+1) { LOOKUP(16); } #undef LOOKUP if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 min=I32_MAX, max=I32_MIN; - for (usz i = 0; i < xia; i++) { + for (usz i = 0; i < n; i++) { i32 c = xp[i]; if (cmax) max = c; } i64 dst = 1 + (max-(i64)min); - if ((dsta[p].val; else rp[i] = map->a[p].val = ctr++; @@ -191,15 +190,15 @@ B indexOf_c1(B t, 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; if (RNK(x)>1) return c1(rt_find, x); - usz xia = IA(x); - if (xia<=1) return x; B xf = getFillQ(x); B r = emptyHVec(); H_Sb* set = m_Sb(64); SGetU(x) - for (usz i = 0; i < xia; i++) { + for (usz i = 0; i < n; i++) { B c = GetU(x,i); if (!ins_Sb(&set, c)) r = vec_add(r, inc(c)); }