From 236d8dedd63b2c49996cc495ad41def335f8b2d6 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 19 Oct 2022 20:17:47 -0400 Subject: [PATCH] Move search functions to search.c --- makefile | 2 +- src/builtins/fns.c | 113 -------------------------------------- src/builtins/search.c | 125 ++++++++++++++++++++++++++++++++++++++++++ src/load.c | 2 +- src/opt/single.c | 1 + 5 files changed, 128 insertions(+), 115 deletions(-) create mode 100644 src/builtins/search.c diff --git a/makefile b/makefile index bf26179b..34d354ab 100644 --- a/makefile +++ b/makefile @@ -212,7 +212,7 @@ ${bd}/%.o: src/jit/%.c @echo $< | cut -c 5- @$(CC_INC) $@.d -o $@ -c $< -builtins: ${addprefix ${bd}/, arithm.o arithd.o cmp.o sfns.o squeeze.o select.o slash.o group.o sort.o selfsearch.o md1.o md2.o fns.o sysfn.o internal.o inverse.o} +builtins: ${addprefix ${bd}/, arithm.o arithd.o cmp.o sfns.o squeeze.o select.o slash.o group.o sort.o search.o selfsearch.o md1.o md2.o fns.o sysfn.o internal.o inverse.o} ${bd}/%.o: src/builtins/%.c @echo $< | cut -c 5- @$(CC_INC) $@.d -o $@ -c $< diff --git a/src/builtins/fns.c b/src/builtins/fns.c index a6916e2e..ccdf0d28 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -198,120 +198,11 @@ B fne_c2(B t, B w, B x) { } -extern B rt_indexOf; -B indexOf_c2(B t, B w, B x) { - 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 = IA(w); - B el = isArr(x)? IGetU(x,0) : x; - i32 res = wia; - if (TI(w,elType)==el_i32) { - if (q_i32(el)) { - i32* wp = i32any_ptr(w); - i32 v = o2iG(el); - for (usz i = 0; i < wia; i++) { - if (wp[i] == v) { res = i; break; } - } - } - } else { - SGetU(w) - for (usz i = 0; i < wia; i++) { - if (equal(GetU(w,i), el)) { res = i; break; } - } - } - decG(w); dec(x); - i32* rp; Arr* r = m_i32arrp(&rp, 1); - arr_shAlloc(r, 0); - rp[0] = res; - return taga(r); - } else { - usz wia = IA(w); - usz xia = IA(x); - // TODO O(wia×xia) for small wia or xia - 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; -B enclosed_1; -extern B rt_memberOf; -extern B eq_c2(B,B,B); -extern B or_c2(B,B,B); -B memberOf_c2(B t, B w, B x) { - if (isAtm(x) || RNK(x)!=1) goto bad; - if (isAtm(w)) goto single; - ur wr = RNK(w); - if (wr==0) { - B w0 = IGet(w, 0); - dec(w); - w = w0; - goto single; - } - if (wr==1) goto many; - goto bad; - - bad: return c2(rt_memberOf, w, x); - - B r; - single: { - usz xia = IA(x); - SGetU(x) - for (usz i = 0; i < xia; i++) if (equal(GetU(x, i), w)) { r = inc(enclosed_1); goto dec_wx; } - r = inc(enclosed_0); - dec_wx:; dec(w); - goto dec_x; - } - - - many: { - u8 we = TI(w,elType); usz wia = IA(w); - u8 xe = TI(x,elType); usz xia = IA(x); - if (xia<=16 && wia>16 && wea[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; +B enclosed_1; +extern B rt_memberOf; +extern B eq_c2(B,B,B); +extern B or_c2(B,B,B); +B memberOf_c2(B t, B w, B x) { + if (isAtm(x) || RNK(x)!=1) goto bad; + if (isAtm(w)) goto single; + ur wr = RNK(w); + if (wr==0) { + B w0 = IGet(w, 0); + dec(w); + w = w0; + goto single; + } + if (wr==1) goto many; + goto bad; + + bad: return c2(rt_memberOf, w, x); + + B r; + single: { + usz xia = IA(x); + SGetU(x) + for (usz i = 0; i < xia; i++) if (equal(GetU(x, i), w)) { r = inc(enclosed_1); goto dec_wx; } + r = inc(enclosed_0); + dec_wx:; dec(w); + goto dec_x; + } + + + many: { + u8 we = TI(w,elType); usz wia = IA(w); + u8 xe = TI(x,elType); usz xia = IA(x); + if (xia<=16 && wia>16 && we