From 4e88dc1004022cad76a8e34dd2794a53bf1cf6e4 Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 29 Dec 2022 20:25:42 +0200 Subject: [PATCH] =?UTF-8?q?faster=20=E2=8A=8F=CB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 68 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index adeee743..74cdc686 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -215,13 +215,67 @@ B cell2_empty(B f, B w, B x, ur wr, ur xr) { return merge_fill_result_1(rc); } +B select_cells(usz n, B x, ur xr) { + usz* xsh = SH(x); + B r; + usz cam = xsh[0]; + if (xr==2) { + usz csz = xsh[1]; + if (csz==1) return taga(arr_shVec(TI(x,slice)(x,0,IA(x)))); + u8 xe = TI(x,elType); + if (xe==el_B) { + SGet(x) + HArr_p rp = m_harrUv(cam); + for (usz i = 0; i < cam; i++) rp.a[i] = Get(x, i); + r = rp.b; + } else { + void* rp = m_tyarrv(&r, elWidth(xe), cam, el2t(xe)); + void* xp = tyany_ptr(x); + switch(xe) { + case el_bit: for (usz i=0; if; if (isAtm(x) || RNK(x)==0) { B r = c1(f, x); return isAtm(r)? m_atomUnit(r) : r; } - if (Q_BI(f,lt) && IA(x)!=0 && RNK(x)>1) return toCells(x); + if (IA(x)!=0 && isFun(f)) { + u8 rtid = v(f)->flags-1; + if (rtid==n_lt && RNK(x)>1) return toCells(x); + if (rtid==n_select && RNK(x)>1) return select_cells(0, x, RNK(x)); + } usz cam = SH(x)[0]; if (cam==0) { @@ -236,18 +290,24 @@ B cell_c1(Md1D* d, B x) { B f = d->f; M_HARR(r, cam); for (usz i=0,p=0; if; - bool wr = isAtm(w)? 0 : RNK(w); - bool xr = isAtm(x)? 0 : RNK(x); + ur wr = isAtm(w)? 0 : RNK(w); + ur xr = isAtm(x)? 0 : RNK(x); B r; if (wr==0 && xr==0) return isAtm(r = c2(f, w, x))? m_atomUnit(r) : r; if (wr==0) { usz cam = SH(x)[0]; if (cam==0) return cell2_empty(f, w, x, wr, xr); + if (isFun(f)) { + u8 rtid = v(f)->flags-1; + if (rtid==n_select && isF64(w)) { + return select_cells(WRAP(o2i64(w), SH(x)[1], thrF("āŠ: Indexing out-of-bounds (š•Øā‰”%R, %sā‰”ā‰ š•©)", w, cam)), x, xr); + } + } S_SLICES(x) M_HARR(r, cam); for (usz i=0,p=0; i