From e02142a4c9c11779f2110a353827148403fd3b24 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 18 May 2021 22:02:40 +0300 Subject: [PATCH] =?UTF-8?q?native=20=E2=8C=BE(n=E2=8A=B8=E2=8A=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sfns.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/sfns.c b/src/sfns.c index 5586ffbd..f521ba03 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -739,14 +739,50 @@ B group_c2(B t, B w, B x) { B pick_uc1(B t, B o, B x) { if (isAtm(x) || a(x)->ia==0) return def_fn_uc1(t, o, x); usz ia = a(x)->ia; - B x0 = TI(x).get(x, 0); - B item = c1(o, x0); - MAKE_MUT(r, ia); mut_to(r, el_or(TI(x).elType, selfElType(item))); - mut_set(r, 0, item); + B arg = TI(x).get(x, 0); + B rep = c1(o, arg); + MAKE_MUT(r, ia); mut_to(r, el_or(TI(x).elType, selfElType(rep))); + mut_set(r, 0, rep); mut_copy(r, 1, x, 1, ia-1); return mut_fcd(r, x); } +B pick_ucw(B t, B o, B w, B x) { + if (isArr(w) || isAtm(x) || rnk(x)!=1) return def_fn_ucw(t, o, w, x); + usz xia = a(x)->ia; + i64 wi = o2i64(w); + if (wi<0) wi+= (i64)xia; + if ((u64)wi >= xia) thrM("⌾(n⊸⊑): reading out-of-bounds"); + B arg = TI(x).get(x, wi); + B rep = c1(o, arg); + if (reusable(x) && TI(x).canStore(rep)) { + if (TI(x).elType==el_i32) { + i32* xp = i32any_ptr(x); + xp[wi] = o2i(rep); + return x; + } else if (v(x)->type==t_harr) { + B* xp = harr_ptr(x); + dec(xp[wi]); + xp[wi] = rep; + return x; + } else if (TI(x).elType==el_f64) { + f64* xp = f64any_ptr(x); + xp[wi] = o2f(rep); + return x; + } else if (v(x)->type==t_fillarr) { + B* xp = fillarr_ptr(x); + dec(xp[wi]); + xp[wi] = rep; + return x; + } + } + MAKE_MUT(r, xia); mut_to(r, el_or(TI(x).elType, selfElType(rep))); + mut_set(r, wi, rep); + mut_copy(r, 0, x, 0, wi); + mut_copy(r, wi+1, x, wi+1, xia-wi-1); + return mut_fcd(r, x); +} + B slash_ucw(B t, B o, B w, B x) { if (isAtm(w) || rnk(w)!=1 || rnk(x)!=1 || a(w)->ia!=a(x)->ia) return def_fn_ucw(t, o, w, x); usz ia = a(x)->ia; @@ -779,6 +815,7 @@ B slash_ucw(B t, B o, B w, B x) { BI_FNS0(F); static inline void sfns_init() { BI_FNS1(F) c(BFn,bi_pick)->uc1 = pick_uc1; + c(BFn,bi_pick)->ucw = pick_ucw; c(BFn,bi_slash)->ucw = slash_ucw; } #undef F