use getU more

This commit is contained in:
dzaima 2021-04-26 11:45:12 +03:00
parent 76dbabb03d
commit 271479c511
7 changed files with 25 additions and 33 deletions

View File

@ -60,10 +60,10 @@ bool c32arr_canStore(B x) { return isC32(x); }
bool eqStr(B w, u32* x) {
if (!isArr(w) || rnk(w)!=1) return false;
BS2B wget = TI(w).get;
BS2B wgetU = TI(w).getU;
u64 i = 0;
while (x[i]) {
B c = wget(w, i);
B c = wgetU(w, i);
if (!isC32(c) || x[i]!=(u32)c.u) return false;
i++;
}

View File

@ -316,7 +316,7 @@ B m_i32(i32 n) { return m_f64(n); }
B m_error() { return tag(4, TAG_TAG); }
B m_usz(usz n) { return n==(i32)n? m_i32(n) : m_f64(n); }
i32 o2i (B x) { if ((i32)x.f!=x.f) thrM("Expected integer"); return (i32)x.f; }
i32 o2i (B x) { if ((i32)x.f!=x.f) thrM("Expected integer"); return (i32)x.f; } // i have no clue whether these consume or not, but it doesn't matter
usz o2s (B x) { if ((usz)x.f!=x.f) thrM("Expected integer"); return (usz)x.f; }
i64 o2i64 (B x) { if ((i64)x.f!=x.f) thrM("Expected integer"); return (i64)x.f; }
f64 o2f (B x) { if (!isNum(x)) thrM("Expected integer"); return x.f; }

View File

@ -38,8 +38,8 @@ I32Arr* toI32Arr(B x) {
B r = m_i32arrc(x);
i32* rp = i32arr_ptr(r);
usz ia = a(r)->ia;
BS2B xget = TI(x).get;
for (usz i = 0; i < ia; i++) rp[i] = o2i(xget(x,i));
BS2B xgetU = TI(x).get;
for (usz i = 0; i < ia; i++) rp[i] = o2i(xgetU(x,i));
dec(x);
return c(I32Arr,r);
}

View File

@ -19,15 +19,14 @@ B tbl_c2(B d, B w, B x) { B f = c(Md1D,d)->f;
memcpy(rsh+wr, a(x)->sh, xr*sizeof(usz));
}
BS2B wget = TI(w).get;
BS2B wgetU = TI(w).getU;
BS2B xget = TI(x).get;
usz ri = 0;
for (usz wi = 0; wi < wia; wi++) {
B cw = wget(w,wi);
B cw = wgetU(w,wi);
for (usz xi = 0; xi < xia; xi++) {
r.a[ri++] = c2(f, inc(cw), xget(x,xi));
}
dec(cw);
}
dec(w); dec(x);
return r.b;

View File

@ -74,9 +74,9 @@ void printRaw(B x) {
else err("bad printRaw argument: atom arguments should be either numerical or characters");
} else {
usz ia = a(x)->ia;
BS2B xget = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) {
B c = xget(x,i);
B c = xgetU(x,i);
if (c.u==0 || noFill(c)) { printf(" "); continue; }
if (!isC32(c)) err("bad printRaw argument: expected all character items");
printUTF8((u32)c.u);
@ -92,14 +92,9 @@ bool equal(B w, B x) { // doesn't consume
if (!wa) return o2iu(eq_c2(bi_N, inc(w), inc(x)))?1:0;
if (!eqShape(w,x)) return false;
usz ia = a(x)->ia;
BS2B xget = TI(x).get;
BS2B wget = TI(w).get;
for (usz i = 0; i < ia; i++) {
B wc=wget(w,i); B xc=xget(x,i); // getdec
bool eq=equal(wc,xc);
decR(wc); decR(xc);
if(!eq) return false;
}
BS2B xgetU = TI(x).getU;
BS2B wgetU = TI(w).getU;
for (usz i = 0; i < ia; i++) if(!equal(wgetU(w,i),xgetU(x,i))) return false;
return true;
}

View File

@ -50,16 +50,16 @@ B fill_c2(B t, B w, B x) { // TODO not set fill for typed arrays
B grLen_c1(B t, B x) {
i64 ria = -1;
usz ia = a(x)->ia;
BS2B xget = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) {
i64 c = o2i64(xget(x, i));
i64 c = o2i64(xgetU(x, i));
if (c>ria) ria = c;
}
ria++;
HArr_p r = m_harrv(ria);
for (usz i = 0; i < ria; i++) r.a[i] = m_f64(0);
for (usz i = 0; i < ia; i++) {
i64 n = o2i64(xget(x, i));
i64 n = o2i64(xgetU(x, i));
if (n>=0) r.a[n].f++;
}
dec(x);
@ -68,16 +68,16 @@ B grLen_c1(B t, B x) {
B grLen_c2(B t, B w, B x) {
i64 ria = o2i64(w)-1;
usz ia = a(x)->ia;
BS2B xget = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) {
i64 c = o2i64(xget(x, i));
i64 c = o2i64(xgetU(x, i));
if (c>ria) ria = c;
}
ria++;
HArr_p r = m_harrv(ria);
for (usz i = 0; i < ria; i++) r.a[i] = m_f64(0);
for (usz i = 0; i < ia; i++) {
i64 n = o2i64(xget(x, i));
i64 n = o2i64(xgetU(x, i));
if (n>=0) r.a[n].f++;
}
dec(x);
@ -89,15 +89,15 @@ B grOrd_c2(B t, B w, B x) {
usz xia = a(x)->ia;
if (wia==0) { dec(w); dec(x); return c1(bi_ud, m_i32(0)); }
if (xia==0) { dec(w); return x; }
BS2B wget = TI(w).get;
BS2B xget = TI(x).get;
BS2B wgetU = TI(w).getU;
BS2B xgetU = TI(x).getU;
usz tmp[wia];
tmp[0] = 0;
for (int i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2s(wget(w,i-1));
usz ria = tmp[wia-1]+o2s(wget(w,wia-1));
for (int i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2s(wgetU(w,i-1));
usz ria = tmp[wia-1]+o2s(wgetU(w,wia-1));
HArr_p r = m_harrv(ria);
for (usz i = 0; i < xia; i++) {
i64 c = o2i64(xget(x,i));
i64 c = o2i64(xgetU(x,i));
if (c>=0) r.a[tmp[c]++] = m_usz(i);
}
dec(w);

View File

@ -222,11 +222,9 @@ void v_set(Scope* sc, B s, B x, bool upd) { // frees s, doesn't consume x
if (!eqShape(s, x)) err("spread assignment: mismatched shape");
usz ia = a(x)->ia;
B* sp = harr_ptr(s);
BS2B xget = TI(x).get;
BS2B xgetU = TI(x).getU;
for (u64 i = 0; i < ia; i++) {
B c = xget(x,i);
v_set(sc, sp[i], c, upd);
decR(c); // should never free actually
v_set(sc, sp[i], xgetU(x,i), upd);
}
dec(s);
}