saner comparison code
This commit is contained in:
parent
ffc4cec1ae
commit
85f8a5e7bd
@ -4,65 +4,57 @@
|
||||
|
||||
#define P2(N) { if(isArr(w)|isArr(x)) return arith_recd(N##_c2, w, x); }
|
||||
|
||||
#define AL(X) i8* rp; B r = m_i8arrc(&rp, X);
|
||||
|
||||
#define CMP_IMPL(CHR,OP,FC,CF) \
|
||||
if (isF64(w)&isF64(x)) return m_i32(w.f OP x.f); \
|
||||
if (isC32(w)&isC32(x)) return m_i32(w.u OP x.u); \
|
||||
if (isF64(w)&isC32(x)) return m_i32(FC); \
|
||||
if (isC32(w)&isF64(x)) return m_i32(CF); \
|
||||
bool wa = isArr(w); \
|
||||
bool xa = isArr(x); \
|
||||
if (wa|xa && (!wa|!xa || rnk(w)==rnk(x))) { \
|
||||
if (wa&xa && !eqShape(w, x)) thrF(CHR": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \
|
||||
u8 we = wa? TI(w,elType) : selfElType(w); \
|
||||
u8 xe = xa? TI(x,elType) : selfElType(x); \
|
||||
if (we==el_i8 && xe==el_i8) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; /* (i8)o2iu safe bc _e==el_i8 */ \
|
||||
if (!wa) { i8 wv=o2iu(w); i8* xp=i8any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wv OP xp[i]; } \
|
||||
else if (!xa) { i8 xv=o2iu(x); i8* wp=i8any_ptr(w); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xv; } \
|
||||
else { i8* wp=i8any_ptr(w); i8* xp=i8any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; } \
|
||||
if(wa) dec(w); if(xa) dec(x); return r; \
|
||||
} \
|
||||
if (we==el_i16 && xe==el_i16) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
if (!wa) { i16 wv=o2iu(w); i16* xp=i16any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wv OP xp[i]; } \
|
||||
else if (!xa) { i16 xv=o2iu(x); i16* wp=i16any_ptr(w); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xv; } \
|
||||
else { i16* wp=i16any_ptr(w); i16* xp=i16any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; } \
|
||||
if(wa) dec(w); if(xa) dec(x); return r; \
|
||||
} \
|
||||
if (we==el_i32 && xe==el_i32) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
if (!wa) { i32 wv=o2iu(w); i32* xp=i32any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wv OP xp[i]; } \
|
||||
else if (!xa) { i32 xv=o2iu(x); i32* wp=i32any_ptr(w); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xv; } \
|
||||
else { i32* wp=i32any_ptr(w); i32* xp=i32any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; } \
|
||||
if(wa) dec(w); if(xa) dec(x); return r; \
|
||||
} \
|
||||
if ((we==el_f64||isNum(w)) && (xe==el_f64||isNum(x))) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
if (!wa) { f64 wv=o2fu(w); f64* xp=f64any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wv OP xp[i]; } \
|
||||
else if (!xa) { f64 xv=o2fu(x); f64* wp=f64any_ptr(w); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xv; } \
|
||||
else { f64* wp=f64any_ptr(w); f64* xp=f64any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; } \
|
||||
if(wa) dec(w); if(xa) dec(x); return r; \
|
||||
} \
|
||||
if (we==el_c32 && xe==el_c32) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
if (!wa) { u32 wv=o2cu(w); u32* xp=c32any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wv OP xp[i]; } \
|
||||
else if (!xa) { u32 xv=o2cu(x); u32* wp=c32any_ptr(w); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xv; } \
|
||||
else { u32* wp=c32any_ptr(w); u32* xp=c32any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; } \
|
||||
if(wa) dec(w); if(xa) dec(x); return r; \
|
||||
} \
|
||||
if (wa&xa) { \
|
||||
if (we==el_f64 && xe==el_i32) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
f64* wp=f64any_ptr(w); i32* xp=i32any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; \
|
||||
dec(w); dec(x); return r; \
|
||||
} \
|
||||
if (we==el_i32 && xe==el_f64) { \
|
||||
i8* rp; B r = m_i8arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \
|
||||
i32* wp=i32any_ptr(w); f64* xp=f64any_ptr(x); for(usz i=0;i<ria;i++)rp[i]=wp[i] OP xp[i]; \
|
||||
dec(w); dec(x); return r; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
if (isArr(w)) { u8 we = TI(w,elType); \
|
||||
if (we==el_B) goto end; \
|
||||
if (isArr(x)) { u8 xe = TI(x,elType); \
|
||||
if (xe==el_B) goto end; \
|
||||
if (rnk(w)==rnk(x)) { if (!eqShape(w, x)) thrF(CHR": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \
|
||||
if (we==xe) { AL(x) usz ria=a(r)->ia; \
|
||||
switch(we) { default: UD; \
|
||||
case el_i8 : { i8* wp=i8any_ptr (w); i8* xp=i8any_ptr (x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_i16: { i16* wp=i16any_ptr(w); i16* xp=i16any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_i32: { i32* wp=i32any_ptr(w); i32* xp=i32any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_c8 : { u8* wp=c8any_ptr (w); u8* xp=c8any_ptr (x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_c16: { u16* wp=c16any_ptr(w); u16* xp=c16any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_c32: { u32* wp=c32any_ptr(w); u32* xp=c32any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
case el_f64: { f64* wp=f64any_ptr(w); f64* xp=f64any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xp[i]; break; } \
|
||||
} \
|
||||
dec(w);dec(x); return r; \
|
||||
} \
|
||||
} \
|
||||
} else { AL(w) usz ria=a(r)->ia; \
|
||||
switch(we) { default: UD; \
|
||||
case el_i8: { if (!q_i8 (x)) break; i8 xv=o2iu(x); i8* wp=i8any_ptr (w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_i16: { if (!q_i16(x)) break; i16 xv=o2iu(x); i16* wp=i16any_ptr(w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_i32: { if (!q_i32(x)) break; i32 xv=o2iu(x); i32* wp=i32any_ptr(w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_c8: { if (!q_c8 (x)) break; u8 xv=o2cu(x); u8* wp=c8any_ptr (w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_c16: { if (!q_c16(x)) break; u16 xv=o2cu(x); u16* wp=c16any_ptr(w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_c32: { if (!q_c32(x)) break; u32 xv=o2cu(x); u32* wp=c32any_ptr(w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
case el_f64: { if (!q_f64(x)) break; f64 xv=o2fu(x); f64* wp=f64any_ptr(w); for(usz i=0;i<ria;i++) rp[i]=wp[i] OP xv; dec(w); return r; } \
|
||||
} \
|
||||
dec(r); \
|
||||
} \
|
||||
} else if (isArr(x)) { u8 xe = TI(x,elType); if (xe==el_B) goto end; \
|
||||
AL(x) usz ria=a(r)->ia; \
|
||||
switch(xe) { default: UD; \
|
||||
case el_i8: { if (!q_i8 (w)) break; i8 wv=o2iu(w); i8* xp=i8any_ptr (x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_i16: { if (!q_i16(w)) break; i16 wv=o2iu(w); i16* xp=i16any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_i32: { if (!q_i32(w)) break; i32 wv=o2iu(w); i32* xp=i32any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_c8: { if (!q_c8 (w)) break; u8 wv=o2cu(w); u8* xp=c8any_ptr (x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_c16: { if (!q_c16(w)) break; u16 wv=o2cu(w); u16* xp=c16any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_c32: { if (!q_c32(w)) break; u32 wv=o2cu(w); u32* xp=c32any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
case el_f64: { if (!q_f64(w)) break; f64 wv=o2fu(w); f64* xp=f64any_ptr(x); for(usz i=0;i<ria;i++) rp[i]=wv OP xp[i]; dec(x); return r; } \
|
||||
} \
|
||||
dec(r); \
|
||||
} \
|
||||
end:;
|
||||
|
||||
#define CMP(CHR,NAME,OP,FC,CF) \
|
||||
B NAME##_c2(B t, B w, B x) { \
|
||||
|
||||
@ -86,50 +86,33 @@ void mut_pfree(Mut* m, usz n);
|
||||
|
||||
static void mut_set(Mut* m, usz ms, B x) { // consumes x; sets m[ms] to x
|
||||
again:;
|
||||
u8 nty;
|
||||
switch(m->type) { default: UD;
|
||||
case el_MAX:
|
||||
nty = isF64(x)? (q_i32(x)? el_i32 : el_f64) : (isC32(x)? el_c32 : el_B);
|
||||
goto change;
|
||||
|
||||
case el_i32: {
|
||||
if (!q_i32(x)) { nty = isF64(x)? el_f64 : el_B; goto change; }
|
||||
m->ai32[ms] = o2iu(x);
|
||||
return;
|
||||
}
|
||||
case el_c32: {
|
||||
if (!isC32(x)) { nty = el_B; goto change; }
|
||||
m->ac32[ms] = o2cu(x);
|
||||
return;
|
||||
}
|
||||
case el_f64: {
|
||||
if (!isF64(x)) { nty = el_B; goto change; }
|
||||
m->af64[ms] = o2fu(x);
|
||||
return;
|
||||
}
|
||||
case el_MAX: goto change;
|
||||
case el_i8: if (!q_i8 (x)) goto change; m->ai8 [ms] = o2iu(x); return;
|
||||
case el_i16: if (!q_i16(x)) goto change; m->ai16[ms] = o2iu(x); return;
|
||||
case el_i32: if (!q_i32(x)) goto change; m->ai32[ms] = o2iu(x); return;
|
||||
case el_c8: if (!q_c8 (x)) goto change; m->ac8 [ms] = o2cu(x); return;
|
||||
case el_c16: if (!q_c16(x)) goto change; m->ac16[ms] = o2cu(x); return;
|
||||
case el_c32: if (!q_c32(x)) goto change; m->ac32[ms] = o2cu(x); return;
|
||||
case el_f64: if (!q_f64(x)) goto change; m->af64[ms] = o2fu(x); return;
|
||||
case el_B: {
|
||||
m->aB[ms] = x;
|
||||
return;
|
||||
}
|
||||
}
|
||||
change:
|
||||
mut_to(m, nty);
|
||||
mut_to(m, el_or(m->type, selfElType(x)));
|
||||
goto again;
|
||||
}
|
||||
static void mut_setG(Mut* m, usz ms, B x) { // consumes; sets m[ms] to x, assumes the current type can store it
|
||||
switch(m->type) { default: UD;
|
||||
case el_i32: { assert(q_i32(x));
|
||||
m->ai32[ms] = o2iu(x);
|
||||
return;
|
||||
}
|
||||
case el_c32: { assert(isC32(x));
|
||||
m->ac32[ms] = o2cu(x);
|
||||
return;
|
||||
}
|
||||
case el_f64: { assert(isF64(x));
|
||||
m->af64[ms] = o2fu(x);
|
||||
return;
|
||||
}
|
||||
case el_i8 : { assert(q_i8 (x)); m->ai8 [ms] = o2iu(x); return; }
|
||||
case el_i16: { assert(q_i16(x)); m->ai16[ms] = o2iu(x); return; }
|
||||
case el_i32: { assert(q_i32(x)); m->ai32[ms] = o2iu(x); return; }
|
||||
case el_c8 : { assert(q_c8 (x)); m->ac8 [ms] = o2cu(x); return; }
|
||||
case el_c16: { assert(q_c16(x)); m->ac16[ms] = o2cu(x); return; }
|
||||
case el_c32: { assert(q_c32(x)); m->ac32[ms] = o2cu(x); return; }
|
||||
case el_f64: { assert(q_f64(x)); m->af64[ms] = o2fu(x); return; }
|
||||
case el_B: {
|
||||
m->aB[ms] = x;
|
||||
return;
|
||||
@ -141,7 +124,11 @@ static void mut_rm(Mut* m, usz ms) { // clears the object at position ms
|
||||
}
|
||||
static B mut_getU(Mut* m, usz ms) {
|
||||
switch(m->type) { default: UD;
|
||||
case el_i8: return m_i32(m->ai8 [ms]);
|
||||
case el_i16: return m_i32(m->ai16[ms]);
|
||||
case el_i32: return m_i32(m->ai32[ms]);
|
||||
case el_c8: return m_c32(m->ac8 [ms]);
|
||||
case el_c16: return m_c32(m->ac16[ms]);
|
||||
case el_c32: return m_c32(m->ac32[ms]);
|
||||
case el_f64: return m_f64(m->af64[ms]);
|
||||
case el_B: return m->aB[ms];
|
||||
|
||||
Loading…
Reference in New Issue
Block a user