better eachm_fn
This commit is contained in:
parent
5de565f1b0
commit
ec92b1d5ba
119
src/utils/each.c
119
src/utils/each.c
@ -52,86 +52,55 @@ B eachd_fn(B fo, B w, B x, BBB2B f) {
|
|||||||
return any_squeeze(rb);
|
return any_squeeze(rb);
|
||||||
}
|
}
|
||||||
|
|
||||||
B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still has refcounting errors
|
B eachm_fn(B fo, B x, BB2B f) {
|
||||||
usz ia = IA(x);
|
usz ia = IA(x);
|
||||||
if (ia==0) return x;
|
|
||||||
SGet(x);
|
|
||||||
usz i = 0;
|
usz i = 0;
|
||||||
B cr = f(fo, Get(x,0));
|
if (ia==0) return x;
|
||||||
HArr_p rH;
|
if (reusable(x)) {
|
||||||
if (TI(x,canStore)(cr)) {
|
B* xp;
|
||||||
bool reuse = reusable(x);
|
re_reuse:
|
||||||
if (TY(x)==t_harr) {
|
switch (v(x)->type) {
|
||||||
B* xp = harr_ptr(x);
|
case t_fillarr: {
|
||||||
if (reuse) {
|
|
||||||
dec(xp[i]); xp[i++] = cr;
|
|
||||||
for (; i < ia; i++) xp[i] = f(fo, mv(xp,i));
|
|
||||||
return any_squeeze(REUSE(x));
|
|
||||||
} else {
|
|
||||||
M_HARR(rHc, ia)
|
|
||||||
HARR_ADD(rHc, i, cr);
|
|
||||||
for (usz i = 1; i < ia; i++) HARR_ADD(rHc, i, f(fo, inc(xp[i])));
|
|
||||||
return any_squeeze(HARR_FCD(rHc, x));
|
|
||||||
}
|
|
||||||
} else if (TI(x,elType)==el_i32) {
|
|
||||||
i32* xp = i32any_ptr(x);
|
|
||||||
B r; i32* rp;
|
|
||||||
if (reuse && TY(x)==t_i32arr) { r=incG(REUSE(x)); rp = xp; }
|
|
||||||
else r = m_i32arrc(&rp, x);
|
|
||||||
rp[i++] = o2iG(cr);
|
|
||||||
for (; i < ia; i++) {
|
|
||||||
cr = f(fo, m_i32(xp[i]));
|
|
||||||
if (!q_i32(cr)) {
|
|
||||||
rH = m_harr0c(x);
|
|
||||||
COPY_TO(rH.a, el_B, 0, r, 0, i);
|
|
||||||
decG(r);
|
|
||||||
goto fallback;
|
|
||||||
}
|
|
||||||
rp[i] = o2iG(cr);
|
|
||||||
}
|
|
||||||
decG(x);
|
|
||||||
return num_squeeze(r);
|
|
||||||
} else if (TI(x,elType)==el_f64) {
|
|
||||||
f64* xp = f64any_ptr(x);
|
|
||||||
B r; f64* rp;
|
|
||||||
if (reuse && TY(x)==t_f64arr) { r=incG(REUSE(x)); rp = xp; }
|
|
||||||
else r = m_f64arrc(&rp, x);
|
|
||||||
rp[i++] = o2fG(cr);
|
|
||||||
for (; i < ia; i++) {
|
|
||||||
cr = f(fo, m_f64(xp[i]));
|
|
||||||
if (!q_f64(cr)) {
|
|
||||||
rH = m_harr0c(x);
|
|
||||||
COPY_TO(rH.a, el_B, 0, r, 0, i);
|
|
||||||
decG(r);
|
|
||||||
goto fallback;
|
|
||||||
}
|
|
||||||
rp[i] = o2fG(cr);
|
|
||||||
}
|
|
||||||
decG(x);
|
|
||||||
return num_squeeze(r);
|
|
||||||
} else if (TY(x)==t_fillarr) {
|
|
||||||
B* xp = fillarr_ptr(a(x));
|
|
||||||
if (reuse) {
|
|
||||||
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;
|
xp = fillarr_ptr(a(x));
|
||||||
for (; i < ia; i++) xp[i] = f(fo, mv(xp,i));
|
break;
|
||||||
return any_squeeze(REUSE(x));
|
|
||||||
} else {
|
|
||||||
M_HARR(rHc, ia)
|
|
||||||
HARR_ADD(rHc, i, cr);
|
|
||||||
for (usz i = 1; i < ia; i++) HARR_ADD(rHc, i, f(fo, inc(xp[i])));
|
|
||||||
return any_squeeze(HARR_FCD(rHc, x));
|
|
||||||
}
|
}
|
||||||
} else goto m_fallback;
|
case t_harr: {
|
||||||
} else goto m_fallback;
|
xp = harr_ptr(x);
|
||||||
m_fallback:
|
break;
|
||||||
rH = m_harr0c(x);
|
}
|
||||||
fallback:
|
case t_fillslice: {
|
||||||
rH.a[i++] = cr;
|
FillSlice* s = c(FillSlice,x);
|
||||||
for (; i < ia; i++) rH.a[i] = f(fo, Get(x,i));
|
Arr* p = s->p;
|
||||||
decG(x);
|
if (p->refc==1 && (p->type==t_fillarr || p->type==t_harr) && ((FillArr*)p)->a == s->a && p->ia==ia) {
|
||||||
return any_squeeze(rH.b);
|
x = taga(ptr_inc(p));
|
||||||
|
value_free((Value*)s);
|
||||||
|
goto re_reuse;
|
||||||
|
} else goto base;
|
||||||
|
}
|
||||||
|
default: goto base;
|
||||||
|
}
|
||||||
|
for (; i < ia; i++) xp[i] = f(fo, mv(xp, i));
|
||||||
|
return any_squeeze(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
base:;
|
||||||
|
M_HARR(r, ia)
|
||||||
|
void* xp = tyany_ptr(x);
|
||||||
|
switch(TI(x,elType)) { default: UD;
|
||||||
|
case el_B: { SGet(x);
|
||||||
|
for (; i<ia; i++) HARR_ADD(r, i, f(fo, Get(x,i))); break; }
|
||||||
|
case el_bit: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_i32(bitp_get(xp,i)))); break;
|
||||||
|
case el_i8: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_i32(((i8* )xp)[i]))); break;
|
||||||
|
case el_i16: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_i32(((i16*)xp)[i]))); break;
|
||||||
|
case el_i32: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_i32(((i32*)xp)[i]))); break;
|
||||||
|
case el_f64: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_f64(((f64*)xp)[i]))); break;
|
||||||
|
case el_c8: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_c32(((u8* )xp)[i]))); break;
|
||||||
|
case el_c16: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_c32(((u16*)xp)[i]))); break;
|
||||||
|
case el_c32: for (; i<ia; i++) HARR_ADD(r, i, f(fo, m_c32(((u32*)xp)[i]))); break;
|
||||||
|
}
|
||||||
|
return any_squeeze(HARR_FCD(r, x));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CATCH_ERRORS
|
#if CATCH_ERRORS
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user