diff --git a/src/builtins/cells.c b/src/builtins/cells.c index e8f7f744..b3ace389 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -382,14 +382,13 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x, with arr } base:; - M_HARR(r, cam); + + M_APD_SH(r, k, xsh); S_KSLICES(x, xsh, k, cam, 1); BB2B fc1 = c1fn(f); - for (usz i=0,xp=0; i1) shcpy(rsh, xsh, k); + for (usz i=0,xp=0; if; @@ -445,11 +444,9 @@ NOINLINE B for_cells_AS(B f, B w, B x, ur wcr, ur wr, u32 chr) { usz* wsh=SH(w); usz cam=shProd(wsh,0,wk); if (cam==0) return rank2_empty(f, w, wk, x, 0, chr); S_KSLICES(w, wsh, wk, cam, 1) incBy(x, cam-1); - M_HARR(r, cam); BBB2B fc2 = c2fn(f); - for (usz i=0,wp=0; i1) shcpy(rsh, wsh, wk); - decG(w); return bqn_merge(HARR_O(r).b); + M_APD_SH(r, wk, wsh); BBB2B fc2 = c2fn(f); + for (usz i=0,wp=0; i0 && xcr1) shcpy(rsh, xsh, xk); - decG(x); return bqn_merge(HARR_O(r).b); + M_APD_SH(r, xk, xsh); BBB2B fc2 = c2fn(f); + for (usz i=0,xp=0; i1) { rsh=m_shArr(zk); shcpy(rsh->a, zsh, zk); } + if (zk>1) ptr_inc(rsh = shObjS(zsh)); // need to keep zsh alive - M_HARR(r, cam); + M_APD_SH(r, zk, zsh); S_KSLICES(w, wsh, wk, xkM? cam0 : cam, 0) usz wp = 0; S_KSLICES(x, xsh, xk, xkM? cam : cam0, 0) usz xp = 0; BBB2B fc2 = c2fn(f); - if (ext==1) { for (usz i=0; if; B g = d->g; diff --git a/src/utils/mut.h b/src/utils/mut.h index c6d726dc..f81b15e4 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -261,6 +261,7 @@ ApdFn apd_tot_init, apd_sh_init; #define M_APD_TOT(M, IA) M_APD_BASE(M) M.apd = apd_tot_init; M.ia0 = (IA); // assumes elements will be arrays; end gives uninitialized shape #define M_APD_SH(M, RR, RSH) M_APD_BASE(M) M.apd = apd_sh_init; M.rsh0 = (RSH); M.rr0 = (RR); // appended things can be anything, will error on invalid; end gives full shape; rsh must be alive until at least the first APD call #define M_APD_SH1(M, RIA) usz M##_sh0 = (RIA); M_APD_SH(M, 1, &M##_sh0); -#define APD(M, A) M.apd(&M, A) // consumes A +#define APD(M, A) M.apd(&M, A) // doesn't consume A +#define APDD(M, A) ({ B av_ = (A); M.apd(&M, av_); dec(av_); }) // consumes A #define APD_SH_GET(M, TY) (M.end(&M, TY)) #define APD_TOT_GET(M) ({ NOGC_E; M.obj; })