diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 97f2cf7f..0005123e 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -23,7 +23,18 @@ B scan_rows_bit(u8, B x, usz m); B takedrop_highrank(bool take, B w, B x); B rotate_highrank(bool inv, B w, B x); -B interleave_cells(B w, B x, ur k); // from transpose.c +Arr* join_cells(B w, B x, ur k); // from transpose.c + +NOINLINE B interleave_cells(B w, B x, ur k) { // consumes w,x; interleave arrays, 𝕨 ≍⎉(-xk) 𝕩; assumes equal-shape args + ux xr = RNK(x); + if (xr==0) return C2(join, w, x); + ShArr* rsh = m_shArr(xr+1); // TODO handle leak if join_cells fails + usz* xsh = SH(x); + shcpy(rsh->a, xsh, k); + rsh->a[k] = 2; + shcpy(rsh->a+k+1, xsh+k, xr-k); + return taga(arr_shSetUG(join_cells(w, x, k), xr+1, rsh)); +} // from select.c: B select_rows_B(B x, ux csz, ux cam, B inds); diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index e5758e4a..320eb7f6 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -121,7 +121,7 @@ Arr* join_cells(B w, B x, ur k) { // consumes w,x; join k-cells, 𝕨 ∾○⥊ Arr *r; u8 xlw = elwBitLog(re); - usz n = shProd(SH(w), 0, k); + usz n = shProd(SH(w), 0, k); (void)n; usz wcsz = shProd(SH(w), k, RNK(w)); usz xcsz = shProd(SH(x), k, RNK(x)); usz ia = IA(w)+IA(x); @@ -172,17 +172,6 @@ Arr* join_cells(B w, B x, ur k) { // consumes w,x; join k-cells, 𝕨 ∾○⥊ B join_c2(B, B, B); -B interleave_cells(B w, B x, ur k) { // consumes w,x; interleave arrays, 𝕨 ≍⎉(-xk) 𝕩; assumes equal-shape args - ux xr = RNK(x); - if (xr==0) return C2(join, w, x); - ShArr* rsh = m_shArr(xr+1); // TODO handle leak if join_cells fails - usz* xsh = SH(x); - shcpy(rsh->a, xsh, k); - rsh->a[k] = 2; - shcpy(rsh->a+k+1, xsh+k, xr-k); - return taga(arr_shSetUG(join_cells(w, x, k), xr+1, rsh)); -} - static void transpose_move(void* rv, void* xv, u8 xe, usz w, usz h) { assert(xe!=el_bit); assert(xe!=el_B); transposeFns[elwByteLog(xe)](rv, xv, w, h, w, h);