From 3b580cbd0c3141e02601ea99b6ba8f41a804599c Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 29 Apr 2023 15:47:45 +0300 Subject: [PATCH] rename unit creation methods --- src/builtins/arithm.c | 2 +- src/builtins/cells.c | 6 +++--- src/builtins/fns.c | 4 ++-- src/builtins/fold.c | 4 ++-- src/builtins/grade.h | 2 +- src/builtins/md1.c | 4 ++-- src/builtins/search.c | 2 +- src/builtins/select.c | 2 +- src/builtins/sfns.c | 44 ++++++++++------------------------------ src/builtins/slash.c | 2 +- src/builtins/sysfn.c | 4 ++-- src/builtins/transpose.c | 4 ++-- src/core/derv.c | 2 +- src/core/fillarr.c | 30 ++++++++++++++++++++++++--- src/core/fillarr.h | 2 +- src/utils/each.c | 2 +- 16 files changed, 59 insertions(+), 57 deletions(-) diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 2728999f..603595d1 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -159,7 +159,7 @@ TRIG(sin,Sin) TRIG(cos,Cos) TRIG(tan,Tan) #undef TRIG #undef MATH -B lt_c1(B t, B x) { return m_atomUnit(x); } +B lt_c1(B t, B x) { return m_unit(x); } B eq_c1(B t, B x) { if (isAtm(x)) { decA(x); return m_i32(0); } B r = m_i32(RNK(x)); decG(x); return r; } B ne_c1(B t, B x) { if (isAtm(x)) { decA(x); return m_i32(1); } B r = m_f64(*SH(x)); decG(x); return r; } diff --git a/src/builtins/cells.c b/src/builtins/cells.c index c61e8759..b60effea 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -275,8 +275,8 @@ static ur cell_rank(f64 r, f64 k) { // ⎉k over arg rank r -static NOINLINE B c1wrap(B f, B x) { B r = c1(f, x); return isAtm(r)? m_atomUnit(r) : r; } -static NOINLINE B c2wrap(B f, B w, B x) { B r = c2(f, w, x); return isAtm(r)? m_atomUnit(r) : r; } +static NOINLINE B c1wrap(B f, B x) { B r = c1(f, x); return isAtm(r)? m_unit(r) : r; } +static NOINLINE B c2wrap(B f, B w, B x) { B r = c2(f, w, x); return isAtm(r)? m_unit(r) : r; } // monadic ˘ & ⎉ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x, with array x, xr>0, 0≤cr0 && k>0 && cr1? toCells(x) : k==0? m_atomUnit(x) : toKCells(x, k); + return k==1 && RNK(x)>1? toCells(x) : k==0? m_unit(x) : toKCells(x, k); case n_select: if (IA(x)==0) goto noSpecial; if (cr==0) goto base; diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 477c9d87..fc0636c4 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -69,7 +69,7 @@ B ud_c1(B t, B x) { usz xia = IA(x); if (RNK(x)!=1) thrF("↕: Argument must be either an integer or integer list (had rank %i)", RNK(x)); if (xia>UR_MAX) thrF("↕: Result rank too large (%s≡≠𝕩)", xia); - if (xia==0) { decG(x); return m_unit(emptyIVec()); } + if (xia==0) { decG(x); return m_funit(emptyIVec()); } usz sh[xia]; // stack allocation of rank items i32 pos[xia]; usz ria = 1; @@ -106,7 +106,7 @@ B ud_c2(B t, B w, B x) { if (isArr(w)) { if (RNK(w)>1) thrM("↕: 𝕨 must have rank at most 1"); wia = IA(w); - if (wia==0) { decG(w); return isArr(x)? x : m_atomUnit(x); } + if (wia==0) { decG(w); return isArr(x)? x : m_unit(x); } } ur xr; if (isAtm(x) || (xr=RNK(x))f; if (xia==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); } if (isFun(f)) { u8 rtid = v(f)->flags-1; - if (RNK(x)==1 && isPervasiveDyExt(f)) return m_atomUnit(fold_c1(d, x)); + if (RNK(x)==1 && isPervasiveDyExt(f)) return m_unit(fold_c1(d, x)); if (rtid == n_join) { ur xr = RNK(x); if (xr==1) return x; @@ -365,7 +365,7 @@ B insert_c2(Md1D* d, B w, B x) { B f = d->f; if (isFun(f)) { if (RNK(x)==1 && isPervasiveDyExt(f)) { if (isAtm(w)) { - to_fold: return m_atomUnit(fold_c2(d, w, x)); + to_fold: return m_unit(fold_c2(d, w, x)); } if (RNK(w)==0) { B w0=w; w = IGet(w,0); decG(w0); diff --git a/src/builtins/grade.h b/src/builtins/grade.h index ef2f585d..5d62d7ac 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -328,7 +328,7 @@ B GRADE_CAT(c1)(B t, B x) { B GRADE_CAT(c2)(B t, B w, B x) { if (isAtm(w) || RNK(w)==0) thrM(GRADE_CHR": 𝕨 must have rank≥1"); - if (isAtm(x)) x = m_atomUnit(x); + if (isAtm(x)) x = m_unit(x); ur wr = RNK(w); ur xr = RNK(x); diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 23862e3a..81d3f814 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -61,8 +61,8 @@ B tbl_c1(Md1D* d, B x) { B slash_c2(B t, B w, B x); B shape_c2(B t, B w, B x); B tbl_c2(Md1D* d, B w, B x) { B f = d->f; - if (isAtm(w)) w = m_atomUnit(w); - if (isAtm(x)) x = m_atomUnit(x); + if (isAtm(w)) w = m_unit(w); + if (isAtm(x)) x = m_unit(x); ur wr = RNK(w); usz wia = IA(w); ur xr = RNK(x); usz xia = IA(x); ur rr = wr+xr; usz ria = uszMul(wia, xia); diff --git a/src/builtins/search.c b/src/builtins/search.c index 4361e696..338db76a 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -98,7 +98,7 @@ static NOINLINE B2 splitCells(B n, B p, u8 mode) { // 0:∊ 1:⊐ 2:⊒ #define ARG_P (mode? "𝕨" : "𝕩") if (isAtm(p) || RNK(p)==0) thrF("%U: %U cannot have rank 0", SYMB, ARG_P); ur pr = RNK(p); - if (isAtm(n)) n = m_atomUnit(n); + if (isAtm(n)) n = m_unit(n); ur nr = RNK(n); if (nr < pr-1) thrF("%U: Rank of %U must be at least the cell rank of %U (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", SYMB, ARG_N, ARG_P, mode?p:n, mode?n:p); ur pcr = pr-1; diff --git a/src/builtins/select.c b/src/builtins/select.c index b7079f7d..ab0a0038 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -118,7 +118,7 @@ B select_c2(B t, B w, B x) { B xv = IGet(x, wi); B rb; if (isNum(xf) || isC32(xf)) { - rb = m_atomUnit(xv); + rb = m_unit(xv); } else if (noFill(xf)) { rb = m_hunit(xv); } else { diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index a67bde40..09993dfe 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -35,28 +35,6 @@ static Arr* take_impl(usz ria, B x) { // consumes x; returns v↑⥊𝕩 without } } -B m_vec1(B a) { - if (isF64(a)) { - i32 i = (i32)a.f; - if (RARE(a.f != i)) { f64* rp; B r = m_f64arrv(&rp, 1); rp[0] = a.f; return r; } - else if (q_ibit(i)) { u64* rp; B r = m_bitarrv(&rp, 1); rp[0] = i; return r; } - else if (i == (i8 )i) { i8* rp; B r = m_i8arrv (&rp, 1); rp[0] = i; return r; } - else if (i == (i16)i) { i16* rp; B r = m_i16arrv(&rp, 1); rp[0] = i; return r; } - else { i32* rp; B r = m_i32arrv(&rp, 1); rp[0] = i; return r; } - } - if (isC32(a)) { - u32 c = o2cG(a); - if (LIKELY(c1) thrM("⥊: 𝕨 must have rank at most 1"); if (IA(w)>UR_MAX) thrM("⥊: Result rank too large"); nr = IA(w); @@ -214,7 +192,7 @@ B shape_c2(B t, B w, B x) { if (sh) sh->a[unkPos] = item; nia = uszMul(nia, item); if (fill) { - if (!isArr(x)) x = m_atomUnit(x); + if (!isArr(x)) x = m_unit(x); x = taga(arr_shVec(take_impl(nia, x))); xia = nia; } @@ -410,7 +388,7 @@ static B recPick(B w, B x) { // doesn't consume B pick_c2(B t, B w, B x) { if (RARE(isAtm(x))) { if (isArr(w) && RNK(w)==1 && IA(w)==0) { dec(w); return x; } - x = m_atomUnit(x); + x = m_unit(x); } if (isNum(w)) { if (RNK(x)!=1) thrF("⊑: 𝕩 must be a list when 𝕨 is a number (%H ≡ ≢𝕩)", x); @@ -625,7 +603,7 @@ NOINLINE B takedrop_highrank(bool take, B w, B x) { } #define TAKEDROP_INIT(TAKE) \ - if (!isArr(x)) x = m_atomUnit(x); \ + if (!isArr(x)) x = m_unit(x); \ if (!isNum(w)) return takedrop_highrank(TAKE, w, x); \ Arr* a; \ i64 wv = o2i64(w); \ @@ -910,11 +888,11 @@ B join_c1(B t, B x) { } } B join_c2(B t, B w, B x) { - if (isAtm(w)) w = m_atomUnit(w); + if (isAtm(w)) w = m_unit(w); ur wr = RNK(w); if (isAtm(x)) { if (wr==1 && inplace_add(w, x)) return w; - x = m_atomUnit(x); + x = m_unit(x); } ur xr = RNK(x); B f = fill_both(w, x); @@ -985,8 +963,8 @@ B couple_c1(B t, B x) { } B couple_c2(B t, B w, B x) { if (isAtm(w)&isAtm(x)) return m_vec2(w, x); - if (isAtm(w)) w = m_atomUnit(w); - if (isAtm(x)) x = m_atomUnit(x); + if (isAtm(w)) w = m_unit(w); + if (isAtm(x)) x = m_unit(x); if (!eqShape(w, x)) thrF("≍: 𝕨 and 𝕩 must have equal shapes (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); usz ia = IA(w); ur wr = RNK(w); @@ -1025,7 +1003,7 @@ B shiftb_c1(B t, B x) { } B shiftb_c2(B t, B w, B x) { if (isAtm(x) || RNK(x)==0) thrM("»: 𝕩 cannot be a scalar"); - if (isAtm(w)) w = m_atomUnit(w); + if (isAtm(w)) w = m_unit(w); shift_check(w, x); B f = fill_both(w, x); usz wia = IA(w); @@ -1051,7 +1029,7 @@ B shifta_c1(B t, B x) { } B shifta_c2(B t, B w, B x) { if (isAtm(x) || RNK(x)==0) thrM("«: 𝕩 cannot be a scalar"); - if (isAtm(w)) w = m_atomUnit(w); + if (isAtm(w)) w = m_unit(w); shift_check(w, x); B f = fill_both(w, x); usz wia = IA(w); @@ -1378,7 +1356,7 @@ NOINLINE B enclose_im(B t, B x) { return r; } B enclose_uc1(B t, B o, B x) { - return enclose_im(t, c1(o, m_atomUnit(x))); + return enclose_im(t, c1(o, m_unit(x))); } void sfns_init(void) { diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 286e702b..99aff60c 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -641,7 +641,7 @@ B slash_c2(B t, B w, B x) { if (wr>1) thrF("/: Simple 𝕨 must have rank 0 or 1 (%i≡=𝕨)", wr); if (wr<1) { B v=IGet(w, 0); decG(w); w=v; goto atom; } wia = IA(w); - if (wia==0) { decG(w); return isArr(x)? x : m_atomUnit(x); } + if (wia==0) { decG(w); return isArr(x)? x : m_unit(x); } } else { atom: if (!q_i32(w)) goto base; diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index db961a0d..22af7bf1 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -1382,8 +1382,8 @@ B bitop2(B f, B w, B x, enum BitOp2 op, char* name) { ow = t[0]; rw = t[1]; xw = t[2]; ww = t[3]; } - if (isAtm(x)) x = m_atomUnit(x); - if (isAtm(w)) w = m_atomUnit(w); + if (isAtm(x)) x = m_unit(x); + if (isAtm(w)) w = m_unit(w); ur wr=RNK(w); usz* wsh = SH(w); u64 s = wr==0? ww : ww*(u64)wsh[wr-1]; ur xr=RNK(x); usz* sh = SH(x); u64 t = xr==0? xw : xw*(u64) sh[xr-1]; bool negw = 0; // Negate 𝕨 to subtract from 𝕩 diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index d5845b6f..4d23820b 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -124,7 +124,7 @@ static Arr* transpose_noshape(B* px, usz ia, usz w, usz h) { } B transp_c1(B t, B x) { - if (RARE(isAtm(x))) return m_atomUnit(x); + if (RARE(isAtm(x))) return m_unit(x); ur xr = RNK(x); if (xr<=1) return x; @@ -164,7 +164,7 @@ B transp_c2(B t, B w, B x) { if (isArr(w)) { if (RNK(w)>1) thrM("⍉: 𝕨 must have rank at most 1"); wia = IA(w); - if (wia==0) { decG(w); return isArr(x)? x : m_atomUnit(x); } + if (wia==0) { decG(w); return isArr(x)? x : m_unit(x); } } ur xr; if (isAtm(x) || (xr=RNK(x))m1==c(Md1,bi_tbl)) { B i = TI(d->f,identity)(d->f); - return q_N(i)? i : m_atomUnit(i); + return q_N(i)? i : m_unit(i); } return bi_N; } diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 393881bd..923304c1 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -161,7 +161,7 @@ B withFill(B x, B fill) { // consumes both } -NOINLINE B m_unit(B x) { +NOINLINE B m_funit(B x) { B xf = asFill(inc(x)); if (noFill(xf)) return m_hunit(x); FillArr* r = m_arr(fsizeof(FillArr,a,B,1), t_fillarr, 1); @@ -170,7 +170,8 @@ NOINLINE B m_unit(B x) { r->a[0] = x; return taga(r); } -NOINLINE B m_atomUnit(B x) { + +NOINLINE B m_unit(B x) { u64 data; assert(sizeof(f64)<=8); u8 t; u64 sz; if (isNum(x)) { @@ -185,10 +186,33 @@ NOINLINE B m_atomUnit(B x) { if (xi==(u8 )xi) { u8 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c8arr; } else if (xi==(u16)xi) { u16 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c16arr; } else { u32 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c32arr; } - } else return m_unit(x); + } else return m_funit(x); TyArr* r = m_arr(offsetof(TyArr,a) + sizeof(u64), t, 1); *((u64*)r->a) = data; FINISH_OVERALLOC(r, offsetof(TyArr,a)+sz, offsetof(TyArr,a)+sizeof(u64)); arr_shAtm((Arr*)r); return taga(r); } + +NOINLINE B m_vec1(B a) { + if (isF64(a)) { + i32 i = (i32)a.f; + if (RARE(a.f != i)) { f64* rp; B r = m_f64arrv(&rp, 1); rp[0] = a.f; return r; } + else if (q_ibit(i)) { u64* rp; B r = m_bitarrv(&rp, 1); rp[0] = i; return r; } + else if (i == (i8 )i) { i8* rp; B r = m_i8arrv (&rp, 1); rp[0] = i; return r; } + else if (i == (i16)i) { i16* rp; B r = m_i16arrv(&rp, 1); rp[0] = i; return r; } + else { i32* rp; B r = m_i32arrv(&rp, 1); rp[0] = i; return r; } + } + if (isC32(a)) { + u32 c = o2cG(a); + if (LIKELY(cxr; ur rM = wg? wr : xr; ur rm = wg? xr : wr; - if (rM==0) return m_unit(f(fo, w, x)); + if (rM==0) return m_funit(f(fo, w, x)); if (rm && !eqShPart(SH(w), SH(x), rm)) thrF("Mapping: Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); bool rw = rM==wr && reusable(w) && TY(w)==t_harr; // dereferencing is safe as rank>0 from rM== bool rx = rM==xr && reusable(x) && TY(x)==t_harr;