From 0b34c96a5183b6cac9893a47f4a5cd7d9b383092 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 19 May 2021 03:13:04 +0300 Subject: [PATCH] inline join --- src/mut.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sfns.c | 5 +++++ 2 files changed, 64 insertions(+) diff --git a/src/mut.c b/src/mut.c index 5de7331a..b12c4f80 100644 --- a/src/mut.c +++ b/src/mut.c @@ -207,3 +207,62 @@ void mut_copy(Mut* m, usz ms, B x, usz xs, usz l) { } #undef AGAIN } + + +B vec_join(B w, B x) { // consumes both + usz wia = a(w)->ia; + usz xia = a(x)->ia; + usz ria = wia+xia; + if (v(w)->refc==1) { + u64 wsz = mm_size(v(w)); + u8 wt = v(w)->type; + if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)ia = ria; + memcpy(i32arr_ptr(w)+wia, i32any_ptr(x), xia*4); + dec(x); + return w; + } + if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)ia = ria; + memcpy(c32arr_ptr(w)+wia, c32any_ptr(x), xia*4); + dec(x); + return w; + } + if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)ia = ria; + memcpy(f64arr_ptr(w)+wia, f64any_ptr(x), xia*8); + dec(x); + return w; + } + if (wt==t_harr && fsizeof(HArr,a,B,ria)ia = ria; + B* rp = harr_ptr(w)+wia; + u8 xt = v(x)->type; + u8 xe = TI(x).elType; + if (xt==t_harr | xt==t_hslice | xt==t_fillarr) { + B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(x); + memcpy(rp, xp, xia*sizeof(B)); + for (usz i = 0; i < xia; i++) inc(rp[i]); + } else if (xe==el_i32) { + i32* xp = i32any_ptr(x); + for (usz i = 0; i < xia; i++) rp[i] = m_i32(xp[i]); + } else if (xe==el_c32) { + u32* xp = c32any_ptr(x); + for (usz i = 0; i < xia; i++) rp[i] = m_c32(xp[i]); + } else if (xe==el_f64) { + f64* xp = f64any_ptr(x); + for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); + } else { + BS2B xget = TI(x).get; + for (usz i = 0; i < xia; i++) rp[i] = xget(x, i); + } + dec(x); + return w; + } + } + MAKE_MUT(r, ria); mut_to(r, el_or(TI(w).elType, TI(x).elType)); + mut_copy(r, 0, w, 0, wia); + mut_copy(r, wia, x, 0, xia); + dec(w); dec(x); + return mut_fv(r); +} diff --git a/src/sfns.c b/src/sfns.c index e3da5ccb..b9f5f586 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -507,6 +507,11 @@ B join_c2(B t, B w, B x) { return withFill(r.b, f); } if (c-wr > 1 || c-xr > 1) thrM("∾: Argument ranks must differ by 1 or less"); + if (c==1) { + B r = vec_join(w, x); + if (rnk(r)==0) srnk(r,1); + return r; + } MAKE_MUT(r, wia+xia); mut_to(r, el_or(TI(w).elType, TI(x).elType)); mut_copy(r, 0, w, 0, wia);