From fa03cabc5393ca5482e69f674fa714dc1b71ae5d Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 23 Oct 2022 22:07:11 -0400 Subject: [PATCH] =?UTF-8?q?Index-of=20with=20small=20=F0=9D=95=A8=20using?= =?UTF-8?q?=20(=E2=8A=A3=C3=971+=E2=8A=A2)=C2=B4=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/search.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/builtins/search.c b/src/builtins/search.c index 2ed79dd2..5cdd7107 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -8,6 +8,7 @@ extern B eq_c2(B,B,B); extern B ne_c2(B,B,B); extern B or_c2(B,B,B); +extern B add_c2(B,B,B); extern B sub_c2(B,B,B); extern B mul_c2(B,B,B); @@ -70,6 +71,7 @@ B indexOf_c2(B t, B w, B x) { } else { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); + if (wia == 0) { decG(w); decG(x); return taga(arr_shVec(allZeroes(xia))); } if (we==el_bit) { u64* wp = bitarr_ptr(w); u64 w0 = 1 & wp[0]; @@ -78,7 +80,15 @@ B indexOf_c2(B t, B w, B x) { B r = C2i(mul, wia , C2i(ne, w0, x)) ; return i==wia? r : C2(sub, r, C2i(mul, wia-i, C2i(eq, !w0, x))); } - // TODO O(wia×xia) for small wia or xia + if (wia<=(we<=el_i16?4:16) && xia>16 && we20 && we<=el_i16 && xe<=el_i16) { B r; TABLE(w, x, i32, wia, i) @@ -132,7 +142,7 @@ B memberOf_c2(B t, B w, B x) { many: { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); - if (xia == 0) { Arr* ba=allZeroes(wia); arr_shVec(ba); r=taga(ba); decG(w); goto dec_x; } + if (xia == 0) { r=taga(arr_shVec(allZeroes(wia))); decG(w); goto dec_x; } #define WEQ(V) C2(eq, inc(w), V) if (xe==el_bit) { u64* xp = bitarr_ptr(x); @@ -141,7 +151,7 @@ B memberOf_c2(B t, B w, B x) { if (bit_has(xp, xia, !x0)) r = C2(or, r, WEQ(m_usz(!x0))); decG(w); goto dec_x; } - if (xia<=16 && wia>16 && we16 && we