allZeroes & allOnes variants which set result flags

This commit is contained in:
dzaima 2024-10-09 01:18:09 +03:00
parent 002d58e057
commit f33e1e0dcc
7 changed files with 14 additions and 9 deletions

View File

@ -242,7 +242,7 @@ B find_c2(B t, B w, B x) {
usz wl = IA(w);
usz xl = IA(x);
if (wl > xl) { r = emptyIVec(); goto dec_ret; }
if (wl == 0) { r = taga(arr_shVec(allOnes(xl+1))); goto dec_ret; }
if (wl == 0) { r = taga(arr_shVec(allOnesFl(xl+1))); goto dec_ret; }
// Compare elements of w to slices of x
usz rl = xl - wl + 1; // Result length
u8* xp = tyany_ptr(x);
@ -315,7 +315,7 @@ B find_c2(B t, B w, B x) {
rsh[i] = c;
}
}
r = taga(arr_shSetUO(allOnes(ia), xr, sh));
r = taga(arr_shSetUO(allOnesFl(ia), xr, sh));
goto dec_ret;
}

View File

@ -417,7 +417,7 @@ B GRADE_CAT(c2)(B t, B w, B x) {
B r; Arr* ra;
if (wia==0 | xia==0) {
ra = allZeroes(xia);
ra = allZeroesFl(xia);
goto copysh_done;
}
if (wia==1) {
@ -505,12 +505,12 @@ B GRADE_CAT(c2)(B t, B w, B x) {
w=toI32Any(w); x=toI32Any(x);
#endif
} else {
ra = GRADE_UD(reshape_one(xia, m_f64(wia)), allZeroes(xia));
ra = GRADE_UD(reshape_one(xia, m_f64(wia)), allZeroesFl(xia));
goto copysh_done;
}
} else { // w is character
if (elNum(xe)) {
ra = GRADE_UD(allZeroes(xia), reshape_one(xia, m_f64(wia)));
ra = GRADE_UD(allZeroesFl(xia), reshape_one(xia, m_f64(wia)));
goto copysh_done;
}

View File

@ -174,7 +174,7 @@ B memberOf_c1(B t, B x) {
if (sameness == 1) goto allSame;
if (RARE(sameness == 2)) {
decG(x);
return taga(arr_shVec(allOnes(n)));
return taga(arr_shVec(allOnesFl(n)));
}
if (use_sorted(x, lw)) {
@ -403,7 +403,7 @@ B find_c1(B, B);
B indexOf_c1(B t, B x) {
if (isAtm(x) || RNK(x)==0) thrM("⊐: 𝕩 cannot have rank 0");
u64 n = *SH(x);
if (n<=1) { zeroRes: decG(x); return n? taga(arr_shVec(allZeroes(n))) : emptyIVec(); }
if (n<=1) { zeroRes: decG(x); return n? taga(arr_shVec(allZeroesFl(n))) : emptyIVec(); }
if (n>(usz)I32_MAX+1) thrM("⊐: Argument length >2⋆31 not supported");
usz csz = arr_csz(x);

View File

@ -371,7 +371,7 @@ B rand_range_c2(B t, B w, B x) {
PLAINLOOP for (usz i = 0; i < am; i++) rp[i] = wy2u01(wyrand(&seed));
} else {
if (max!=1) thrM("(rand).Range: 𝕩 cannot be negative");
r = allZeroes(am);
r = allZeroesFl(am);
}
} else if (max > (1ULL<<31)) {
if (max >= 1LL<<53) thrM("(rand).Range: 𝕩 must be less than 2⋆53");

View File

@ -5,7 +5,7 @@ B asFill(B x) { // consumes
u8 xe = TI(x,elType);
usz ia = IA(x);
if (elNum(xe)) {
B r = taga(arr_shCopy(allZeroes(ia), x));
B r = taga(arr_shCopy(allZeroesFl(ia), x));
decG(x);
return r;
}

View File

@ -189,6 +189,8 @@ 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; always produces new array
Arr* allOnes(usz ia); // ia⥊1 with undefined shape; always produces new array
Arr* allZeroesFl(usz ia); // allZeroes but marked as fl_asc|fl_dsc
Arr* allOnesFl(usz ia); // allOnes but marked as fl_asc|fl_dsc
Arr* reshape_one(usz nia, B x); // nia⥊<x with undefined shape, with fl_asc, fl_dsc, and fl_squoze set; consumes x
B i64EachDec(i64 v, B x); // v¨ x; consumes x

View File

@ -33,6 +33,9 @@
NOINLINE Arr* allZeroes(usz ia) { u64* rp; Arr* r = m_bitarrp(&rp, ia); for (usz i = 0; i < BIT_N(ia); i++) rp[i] = 0; return r; }
NOINLINE Arr* allOnes (usz ia) { u64* rp; Arr* r = m_bitarrp(&rp, ia); for (usz i = 0; i < BIT_N(ia); i++) rp[i] = ~0ULL; return r; }
NOINLINE Arr* allZeroesFl(usz ia) { return FLV_SET(allZeroes(ia), fl_asc|fl_dsc|fl_squoze); }
NOINLINE Arr* allOnesFl (usz ia) { return FLV_SET(allOnes (ia), fl_asc|fl_dsc|fl_squoze); }
NOINLINE B bit_sel(B b, B e0, B e1) {
u8 t0 = selfElType(e0);
u64* bp = bitany_ptr(b);