better number/character fill checks

as the only valid number fill is 0, full isNum check is pointless
This commit is contained in:
dzaima 2025-06-08 17:26:30 +03:00
parent 2447ebe734
commit 0a561bce2b
5 changed files with 24 additions and 20 deletions

View File

@ -115,7 +115,7 @@ B listVariations_c2(B t, B w, B x) {
ac8=false, ac16=false, ac32=false, abit=false;
usz xia = IA(x);
SGetU(x)
if (isNum(xf)) {
if (numFill(xf)) {
i32 min=I32_MAX, max=I32_MIN;
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); for (usz i = 0; i < xia; i++) { if (xp[i]>max) max=xp[i]; if (xp[i]<min) min=xp[i]; } }
else if (xe==el_i16) { i16* xp = i16any_ptr(x); for (usz i = 0; i < xia; i++) { if (xp[i]>max) max=xp[i]; if (xp[i]<min) min=xp[i]; } }
@ -142,7 +142,7 @@ B listVariations_c2(B t, B w, B x) {
abit = min>=0 && max<=1;
onlyF64:
af64 = true;
} else if (isC32(xf)) {
} else if (chrFill(xf)) {
u32 max = 0;
if (xe!=el_c8) for (usz i = 0; i < xia; i++) {
B c = GetU(x, i);

View File

@ -152,7 +152,7 @@ static NOINLINE B select_list_cell(usz wi, B x) { // guarantees returning new ar
B xf = getFillR(x);
B xv = IGet(x, wi);
B rb;
if (isNum(xf) || isC32(xf)) {
if (numFill(xf) || chrFill(xf)) {
rb = m_unit(xv);
} else if (noFill(xf)) {
rb = m_hunit(xv);

View File

@ -114,8 +114,8 @@ B withFill(B x, B fill) { // consumes both
if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x;
switch(xt) {
case t_f64arr: case t_f64slice: case t_bitarr:
case t_i32arr: case t_i32slice: case t_i16arr: case t_i16slice: case t_i8arr: case t_i8slice: if(fill.u == m_i32(0 ).u) return x; break;
case t_c32arr: case t_c32slice: case t_c16arr: case t_c16slice: case t_c8arr: case t_c8slice: if(fill.u == m_c32(' ').u) return x; break;
case t_i32arr: case t_i32slice: case t_i16arr: case t_i16slice: case t_i8arr: case t_i8slice: if(numFill(fill)) return x; break;
case t_c32arr: case t_c32slice: case t_c16arr: case t_c16slice: case t_c8arr: case t_c8slice: if(chrFill(fill)) return x; break;
case t_fillslice: if (fillEqual(c(FillSlice,x)->fill, fill)) { dec(fill); return x; } break;
case t_fillarr: if (fillEqual(c(FillArr, x)->fill, fill)) { dec(fill); return x; }
if (reusable(x)) { // keeping flags is fine probably
@ -128,10 +128,10 @@ B withFill(B x, B fill) { // consumes both
usz ia = IA(x);
if (!FL_HAS(x,fl_squoze)) {
u8 xe;
if (isNum(fill)) {
if (numFill(fill)) {
x = squeeze_numTry(x, &xe, SQ_ANY);
if (elNum(xe)) return x;
} else if (isC32(fill)) {
} else if (chrFill(fill)) {
x = squeeze_chrTry(x, &xe, SQ_ANY);
if (elChr(xe)) return x;
}
@ -213,14 +213,14 @@ NOINLINE Arr* emptyArr(B x, ur xr) {
}
B xf = getFillR(x);
if (xr==1) {
if (isF64(xf)) numVec: return a(emptyIVec());
if (noFill(xf)) return a(emptyHVec());
if (isC32(xf)) chrVec: return a(emptyCVec());
if (numFill(xf)) numVec: return a(emptyIVec());
if ( noFill(xf)) return a(emptyHVec());
if (chrFill(xf)) chrVec: return a(emptyCVec());
}
Arr* r;
if (isF64(xf)) { u64* rp; r = m_bitarrp(&rp, 0); }
else if (noFill(xf)) { r = (Arr*) m_harrUp(0).c; }
else if (isC32(xf)) { u8* rp; r = m_c8arrp(&rp, 0); }
if (numFill(xf)) { u64* rp; r = m_bitarrp(&rp, 0); }
else if ( noFill(xf)) { r = (Arr*) m_harrUp(0).c; }
else if (chrFill(xf)) { u8* rp; r = m_c8arrp(&rp, 0); }
else { r = m_fillarrpEmpty(xf); }
if (xr<=1) arr_rnk01(r, xr);
return r;
@ -228,9 +228,9 @@ NOINLINE Arr* emptyArr(B x, ur xr) {
NOINLINE Arr* emptyWithFill(B fill) {
u8 type;
if (r_Bf(fill) == 0) { type = t_bitarr; goto tyarr; }
if (isC32(fill)) { type = t_c8arr; goto tyarr; }
if (noFill(fill)) return (Arr*) m_harrUp(0).c;
if (numFill(fill)) { type = t_bitarr; goto tyarr; }
if (chrFill(fill)) { type = t_c8arr; goto tyarr; }
if ( noFill(fill)) return (Arr*) m_harrUp(0).c;
return m_fillarrpEmpty(fill);
tyarr:;

View File

@ -26,6 +26,8 @@ static bool fillEqual(B w, B x) {
return fillEqualF(w, x);
}
static bool numFill(B x) { return x.u == m_f64(0).u; }
static bool chrFill(B x) { return isC32(x); }
static B getFillN(B x) { // doesn't consume, doesn't increment result; can return bi_noFill
if (isArr(x)) {

View File

@ -16,6 +16,7 @@ char* execAA_repr(u8 ex) {
#endif
NOINLINE B dyArith_AA(DyTableAA* table, B w, B x) {
assert(isArr(w) && isArr(x));
u8 we = TI(w, elType); if (we==el_B) goto rec;
u8 xe = TI(x, elType); if (xe==el_B) goto rec;
ur wr = RNK(w);
@ -131,6 +132,7 @@ u8 const nextType[] = {
};
NOINLINE B dyArith_SA(DyTableSA* table, B w, B x) {
assert(isArr(x));
usz ia = IA(x);
u8 xe = TI(x,elType);
@ -146,9 +148,9 @@ NOINLINE B dyArith_SA(DyTableSA* table, B w, B x) {
charX = elChr(xe);
} else {
B xf = getFillQ(x);
if (isNum(xf)) charX=0;
else if (isC32(xf)) charX=1;
else if (noFill(xf)) { fillVal=0; goto fillSel; }
if (numFill(xf)) charX=0;
else if (chrFill(xf)) charX=1;
else if ( noFill(xf)) { fillVal=0; goto fillSel; }
else { dec(xf); goto rec; } // whatever
}
bool charW;