diff --git a/src/builtins/search.c b/src/builtins/search.c index 3385873f..6e454e08 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -43,81 +43,80 @@ static u64 elRange(u8 eltype) { return 1ull<<(1<16 && we20 && we<=el_i16 && xe<=el_i16) { - B r; - TABLE(w, x, i32, wia, i) - return r; - } - i32* rp; B r = m_i32arrc(&rp, x); - H_b2i* map = m_b2i(64); - SGetU(x) - SGetU(w) - for (usz i = 0; i < wia; i++) { - bool had; u64 p = mk_b2i(&map, GetU(w,i), &had); - if (!had) map->a[p].val = i; - } - for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, GetU(x,i), wia); - free_b2i(map); decG(w); decG(x); - return wia<=I8_MAX? taga(cpyI8Arr(r)) : wia<=I16_MAX? taga(cpyI16Arr(r)) : r; + chk8: for (usz i = 0; i < wia; i++) if ((( u8*)wp)[i]== v8 ) { res=i; break; } goto checked; + chk16: for (usz i = 0; i < wia; i++) if (((u16*)wp)[i]==v16 ) { res=i; break; } goto checked; + chk32: for (usz i = 0; i < wia; i++) if (((u32*)wp)[i]==v32 ) { res=i; break; } goto checked; + chk64f: for (usz i = 0; i < wia; i++) if (((f64*)wp)[i]==v64f) { res=i; break; } goto checked; } + else { + SGetU(w) + for (usz i = 0; i < wia; i++) if (equal(GetU(w,i), el)) { res = i; goto checked; } + } + + checked:; notfound:; + decG(w); dec(x); + i32* rp; Arr* r = m_i32arrp(&rp, 1); + arr_shAlloc(r, 0); + rp[0] = res; + return taga(r); + } else { + u8 we = TI(w,elType); usz wia = IA(w); + u8 xe = TI(x,elType); usz xia = IA(x); + if (wia == 0) { B r=taga(arr_shCopy(allZeroes(xia), x)); decG(w); decG(x); return r; } + if (we==el_bit) { + u64* wp = bitarr_ptr(w); + u64 w0 = 1 & wp[0]; + u64 i = bit_find(wp, wia, !w0); decG(w); + if (i!=wia) incG(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))); + } + if (wia<=(we<=el_i16?4:16) && xia>16 && we20 && we<=el_i16 && xe<=el_i16) { + B r; + TABLE(w, x, i32, wia, i) + return r; + } + i32* rp; B r = m_i32arrc(&rp, x); + H_b2i* map = m_b2i(64); + SGetU(x) + SGetU(w) + for (usz i = 0; i < wia; i++) { + bool had; u64 p = mk_b2i(&map, GetU(w,i), &had); + if (!had) map->a[p].val = i; + } + for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, GetU(x,i), wia); + free_b2i(map); decG(w); decG(x); + return wia<=I8_MAX? taga(cpyI8Arr(r)) : wia<=I16_MAX? taga(cpyI16Arr(r)) : r; } - return c2(rt_indexOf, w, x); } B enclosed_0;