implement arith fills
This commit is contained in:
parent
365caec21b
commit
163888f32a
28
src/arith.c
28
src/arith.c
@ -1,8 +1,32 @@
|
||||
#include "h.h"
|
||||
#include <math.h>
|
||||
|
||||
#define P1(N) { if( isArr(x)) return eachm_fn(N##_c1, bi_N, x); }
|
||||
#define P2(N) { if(isArr(w)|isArr(x)) return eachd_fn(N##_c2, bi_N, w, x); }
|
||||
static inline B arith_recm(BB2B f, B x) {
|
||||
B fx = getFill(inc(x));
|
||||
B r = eachm_fn(f, bi_N, x);
|
||||
return withFill(r, fx);
|
||||
}
|
||||
#ifdef CATCH_ERRORS
|
||||
static inline B arith_recd(BBB2B f, B w, B x) {
|
||||
B fx = getFill(inc(x));
|
||||
if (noFill(fx)) return eachd_fn(f, bi_N, w, x);
|
||||
B fw = getFill(inc(w));
|
||||
B r = eachd_fn(f, bi_N, w, x);
|
||||
if (noFill(fw)) return r;
|
||||
if (CATCH) { dec(catchMessage); return r; }
|
||||
B fr = f(bi_N, fw, fx);
|
||||
popCatch();
|
||||
return withFill(r, asFill(fr));
|
||||
}
|
||||
#else
|
||||
static inline B arith_recd(BBB2B f, B w, B x) {
|
||||
return eachd_fn(f, bi_N, w, x);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define P1(N) { if( isArr(x)) return arith_recm(N##_c1, x); }
|
||||
#define P2(N) { if(isArr(w)|isArr(x)) return arith_recd(N##_c2, w, x); }
|
||||
#define ffnx(name, expr, extra) B name##_c2(B t, B w, B x) { \
|
||||
if (isF64(w) & isF64(x)) return m_f64(expr); \
|
||||
extra \
|
||||
|
||||
@ -85,8 +85,37 @@ static inline void fillarr_init() {
|
||||
ti[t_fillarr].canStore = fillarr_canStore;
|
||||
}
|
||||
|
||||
B m_unit(B x) {
|
||||
B xf = asFill(inc(x));
|
||||
if (noFill(xf)) {
|
||||
HArr_p r = m_harrp(1);
|
||||
arr_shAlloc(r.b, 1, 0);
|
||||
r.a[0] = x;
|
||||
return r.b;
|
||||
}
|
||||
B r = m_arr(fsizeof(FillArr,a,B,1), t_fillarr);
|
||||
arr_shAlloc(r, 1, 0);
|
||||
c(FillArr,r)->fill = xf;
|
||||
c(FillArr,r)->a[0] = x;
|
||||
return r;
|
||||
}
|
||||
|
||||
void validateFill(B x) {
|
||||
if (isArr(x)) {
|
||||
BS2B xgetU = TI(x).getU;
|
||||
usz ia = a(x)->ia;
|
||||
for (usz i = 0; i < ia; i++) validateFill(xgetU(x,i));
|
||||
} else if (isF64(x)) {
|
||||
assert(x.f==0);
|
||||
} else if (isC32(x)) {
|
||||
assert(' '==(u32)x.u);
|
||||
}
|
||||
}
|
||||
B withFill(B x, B fill) { // consumes both
|
||||
assert(isArr(x));
|
||||
#ifdef DEBUG
|
||||
validateFill(fill);
|
||||
#endif
|
||||
if (noFill(fill) && v(x)->type!=t_fillarr && v(x)->type!=t_fillslice) return x;
|
||||
switch(v(x)->type) {
|
||||
case t_i32arr : case t_i32slice : if(fill.u == m_i32(0 ).u) return x; break;
|
||||
|
||||
@ -64,7 +64,6 @@ B m_v1(B a ) { HArr_p r = m_harrv(1); r.a[0] = a;
|
||||
B m_v2(B a, B b ) { HArr_p r = m_harrv(2); r.a[0] = a; r.a[1] = b; return r.b; }
|
||||
B m_v3(B a, B b, B c ) { HArr_p r = m_harrv(3); r.a[0] = a; r.a[1] = b; r.a[2] = c; return r.b; }
|
||||
B m_v4(B a, B b, B c, B d) { HArr_p r = m_harrv(4); r.a[0] = a; r.a[1] = b; r.a[2] = c; r.a[3] = d; return r.b; }
|
||||
B m_unit(B x) { HArr_p r = m_harrp(1); arr_shAlloc(r.b, 1, 0); r.a[0] = x; return r.b; }
|
||||
|
||||
|
||||
typedef struct HSlice {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user