return Arr* from m_fillarrp
This commit is contained in:
parent
08df9bfe7b
commit
ceb967bbd4
@ -54,11 +54,11 @@ B ud_c1(B t, B x) {
|
||||
}
|
||||
dec(x);
|
||||
|
||||
B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
B* rp = fillarr_ptr(r);
|
||||
for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors
|
||||
|
||||
usz* rsh = arr_shAllocI(a(r), ria, xia);
|
||||
usz* rsh = arr_shAllocI(r, ria, xia);
|
||||
if (rsh) memcpy(rsh, sh, sizeof(usz)*xia);
|
||||
|
||||
usz pos[xia]; B* crp = rp;
|
||||
@ -70,7 +70,7 @@ B ud_c1(B t, B x) {
|
||||
fillarr_setFill(r, m_i32arrv(&fp, xia));
|
||||
for (usz i = 0; i < xia; i++) fp[i] = 0;
|
||||
}
|
||||
return r;
|
||||
return taga(r);
|
||||
}
|
||||
|
||||
extern B rt_ud;
|
||||
|
||||
@ -182,10 +182,11 @@ B variation_c2(B t, B w, B x) {
|
||||
else for (usz i = 0; i < xia; i++) t.a[i] = xget(x,i);
|
||||
res = t.b;
|
||||
} else if (u32_get(&wp, wpE, U"f")) {
|
||||
res = m_fillarrp(xia);
|
||||
fillarr_setFill(res, getFillQ(x));
|
||||
arr_shCopy(a(res), x);
|
||||
B* rp = fillarr_ptr(res);
|
||||
Arr* t = m_fillarrp(xia);
|
||||
res = taga(t);
|
||||
fillarr_setFill(t, getFillQ(x));
|
||||
arr_shCopy(t, x);
|
||||
B* rp = fillarr_ptr(t);
|
||||
if (xe==el_i32) { i32* xp=i32any_ptr(x); for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); }
|
||||
else if (xe==el_f64) { f64* xp=f64any_ptr(x); for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); }
|
||||
else for (usz i = 0; i < xia; i++) rp[i] = xget(x,i);
|
||||
@ -243,11 +244,11 @@ static B unshare(B x) {
|
||||
return r.b;
|
||||
}
|
||||
case t_fillarr: {
|
||||
B r = m_fillarrp(xia); arr_shCopy(a(r), x);
|
||||
Arr* r = m_fillarrp(xia); arr_shCopy(r, x);
|
||||
fillarr_setFill(r, unshare(c(FillArr,x)->fill));
|
||||
B* rp = fillarr_ptr(r); B* xp = fillarr_ptr(x);
|
||||
B* rp = fillarr_ptr(r); B* xp = fillarr_ptr(a(x));
|
||||
for (usz i = 0; i < xia; i++) rp[i] = unshare(xp[i]);
|
||||
return r;
|
||||
return taga(r);
|
||||
}
|
||||
default: thrF("•internal.Unshare: Cannot unshare array with type %i=%S", v(x)->type, format_type((v(x)->type)));
|
||||
}
|
||||
|
||||
@ -611,15 +611,15 @@ B group_c2(B t, B w, B x) {
|
||||
for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0;
|
||||
for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) len[n]++; }
|
||||
|
||||
B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
arr_shVec(a(r), ria);
|
||||
Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
arr_shVec(r, ria);
|
||||
B* rp = fillarr_ptr(r);
|
||||
for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors
|
||||
B xf = getFillQ(x);
|
||||
|
||||
B rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0));
|
||||
arr_shVec(a(rf), 0);
|
||||
fillarr_setFill(r, rf);
|
||||
Arr* rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0));
|
||||
arr_shVec(rf, 0);
|
||||
fillarr_setFill(r, taga(rf));
|
||||
if (TI(x).elType==el_i32) {
|
||||
for (usz i = 0; i < ria; i++) { i32* t; rp[i] = m_i32arrv(&t, len[i]); }
|
||||
i32* xp = i32any_ptr(x);
|
||||
@ -636,21 +636,21 @@ B group_c2(B t, B w, B x) {
|
||||
}
|
||||
} else {
|
||||
for (usz i = 0; i < ria; i++) {
|
||||
B c = m_fillarrp(len[i]);
|
||||
Arr* c = m_fillarrp(len[i]);
|
||||
fillarr_setFill(c, inc(xf));
|
||||
a(c)->ia = 0;
|
||||
rp[i] = c;
|
||||
c->ia = 0;
|
||||
rp[i] = taga(c);
|
||||
}
|
||||
BS2B xget = TI(x).get;
|
||||
for (usz i = 0; i < xia; i++) {
|
||||
i32 n = wp[i];
|
||||
if (n>=0) fillarr_ptr(rp[n])[pos[n]++] = xget(x, i);
|
||||
if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i);
|
||||
}
|
||||
for (usz i = 0; i < ria; i++) { arr_shVec(a(rp[i]), len[i]); }
|
||||
}
|
||||
fillarr_setFill(rf, xf);
|
||||
dec(w); dec(x); TFREE(len); TFREE(pos);
|
||||
return r;
|
||||
return taga(r);
|
||||
} else {
|
||||
BS2B wgetU = TI(w).getU;
|
||||
i64 ria = wia==xia? -1 : o2i64(wgetU(w, xia))-1;
|
||||
@ -669,30 +669,30 @@ B group_c2(B t, B w, B x) {
|
||||
if (n>=0) len[n]++;
|
||||
}
|
||||
|
||||
B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
arr_shVec(a(r), ria);
|
||||
Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0));
|
||||
arr_shVec(r, ria);
|
||||
B* rp = fillarr_ptr(r);
|
||||
for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors
|
||||
B xf = getFillQ(x);
|
||||
|
||||
for (usz i = 0; i < ria; i++) {
|
||||
B c = m_fillarrp(len[i]);
|
||||
Arr* c = m_fillarrp(len[i]);
|
||||
fillarr_setFill(c, inc(xf));
|
||||
a(c)->ia = 0;
|
||||
rp[i] = c;
|
||||
c->ia = 0;
|
||||
rp[i] = taga(c);
|
||||
}
|
||||
B rf = m_fillarrp(0);
|
||||
arr_shVec(a(rf), 0);
|
||||
Arr* rf = m_fillarrp(0);
|
||||
arr_shVec(rf, 0);
|
||||
fillarr_setFill(rf, xf);
|
||||
fillarr_setFill(r, rf);
|
||||
fillarr_setFill(r, taga(rf));
|
||||
BS2B xget = TI(x).get;
|
||||
for (usz i = 0; i < xia; i++) {
|
||||
i64 n = o2i64u(wgetU(w, i));
|
||||
if (n>=0) fillarr_ptr(rp[n])[pos[n]++] = xget(x, i);
|
||||
if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i);
|
||||
}
|
||||
for (usz i = 0; i < ria; i++) { arr_shVec(a(rp[i]), len[i]); }
|
||||
dec(w); dec(x); TFREE(len); TFREE(pos);
|
||||
return r;
|
||||
return taga(r);
|
||||
}
|
||||
}
|
||||
base:
|
||||
@ -781,7 +781,7 @@ B pick_ucw(B t, B o, B w, B x) {
|
||||
xp[wi] = o2f(rep);
|
||||
return x;
|
||||
} else if (v(x)->type==t_fillarr) {
|
||||
B* xp = fillarr_ptr(x);
|
||||
B* xp = fillarr_ptr(a(x));
|
||||
dec(xp[wi]);
|
||||
xp[wi] = rep;
|
||||
return x;
|
||||
|
||||
@ -45,7 +45,8 @@ void c32arr_init() {
|
||||
ti[t_c32arr].elType = el_c32; ti[t_c32slice].elType = el_c32;
|
||||
ti[t_c32arr].canStore = c32arr_canStore;
|
||||
u32* tmp; bi_emptyCVec = m_c32arrv(&tmp, 0); gc_add(bi_emptyCVec);
|
||||
bi_emptySVec = m_fillarrp(0); gc_add(bi_emptySVec);
|
||||
arr_shVec(a(bi_emptySVec), 0);
|
||||
fillarr_setFill(bi_emptySVec, inc(bi_emptyCVec));
|
||||
Arr* emptySVec = m_fillarrp(0);
|
||||
arr_shVec(emptySVec, 0);
|
||||
fillarr_setFill(emptySVec, inc(bi_emptyCVec));
|
||||
bi_emptySVec = taga(emptySVec); gc_add(bi_emptySVec);
|
||||
}
|
||||
|
||||
@ -59,14 +59,11 @@ static B getFillE(B x) { // errors if there's no fill
|
||||
}
|
||||
|
||||
|
||||
static B m_fillarrp(usz ia) { // doesn't set ia
|
||||
return taga(mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr));
|
||||
static Arr* m_fillarrp(usz ia) { // doesn't set ia
|
||||
return mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr);
|
||||
}
|
||||
static void fillarr_setFill(B x, B fill) { // consumes fill
|
||||
c(FillArr, x)->fill = fill;
|
||||
}
|
||||
|
||||
static B* fillarr_ptr(B x) { VTY(x,t_fillarr); return c(FillArr,x)->a; }
|
||||
static void fillarr_setFill(Arr* x, B fill) { assert(x->type==t_fillarr); ((FillArr*)x)->fill = fill; } // consumes fill
|
||||
static B* fillarr_ptr(Arr* x) { assert(x->type==t_fillarr); return ((FillArr*)x)->a; }
|
||||
|
||||
|
||||
static B m_unit(B x) {
|
||||
|
||||
@ -422,15 +422,15 @@ B bqn_merge(B x) { // consumes
|
||||
if (isAtm(xf)) { dec(xf); return x; }
|
||||
i32 xfr = rnk(xf);
|
||||
B xff = getFillQ(xf);
|
||||
B r = m_fillarrp(0);
|
||||
Arr* r = m_fillarrp(0);
|
||||
fillarr_setFill(r, xff);
|
||||
if (xr+xfr > UR_MAX) thrM(">: Result rank too large");
|
||||
usz* rsh = arr_shAllocI(a(r), 0, xr+xfr);
|
||||
usz* rsh = arr_shAllocI(r, 0, xr+xfr);
|
||||
if (rsh) {
|
||||
memcpy (rsh , a(x)->sh, xr *sizeof(usz));
|
||||
if(xfr)memcpy(rsh+xr, a(xf)->sh, xfr*sizeof(usz));
|
||||
}
|
||||
return r;
|
||||
return taga(r);
|
||||
}
|
||||
|
||||
BS2B xgetU = TI(x).getU;
|
||||
|
||||
@ -110,7 +110,7 @@ static B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array
|
||||
if (!reuse) dec(x);
|
||||
return r;
|
||||
} else if (v(x)->type==t_fillarr) {
|
||||
B* xp = fillarr_ptr(x);
|
||||
B* xp = fillarr_ptr(a(x));
|
||||
if (reuse) {
|
||||
dec(c(FillArr,x)->fill);
|
||||
c(FillArr,x)->fill = bi_noFill;
|
||||
|
||||
@ -272,7 +272,7 @@ static B vec_join(B w, B x) { // consumes both
|
||||
u8 xt = v(x)->type;
|
||||
u8 xe = TI(x).elType;
|
||||
if (xt==t_harr | xt==t_hslice | xt==t_fillarr) {
|
||||
B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(x);
|
||||
B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(a(x));
|
||||
memcpy(rp, xp, xia*sizeof(B));
|
||||
for (usz i = 0; i < xia; i++) inc(rp[i]);
|
||||
} else if (xe==el_i32) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user