From 88de3365162f85a5649df5fe1ab530a70b687d6f Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 15 Aug 2024 17:28:25 +0300 Subject: [PATCH] introduce bitany_ptr + more general typed arr pointer getting functions --- src/builtins/transpose.c | 2 +- src/core/arrFns.h | 20 +++++++++++++++----- src/core/numarr.h | 6 ++++-- src/core/stuff.h | 6 +++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index 80a4ac58..5854aa80 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -157,7 +157,7 @@ static Arr* transpose_noshape(B* px, usz ia, usz w, usz h) { if (h==2) { u64* rp; r=m_bitarrp(&rp, ia); Arr* x1o = TI(x,slice)(inc(x),w,w); - interleave_bits(rp, bitarr_ptr(x), ((TyArr*)x1o)->a, ia); + interleave_bits(rp, bitarr_ptr(x), bitanyv_ptr(x1o), ia); mm_free((Value*)x1o); #ifdef __BMI2__ } else if (w==2) { diff --git a/src/core/arrFns.h b/src/core/arrFns.h index 040faf70..4ca967cb 100644 --- a/src/core/arrFns.h +++ b/src/core/arrFns.h @@ -14,12 +14,22 @@ static B* arrV_bptr(Arr* x) { if (PTY(x)==t_fillslice) return ((FillSlice*)x)->a; return NULL; } -static void* tyarr_ptr(B x) { assert(IS_ANY_ARR(TY(x)) && !IS_SLICE(TY(x))); return c(TyArr,x)->a; } -static void* tyslice_ptr(B x) { assert(IS_ANY_ARR(TY(x)) && IS_SLICE(TY(x))); return c(TySlice,x)->a; } -static void* tyany_ptr(B x) { - assert(IS_ANY_ARR(TY(x))); - return IS_SLICE(TY(x))? c(TySlice,x)->a : c(TyArr,x)->a; + +static void* tyarrv_ptr(TyArr* x) { + assert(IS_ANY_ARR(PTY(x)) && !IS_SLICE(PTY(x))); + return x->a; } +static void* tyanyv_ptr(Arr* x) { + assert(IS_ANY_ARR(PTY(x))); + return IS_SLICE(PTY(x))? ((TySlice*)x)->a : ((TyArr*)x)->a; +} +static void* tyslicev_ptr(Arr* x) { + assert(IS_SLICE(PTY(x))); + return ((TySlice*)x)->a; +} + +static void* tyarr_ptr(B x) { return tyarrv_ptr(c(TyArr,x)); } +static void* tyany_ptr(B x) { return tyanyv_ptr(a(x)); } #define M_TYARR(WM, OVER, MID, RV, PRE) { PRE \ Arr* r = m_arr((offsetof(TyArr, a) + ( \ diff --git a/src/core/numarr.h b/src/core/numarr.h index ed4c6197..e146115f 100644 --- a/src/core/numarr.h +++ b/src/core/numarr.h @@ -89,8 +89,10 @@ static Arr* m_bitarrp(u64** p, usz ia) { *p = (u64*)r->a; return (Arr*)r; } -static u64* bitarr_ptr(B x) { VTY(x, t_bitarr); return (u64*)c(BitArr,x)->a; } -static u64* bitarrv_ptr(TyArr* x) { return (u64*)x->a; } +static u64* bitarrv_ptr(TyArr* x) { VTY(taga(x), t_bitarr); return (u64*)((BitArr*)x)->a; } +static u64* bitanyv_ptr(Arr* x) { VTY(taga(x), t_bitarr); return (u64*)((BitArr*)x)->a; } +static u64* bitarr_ptr(B x) { return bitarrv_ptr(c(TyArr,x)); } +static u64* bitany_ptr(B x) { return bitanyv_ptr(a(x)); } Arr* cpyI8Arr (B x); // consumes diff --git a/src/core/stuff.h b/src/core/stuff.h index d26ce7e2..46707188 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -184,13 +184,13 @@ static bool eqShape(B w, B x) { assert(isArr(w) && isArr(x)); return ptr_eqShape B bit_sel(B b, B e0, B e1); // consumes b; b must be bitarr; b⊏e0‿e1 -Arr* allZeroes(usz ia); // ia⥊0 with undefined shape -Arr* allOnes(usz ia); // ia⥊1 with undefined shape +Arr* allZeroes(usz ia); // ia⥊0 with undefined shape; always produces new array +Arr* allOnes(usz ia); // ia⥊1 with undefined shape; always produces new array Arr* reshape_one(usz nia, B x); // nia⥊