From 1ffc141919cdfb24a87fc3689a0415727ac2a8e9 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 22 Apr 2023 15:09:31 +0300 Subject: [PATCH] move toCells & toKCells to cells.c --- src/builtins/cells.c | 57 +++++++++++++++++++++++++++++++++++++++----- src/core/harr.c | 54 ----------------------------------------- 2 files changed, 51 insertions(+), 60 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 9bcab99f..b1a279b4 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -51,6 +51,57 @@ B insert_base(B f, B x, usz xia, bool has_w, B w) { return r; } +static NOINLINE B empty_frame(usz* xsh, ur k) { + if (k==1) return emptyHVec(); + assert(k>1); + HArr_p f = m_harrUp(0); + shcpy(arr_shAlloc((Arr*)f.c, k), xsh, k); + return f.b; +} +NOINLINE B toCells(B x) { + assert(isArr(x) && RNK(x)>1); + usz* xsh = SH(x); + usz cam = xsh[0]; + if (cam==0) { decG(x); return emptyHVec(); } + if (RNK(x)==2) { + M_HARR(r, cam) + incBy(x, cam-1); + BSS2A slice = TI(x,slice); + usz csz = arr_csz(x); + for (usz i=0,p=0; i 1); + for (usz i=0,p=0; i=0); + usz* xsh = SH(x); + usz cam = shProd(xsh, 0, k); + + B r; + if (cam==0) { + r = empty_frame(xsh, k); + } else { + S_KSLICES(x, xsh, k) + incG(x); + M_HARR(r, cam) + for (usz i=0,p=0; i1); - usz cam = SH(x)[0]; - usz csz = arr_csz(x); - BSS2A slice = TI(x,slice); - M_HARR(r, cam) - usz p = 0; - if (RNK(x)==2) { - for (usz i = 0; i < cam; i++) { - HARR_ADD(r, i, taga(arr_shVec(slice(incG(x), p, csz)))); - p+= csz; - } - } else { - usz cr = RNK(x)-1; - ShArr* csh = m_shArr(cr); - usz* xsh = SH(x); - shcpy(csh->a, xsh+1, cr); - for (usz i = 0; i < cam; i++) { - HARR_ADD(r, i, taga(arr_shSetI(slice(incG(x), p, csz), cr, csh))); - p+= csz; - } - ptr_dec(csh); - } - decG(x); - return HARR_FV(r); -} -B toKCells(B x, ur k) { - assert(isArr(x) && k<=RNK(x) && k>=0); - ur xr = RNK(x); usz* xsh = SH(x); - ur cr = xr-k; - usz cam = shProd(xsh, 0, k); - usz csz = shProd(xsh, k, xr); - - ShArr* csh; - if (cr>1) { - csh = m_shArr(cr); - shcpy(csh->a, xsh+k, cr); - } - - BSS2A slice = TI(x,slice); - M_HARR(r, cam); - usz p = 0; - for (usz i = 0; i < cam; i++) { - HARR_ADD(r, i, taga(arr_shSetI(slice(incG(x), p, csz), cr, csh))); - p+= csz; - } - if (cr>1) ptr_dec(csh); - usz* rsh = HARR_FA(r, k); - if (rsh) shcpy(rsh, xsh, k); - decG(x); - return HARR_O(r).b; -} - NOINLINE B m_caB(usz ia, B* a) { HArr_p r = m_harrUv(ia); for (usz i = 0; i < ia; i++) r.a[i] = a[i];