This commit is contained in:
dzaima 2021-05-25 02:46:06 +03:00
parent 55a93d1838
commit 582273229b
3 changed files with 13 additions and 28 deletions

View File

@ -107,16 +107,12 @@ B over_c2(B d, B w, B x) { B xr=c1(c(Md2D,d)->g, x); return c2(c(Md2D,d)->f, c1(
B cond_c1(B d, B x) { B g=c(Md2D,d)->g;
if (isAtm(g)||rnk(g)!=1) thrM("◶: 𝕘 must have rank 1");
i64 fr = o2i64(c1(c(Md2D,d)->f, inc(x)));
if (fr<0) fr+= a(g)->ia;
if ((u64)fr >= a(g)->ia) thrM("◶: 𝔽 out of bounds of 𝕘");
usz fr = WRAP(o2i64(c1(c(Md2D,d)->f, inc(x))), a(g)->ia, thrM("◶: 𝔽 out of bounds of 𝕘"));
return c1(TI(g).getU(g, fr), x);
}
B cond_c2(B d, B w, B x) { B g=c(Md2D,d)->g;
if (isAtm(g)||rnk(g)!=1) thrM("◶: 𝕘 must have rank 1");
i64 fr = o2i64(c2(c(Md2D,d)->f, inc(w), inc(x)));
if (fr<0) fr+= a(g)->ia;
if ((u64)fr >= a(g)->ia) thrM("◶: 𝔽 out of bounds of 𝕘");
usz fr = WRAP(o2i64(c2(c(Md2D,d)->f, inc(w), inc(x))), a(g)->ia, thrM("◶: 𝔽 out of bounds of 𝕘"));
return c2(TI(g).getU(g, fr), w, x);
}

View File

@ -46,10 +46,7 @@ B pick_c1(B t, B x) {
}
B pick_c2(B t, B w, B x) {
if (isNum(w) && isArr(x) && rnk(x)==1) {
i64 p = o2i64(w);
usz xia = a(x)->ia;
if (p<0) p+= (i64)xia;
if ((u64)p >= xia) thrF("⊑: indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, xia);
usz p = WRAP(o2i64(w), a(x)->ia, thrF("⊑: indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, iaW));
B r = TI(x).get(x, p);
dec(x);
return r;
@ -81,9 +78,7 @@ B select_c2(B t, B w, B x) {
if (xr==0) thrM("⊏: 𝕩 cannot be a unit");
usz csz = arr_csz(x);
usz cam = a(x)->sh[0];
i64 wi = o2i64(w);
if (wi<0) wi+= cam;
if ((usz)wi >= cam) thrF("⊏: Indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, cam);
usz wi = WRAP(o2i64(w), cam, thrF("⊏: Indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, cam));
B r = TI(x).slice(inc(x), wi*csz);
usz* sh = arr_shAllocI(r, csz, xr-1);
if (sh) memcpy(sh, a(x)->sh+1, (xr-1)*sizeof(usz));
@ -102,8 +97,7 @@ B select_c2(B t, B w, B x) {
i32* rp; B r = m_i32arrc(&rp, w);
i32* xp = i32any_ptr(x);
for (usz i = 0; i < wia; i++) {
i64 c = wp[i];
if (RARE((u64)c >= xia)) { if (c<0) c+= xia; if ((u64)c >= xia)thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia); }
usz c = WRAP(wp[i], xia, thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia));
rp[i] = xp[c];
}
dec(w); dec(x);
@ -112,8 +106,7 @@ B select_c2(B t, B w, B x) {
u32* rp; B r = m_c32arrc(&rp, w);
u32* xp = c32any_ptr(x);
for (usz i = 0; i < wia; i++) {
i64 c = wp[i];
if (RARE((u64)c >= xia)) { if (c<0) c+= xia; if ((u64)c >= xia)thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia); }
usz c = WRAP(wp[i], xia, thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia));
rp[i] = xp[c];
}
dec(w); dec(x);
@ -121,8 +114,7 @@ B select_c2(B t, B w, B x) {
} else {
HArr_p r = m_harrUc(w);
for (usz i = 0; i < wia; i++) {
i64 c = wp[i];
if (RARE((u64)c >= xia)) { if (c<0) c+= xia; if ((u64)c >= xia)thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia); }
usz c = WRAP(wp[i], xia, thrF("⊏: Indexing out-of-bounds (%i∊𝕨, %s≡≠𝕩)", wp[i], xia));
r.a[i] = xget(x, c);
}
dec(w); dec(x);
@ -134,9 +126,7 @@ B select_c2(B t, B w, B x) {
for (usz i = 0; i < wia; i++) {
B cw = wgetU(w, i);
if (!isNum(cw)) { harr_pfree(r.b, i); goto base; }
f64 c = o2f(cw);
if (c<0) c+= xia;
if ((usz)c >= xia) thrF("⊏: Indexing out-of-bounds (%R∊𝕨, %s≡≠𝕩)", cw, xia);
usz c = WRAP(o2i64(cw), xia, thrF("⊏: Indexing out-of-bounds (%R∊𝕨, %s≡≠𝕩)", cw, xia));
r.a[i] = xget(x, c);
}
dec(w); dec(x);
@ -709,9 +699,7 @@ B pick_uc1(B t, B o, B x) {
B pick_ucw(B t, B o, B w, B x) {
if (isArr(w) || isAtm(x) || rnk(x)!=1) return def_fn_ucw(t, o, w, x);
usz xia = a(x)->ia;
i64 wi = o2i64(w);
if (wi<0) wi+= (i64)xia;
if ((u64)wi >= xia) thrF("𝔽⌾(n⊸⊑)𝕩: reading out-of-bounds (n≡%R, %s≡≠𝕩)", w, xia);
usz wi = WRAP(o2i64(w), xia, thrF("𝔽⌾(n⊸⊑)𝕩: reading out-of-bounds (n≡%R, %s≡≠𝕩)", w, xia));
B arg = TI(x).get(x, wi);
B rep = c1(o, arg);
if (reusable(x) && TI(x).canStore(rep)) {
@ -794,7 +782,7 @@ B select_ucw(B t, B o, B w, B x) {
i32* xp = i32arr_ptr(x);
i32* rp = i32any_ptr(rep);
for (usz i = 0; i < wia; i++) {
i64 cw = wp[i]; if (cw<0) cw+= (i64)xia;
i64 cw = wp[i]; if (cw<0) cw+= (i64)xia; // already checked
i32 cr = rp[i];
EQ(cr!=xp[cw]);
xp[cw] = cr;
@ -819,7 +807,7 @@ B select_ucw(B t, B o, B w, B x) {
mut_copy(r, 0, x, 0, xia);
BS2B rget = TI(rep).get;
for (usz i = 0; i < wia; i++) {
i64 cw = wp[i]; if (cw<0) cw+= (i64)xia; // oob already checked by original select_c2 call
i64 cw = wp[i]; if (cw<0) cw+= (i64)xia;
B cr = rget(rep, i);
EQ(!equal(mut_getU(r, cw), cr));
mut_rm(r, cw);
@ -832,7 +820,7 @@ B select_ucw(B t, B o, B w, B x) {
mut_copy(r, 0, x, 0, xia);
BS2B rget = TI(rep).get;
for (usz i = 0; i < wia; i++) {
i64 cw = o2i64u(wgetU(w, i)); if (cw<0) cw+= (i64)xia; // oob already checked by original select_c2 call
i64 cw = o2i64u(wgetU(w, i)); if (cw<0) cw+= (i64)xia;
B cr = rget(rep, i);
EQ(!equal(mut_getU(r, cw), cr));
mut_rm(r, cw);

View File

@ -52,6 +52,7 @@ static void decSh(Value* x) { if (prnk(x)>1) ptr_dec(shObjP(x)); }
// some array stuff
#define WRAP(X,IA,MSG) ({ i64 wV=(i64)(X); u64 iaW=(IA); if(RARE((u64)wV >= iaW)) { if(wV<0) wV+= iaW; if((u64)wV >= iaW) MSG; }; (usz)wV; })
static void arr_shVec(B x, usz ia) {
a(x)->ia = ia;
srnk(x, 1);