From 27b1e9ed8cf3c835b363426b1fdcbed175cd8363 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 27 Jun 2021 18:03:51 +0300 Subject: [PATCH] =?UTF-8?q?native=20vec=E2=8A=90scalar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fns.c | 56 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 5aa8b9fc..2653b34f 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -212,21 +212,49 @@ B indexOf_c1(B t, B x) { return c1(rt_indexOf, x); } B indexOf_c2(B t, B w, B x) { - if (!isArr(w) || rnk(w)!=1 || !isArr(x) || rnk(x)!=1) return c2(rt_indexOf, w, x); - usz wia = a(w)->ia; - usz xia = a(x)->ia; - // TODO O(wia×xia) for small wia - i32* rp; B r = m_i32arrv(&rp, xia); - H_b2i* map = m_b2i(64); - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; - for (usz i = 0; i < wia; i++) { - bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had); - if (!had) map->a[p].val = i; + if (!isArr(w) || rnk(w)==0) thrM("⊐: 𝕨 must have rank at least 1"); + if (rnk(w)==1) { + if (!isArr(x) || rnk(x)==0) { + usz wia = a(w)->ia; + B el = isArr(x)? TI(x).getU(x,0) : x; + i32 res = wia; + if (TI(w).elType==el_i32) { + if (q_i32(el)) { + i32* wp = i32any_ptr(w); + i32 v = o2iu(el); + for (usz i = 0; i < wia; i++) { + if (wp[i] == v) { res = i; break; } + } + } + } else { + BS2B wgetU = TI(w).getU; + for (usz i = 0; i < wia; i++) { + if (equal(wgetU(w,i), el)) { res = i; break; } + } + } + dec(w); dec(x); + i32* rp; B r = m_i32arrp(&rp, 1); + arr_shAllocR(r,0); + rp[0] = res; + return r; + } else if (rnk(x)==1) { + usz wia = a(w)->ia; + usz xia = a(x)->ia; + // TODO O(wia×xia) for small wia + i32* rp; B r = m_i32arrv(&rp, xia); + H_b2i* map = m_b2i(64); + BS2B xgetU = TI(x).getU; + BS2B wgetU = TI(w).getU; + for (usz i = 0; i < wia; i++) { + bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had); + if (!had) map->a[p].val = i; + } + for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, xgetU(x,i), wia); + free_b2i(map); dec(w); dec(x); + return r; + } } - for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, xgetU(x,i), wia); - free_b2i(map); dec(w); dec(x); - return r; + return c2(rt_indexOf, w, x); } extern B rt_memberOf;