clear in-use items in in-place each
This commit is contained in:
parent
a3e78e651e
commit
db7b0cc323
15
src/sfns.c
15
src/sfns.c
@ -4,7 +4,8 @@ typedef struct BFn {
|
|||||||
struct Fun;
|
struct Fun;
|
||||||
B ident;
|
B ident;
|
||||||
} BFn;
|
} BFn;
|
||||||
|
static inline B mv(B* p, usz n) { B r = p [n]; p [n] = m_f64(0); return r; }
|
||||||
|
static inline B hmv(HArr_p p, usz n) { B r = p.a[n]; p.a[n] = m_f64(0); return r; }
|
||||||
B eachd_fn(BBB2B f, B fo, B w, B x) { // consumes w,x; assumes at least one is array
|
B eachd_fn(BBB2B f, B fo, B w, B x) { // consumes w,x; assumes at least one is array
|
||||||
if (!isArr(w)) w = m_hunit(w);
|
if (!isArr(w)) w = m_hunit(w);
|
||||||
if (!isArr(x)) x = m_hunit(x);
|
if (!isArr(x)) x = m_hunit(x);
|
||||||
@ -24,12 +25,12 @@ B eachd_fn(BBB2B f, B fo, B w, B x) { // consumes w,x; assumes at least one is a
|
|||||||
if (rw|rx && (wr==xr | rm==0)) {
|
if (rw|rx && (wr==xr | rm==0)) {
|
||||||
HArr_p r = harr_parts(rw? w : x);
|
HArr_p r = harr_parts(rw? w : x);
|
||||||
usz ria = r.c->ia;
|
usz ria = r.c->ia;
|
||||||
if (wr==0) { B c=wget(w, 0); for(usz i = 0; i < ria; i++) r.a[i] = f(fo, inc(c), r.a[i]); dec(c); }
|
if (wr==0) { B c=wget(w, 0); for(usz i = 0; i < ria; i++) r.a[i] = f(fo, inc(c), hmv(r,i)); dec(c); }
|
||||||
else if (xr==0) { B c=xget(x, 0); for(usz i = 0; i < ria; i++) r.a[i] = f(fo, r.a[i], inc(c)); dec(c); }
|
else if (xr==0) { B c=xget(x, 0); for(usz i = 0; i < ria; i++) r.a[i] = f(fo, hmv(r,i), inc(c) ); dec(c); }
|
||||||
else {
|
else {
|
||||||
assert(wr==xr);
|
assert(wr==xr);
|
||||||
if (rw) for (usz i = 0; i < ria; i++) r.a[i] = f(fo, r.a[i], xget(x,i));
|
if (rw) for (usz i = 0; i < ria; i++) r.a[i] = f(fo, hmv(r,i), xget(x,i));
|
||||||
else for (usz i = 0; i < ria; i++) r.a[i] = f(fo, wget(w,i), r.a[i]);
|
else for (usz i = 0; i < ria; i++) r.a[i] = f(fo, wget(w,i), hmv(r,i));
|
||||||
}
|
}
|
||||||
dec(rw? x : w);
|
dec(rw? x : w);
|
||||||
return r.b;
|
return r.b;
|
||||||
@ -65,7 +66,7 @@ B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array
|
|||||||
B* xp = harr_ptr(x);
|
B* xp = harr_ptr(x);
|
||||||
if (reuse) {
|
if (reuse) {
|
||||||
dec(xp[i]); xp[i++] = cr;
|
dec(xp[i]); xp[i++] = cr;
|
||||||
for (; i < ia; i++) xp[i] = f(fo, xp[i]);
|
for (; i < ia; i++) xp[i] = f(fo, mv(xp,i));
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
rH = m_harrs(ia, &i);
|
rH = m_harrs(ia, &i);
|
||||||
@ -113,7 +114,7 @@ B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array
|
|||||||
dec(c(FillArr,x)->fill);
|
dec(c(FillArr,x)->fill);
|
||||||
c(FillArr,x)->fill = bi_noFill;
|
c(FillArr,x)->fill = bi_noFill;
|
||||||
dec(xp[i]); xp[i++] = cr;
|
dec(xp[i]); xp[i++] = cr;
|
||||||
for (; i < ia; i++) xp[i] = f(fo, xp[i]);
|
for (; i < ia; i++) xp[i] = f(fo, mv(xp,i));
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
HArr_p rp = m_harrs(ia, &i);
|
HArr_p rp = m_harrs(ia, &i);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user