move init out of mut_to
This commit is contained in:
parent
cf10914d63
commit
ca264d1332
@ -163,7 +163,7 @@ B select_c2(B t, B w, B x) {
|
||||
if (rr>UR_MAX) thrF("⊏: Result rank too large (%i≡=𝕨, %i≡=𝕩)", wr, xr);
|
||||
usz csz = arr_csz(x);
|
||||
usz cam = a(x)->sh[0];
|
||||
MAKE_MUT(r, wia*csz); mut_to(r, TI(x,elType));
|
||||
MAKE_MUT(r, wia*csz); mut_init(r, TI(x,elType));
|
||||
for (usz i = 0; i < wia; i++) {
|
||||
B cw = wgetU(w, i);
|
||||
if (!isNum(cw)) { mut_pfree(r, i*csz); goto base; }
|
||||
@ -349,7 +349,7 @@ B take_c2(B t, B w, B x) {
|
||||
u64 va = v<0? -v : v;
|
||||
if (va>ia) {
|
||||
B xf = getFillE(x);
|
||||
MAKE_MUT(r, va); mut_to(r, TI(x,elType));
|
||||
MAKE_MUT(r, va); mut_init(r, TI(x,elType));
|
||||
mut_copyG(r, v<0? va-ia : 0, x, 0, ia);
|
||||
mut_fill(r, v<0? 0 : ia, xf, va-ia);
|
||||
dec(x); dec(xf);
|
||||
@ -464,7 +464,7 @@ B join_c2(B t, B w, B x) {
|
||||
if (rnk(r)==0) srnk(r,1);
|
||||
return qWithFill(r, f);
|
||||
}
|
||||
MAKE_MUT(r, wia+xia); mut_to(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
MAKE_MUT(r, wia+xia); mut_init(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
mut_copyG(r, 0, w, 0, wia);
|
||||
mut_copyG(r, wia, x, 0, xia);
|
||||
Arr* ra = mut_fp(r);
|
||||
@ -510,7 +510,7 @@ B couple_c2(B t, B w, B x) {
|
||||
if (!eqShape(w, x)) thrF("≍: 𝕨 and 𝕩 must have equal shapes (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x);
|
||||
usz ia = a(w)->ia;
|
||||
ur wr = rnk(w);
|
||||
MAKE_MUT(r, ia*2); mut_to(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
MAKE_MUT(r, ia*2); mut_init(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
mut_copyG(r, 0, w, 0, ia);
|
||||
mut_copyG(r, ia, x, 0, ia);
|
||||
Arr* ra = mut_fp(r);
|
||||
@ -537,7 +537,7 @@ B shiftb_c1(B t, B x) {
|
||||
B xf = getFillE(x);
|
||||
usz csz = arr_csz(x);
|
||||
|
||||
MAKE_MUT(r, ia); mut_to(r, TI(x,elType));
|
||||
MAKE_MUT(r, ia); mut_init(r, TI(x,elType));
|
||||
mut_copyG(r, csz, x, 0, ia-csz);
|
||||
mut_fill(r, 0, xf, csz);
|
||||
return qWithFill(mut_fcd(r, x), xf);
|
||||
@ -549,7 +549,7 @@ B shiftb_c2(B t, B w, B x) {
|
||||
B f = fill_both(w, x);
|
||||
usz wia = a(w)->ia;
|
||||
usz xia = a(x)->ia;
|
||||
MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
MAKE_MUT(r, xia); mut_init(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
int mid = wia<xia? wia : xia;
|
||||
mut_copyG(r, 0 , w, 0, mid);
|
||||
mut_copyG(r, mid, x, 0, xia-mid);
|
||||
@ -563,7 +563,7 @@ B shifta_c1(B t, B x) {
|
||||
if (ia==0) return x;
|
||||
B xf = getFillE(x);
|
||||
usz csz = arr_csz(x);
|
||||
MAKE_MUT(r, ia); mut_to(r, TI(x,elType));
|
||||
MAKE_MUT(r, ia); mut_init(r, TI(x,elType));
|
||||
mut_copyG(r, 0, x, csz, ia-csz);
|
||||
mut_fill(r, ia-csz, xf, csz);
|
||||
return qWithFill(mut_fcd(r, x), xf);
|
||||
@ -575,7 +575,7 @@ B shifta_c2(B t, B w, B x) {
|
||||
B f = fill_both(w, x);
|
||||
usz wia = a(w)->ia;
|
||||
usz xia = a(x)->ia;
|
||||
MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
MAKE_MUT(r, xia); mut_init(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
if (wia < xia) {
|
||||
usz m = xia-wia;
|
||||
mut_copyG(r, 0, x, wia, m);
|
||||
@ -722,7 +722,7 @@ B reverse_c1(B t, B x) {
|
||||
usz cam = a(x)->sh[0];
|
||||
usz rp = 0;
|
||||
usz ip = xia;
|
||||
MAKE_MUT(r, xia); mut_to(r, xe);
|
||||
MAKE_MUT(r, xia); mut_init(r, xe);
|
||||
for (usz i = 0; i < cam; i++) {
|
||||
ip-= csz;
|
||||
mut_copyG(r, rp, x, ip, csz);
|
||||
@ -741,7 +741,7 @@ B reverse_c2(B t, B w, B x) {
|
||||
i64 am = o2i64(w);
|
||||
if ((u64)am >= (u64)cam) { am%= (i64)cam; if(am<0) am+= cam; }
|
||||
am*= csz;
|
||||
MAKE_MUT(r, xia); mut_to(r, TI(x,elType));
|
||||
MAKE_MUT(r, xia); mut_init(r, TI(x,elType));
|
||||
mut_copyG(r, 0, x, am, xia-am);
|
||||
mut_copyG(r, xia-am, x, 0, am);
|
||||
return withFill(mut_fcd(r, x), xf);
|
||||
@ -757,7 +757,7 @@ B pick_uc1(B t, B o, B x) {
|
||||
usz ia = a(x)->ia;
|
||||
B arg = TI(x,get)(x, 0);
|
||||
B rep = c1(o, arg);
|
||||
MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), selfElType(rep)));
|
||||
MAKE_MUT(r, ia); mut_init(r, el_or(TI(x,elType), selfElType(rep)));
|
||||
mut_setG(r, 0, rep);
|
||||
mut_copyG(r, 1, x, 1, ia-1);
|
||||
return qWithFill(mut_fcd(r, x), xf);
|
||||
@ -791,7 +791,7 @@ B pick_ucw(B t, B o, B w, B x) {
|
||||
return x;
|
||||
}
|
||||
}
|
||||
MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), selfElType(rep)));
|
||||
MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), selfElType(rep)));
|
||||
mut_setG(r, wi, rep);
|
||||
mut_copyG(r, 0, x, 0, wi);
|
||||
mut_copyG(r, wi+1, x, wi+1, xia-wi-1);
|
||||
@ -807,7 +807,7 @@ B slash_ucw(B t, B o, B w, B x) {
|
||||
usz argIA = a(arg)->ia;
|
||||
B rep = c1(o, arg);
|
||||
if (isAtm(rep) || rnk(rep)!=1 || a(rep)->ia != argIA) thrF("𝔽⌾(a⊸/)𝕩: Result of 𝔽 must have the same shape as a/𝕩 (expected ⟨%s⟩, got %H)", argIA, rep);
|
||||
MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
MAKE_MUT(r, ia); mut_init(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
BS2B xget = TI(x,get);
|
||||
BS2B rgetU = TI(rep,getU);
|
||||
BS2B rget = TI(rep,get);
|
||||
@ -871,7 +871,7 @@ B select_ucw(B t, B o, B w, B x) {
|
||||
return x;
|
||||
}
|
||||
}
|
||||
MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
mut_copyG(r, 0, x, 0, xia);
|
||||
BS2B rget = TI(rep,get);
|
||||
for (usz i = 0; i < wia; i++) {
|
||||
@ -884,7 +884,7 @@ B select_ucw(B t, B o, B w, B x) {
|
||||
dec(w); dec(rep); FREE_CHECK;
|
||||
return mut_fcd(r, x);
|
||||
}
|
||||
MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
MAKE_MUT(r, xia); mut_init(r, el_or(TI(x,elType), TI(rep,elType)));
|
||||
mut_copyG(r, 0, x, 0, xia);
|
||||
BS2B rget = TI(rep,get);
|
||||
for (usz i = 0; i < wia; i++) {
|
||||
|
||||
@ -1,13 +1,43 @@
|
||||
#include "../core.h"
|
||||
#include "mut.h"
|
||||
|
||||
NOINLINE void mut_to(Mut* m, u8 n) {
|
||||
u8 o = m->type;
|
||||
assert(o!=el_B);
|
||||
if (o==el_MAX) {
|
||||
mut_init(m, n);
|
||||
} else {
|
||||
m->type = n;
|
||||
sprnk(m->val, 1);
|
||||
m->val->sh = &m->val->ia;
|
||||
#ifdef USE_VALGRIND
|
||||
VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if (n==el_B && o==el_f64) { // hack to make toHArr calling f64arr_get not cry about possible sNaN floats
|
||||
usz ia = m->val->ia;
|
||||
f64* p = f64arr_ptr(taga(m->val));
|
||||
for (usz i = 0; i < ia; i++) if (!isF64(b(p[i]))) p[i] = 1.2217638442043777e161; // 0x6161616161616161
|
||||
}
|
||||
#endif
|
||||
switch(n) { default: UD;
|
||||
case el_i32: { I32Arr* t=toI32Arr(taga(m->val)); m->val=(Arr*)t; m->ai32=t->a; return; }
|
||||
case el_f64: { F64Arr* t=toF64Arr(taga(m->val)); m->val=(Arr*)t; m->af64=t->a; return; }
|
||||
case el_c32: { C32Arr* t=toC32Arr(taga(m->val)); m->val=(Arr*)t; m->ac32=t->a; return; }
|
||||
case el_B : { HArr* t=toHArr (taga(m->val)); m->val=(Arr*)t; m->aB =t->a; return; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NOINLINE B vec_addR(B w, B x) {
|
||||
usz wia = a(w)->ia;
|
||||
MAKE_MUT(r, wia+1); mut_to(r, el_or(TI(w,elType), selfElType(x)));
|
||||
MAKE_MUT(r, wia+1); mut_init(r, el_or(TI(w,elType), selfElType(x)));
|
||||
mut_copyG(r, 0, w, 0, wia);
|
||||
mut_setG(r, wia, x);
|
||||
dec(w);
|
||||
return mut_fv(r);
|
||||
}
|
||||
|
||||
NOINLINE void mut_pfree(Mut* m, usz n) { // free the first n elements
|
||||
if (m->type==el_B) harr_pfree(taga(m->val), n);
|
||||
else mm_free((Value*) m->val);
|
||||
|
||||
@ -13,38 +13,16 @@ typedef struct Mut {
|
||||
} Mut;
|
||||
#define MAKE_MUT(N, IA) Mut N##_val; N##_val.type = el_MAX; N##_val.ia = (IA); Mut* N = &N##_val;
|
||||
|
||||
static void mut_to(Mut* m, u8 n) {
|
||||
u8 o = m->type;
|
||||
assert(o!=el_B);
|
||||
static void mut_init(Mut* m, u8 n) {
|
||||
m->type = n;
|
||||
if (o==el_MAX) {
|
||||
switch(n) { default: UD;
|
||||
case el_i32: m->val = m_i32arrp(&m->ai32, m->ia); return;
|
||||
case el_f64: m->val = m_f64arrp(&m->af64, m->ia); return;
|
||||
case el_c32: m->val = m_c32arrp(&m->ac32, m->ia); return;
|
||||
case el_B :; HArr_p t = m_harrUp( m->ia); m->val = (Arr*)t.c; m->aB = t.c->a; return;
|
||||
}
|
||||
} else {
|
||||
sprnk(m->val, 1);
|
||||
m->val->sh = &m->val->ia;
|
||||
#ifdef USE_VALGRIND
|
||||
VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if (n==el_B && o==el_f64) { // hack to make toHArr calling f64arr_get not cry about possible sNaN floats
|
||||
usz ia = m->val->ia;
|
||||
f64* p = f64arr_ptr(taga(m->val));
|
||||
for (usz i = 0; i < ia; i++) if (!isF64(b(p[i]))) p[i] = 1.2217638442043777e161; // 0x6161616161616161
|
||||
}
|
||||
#endif
|
||||
switch(n) { default: UD;
|
||||
case el_i32: { I32Arr* t=toI32Arr(taga(m->val)); m->val=(Arr*)t; m->ai32=t->a; return; }
|
||||
case el_f64: { F64Arr* t=toF64Arr(taga(m->val)); m->val=(Arr*)t; m->af64=t->a; return; }
|
||||
case el_c32: { C32Arr* t=toC32Arr(taga(m->val)); m->val=(Arr*)t; m->ac32=t->a; return; }
|
||||
case el_B : { HArr* t=toHArr (taga(m->val)); m->val=(Arr*)t; m->aB =t->a; return; }
|
||||
}
|
||||
switch(n) { default: UD;
|
||||
case el_i32: m->val = m_i32arrp(&m->ai32, m->ia); return;
|
||||
case el_f64: m->val = m_f64arrp(&m->af64, m->ia); return;
|
||||
case el_c32: m->val = m_c32arrp(&m->ac32, m->ia); return;
|
||||
case el_B :; HArr_p t = m_harrUp( m->ia); m->val = (Arr*)t.c; m->aB = t.c->a; return;
|
||||
}
|
||||
}
|
||||
void mut_to(Mut* m, u8 n);
|
||||
|
||||
static B mut_fv(Mut* m) { assert(m->type!=el_MAX);
|
||||
m->val->sh = &m->val->ia;
|
||||
@ -373,7 +351,7 @@ static B vec_join(B w, B x) { // consumes both
|
||||
return w;
|
||||
}
|
||||
}
|
||||
MAKE_MUT(r, ria); mut_to(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
MAKE_MUT(r, ria); mut_init(r, el_or(TI(w,elType), TI(x,elType)));
|
||||
mut_copy(r, 0, w, 0, wia);
|
||||
mut_copy(r, wia, x, 0, xia);
|
||||
dec(w); dec(x);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user