special-case appending atoms with ∾
This commit is contained in:
parent
3ad82faadd
commit
ff2af490b8
@ -392,9 +392,15 @@ B join_c1(B t, B x) {
|
|||||||
return c1(rt_join, x);
|
return c1(rt_join, x);
|
||||||
}
|
}
|
||||||
B join_c2(B t, B w, B x) {
|
B join_c2(B t, B w, B x) {
|
||||||
|
if (isAtm(w)) w = m_atomUnit(w);
|
||||||
|
ur wr = rnk(w);
|
||||||
|
if (isAtm(x)) {
|
||||||
|
if (wr==1 && inplace_add(w, x)) return w;
|
||||||
|
x = m_atomUnit(x);
|
||||||
|
}
|
||||||
|
usz wia = a(w)->ia; usz* wsh = a(w)->sh;
|
||||||
|
usz xia = a(x)->ia; usz* xsh = a(x)->sh; ur xr = rnk(x);
|
||||||
B f = fill_both(w, x);
|
B f = fill_both(w, x);
|
||||||
if (isAtm(w)) w = m_atomUnit(w); ur wr = rnk(w); usz wia = a(w)->ia; usz* wsh = a(w)->sh;
|
|
||||||
if (isAtm(x)) x = m_atomUnit(x); ur xr = rnk(x); usz xia = a(x)->ia; usz* xsh = a(x)->sh;
|
|
||||||
ur c = wr>xr?wr:xr;
|
ur c = wr>xr?wr:xr;
|
||||||
if (c==0) {
|
if (c==0) {
|
||||||
HArr_p r = m_harrUv(2);
|
HArr_p r = m_harrUv(2);
|
||||||
|
|||||||
@ -72,10 +72,8 @@ NOINLINE bool fillEqualR(B w, B x) { // doesn't consume; both args must be array
|
|||||||
u8 we = TI(w).elType;
|
u8 we = TI(w).elType;
|
||||||
u8 xe = TI(x).elType;
|
u8 xe = TI(x).elType;
|
||||||
if (we!=el_B && xe!=el_B) {
|
if (we!=el_B && xe!=el_B) {
|
||||||
if (we==xe) return true;
|
|
||||||
if (we==el_c32 ^ xe==el_c32) return false;
|
if (we==el_c32 ^ xe==el_c32) return false;
|
||||||
assert(we==el_i32|we==el_f64);
|
assert(we==el_c32 & xe==el_c32 || we<=el_f64 & xe<=el_f64);
|
||||||
assert(xe==el_i32|xe==el_f64);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
BS2B xgetU = TI(x).getU;
|
BS2B xgetU = TI(x).getU;
|
||||||
|
|||||||
@ -28,13 +28,15 @@ static bool fillEqual(B w, B x) {
|
|||||||
|
|
||||||
static B getFillR(B x) { // doesn't consume; can return bi_noFill
|
static B getFillR(B x) { // doesn't consume; can return bi_noFill
|
||||||
if (isArr(x)) {
|
if (isArr(x)) {
|
||||||
u8 xe = TI(x).elType;
|
switch(TI(x).elType) { default: UD;
|
||||||
if (xe<=el_f64) return m_f64(0);
|
case el_f64: case el_i32: return m_i32(0);
|
||||||
if (xe==el_c32) return m_c32(' ');
|
case el_c32: return m_c32(' ');
|
||||||
u8 t = v(x)->type;
|
case el_B:
|
||||||
if (t==t_fillarr ) return inc(c(FillArr,x )->fill);
|
u8 t = v(x)->type;
|
||||||
if (t==t_fillslice) return inc(c(FillArr,c(Slice,x)->p)->fill);
|
if (t==t_fillarr ) return inc(c(FillArr,x )->fill);
|
||||||
return bi_noFill;
|
if (t==t_fillslice) return inc(c(FillArr,c(Slice,x)->p)->fill);
|
||||||
|
return bi_noFill;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (isF64(x)|isI32(x)) return m_i32(0);
|
if (isF64(x)|isI32(x)) return m_i32(0);
|
||||||
if (isC32(x)) return m_c32(' ');
|
if (isC32(x)) return m_c32(' ');
|
||||||
|
|||||||
@ -298,7 +298,7 @@ static B vec_join(B w, B x) { // consumes both
|
|||||||
dec(w); dec(x);
|
dec(w); dec(x);
|
||||||
return mut_fv(r);
|
return mut_fv(r);
|
||||||
}
|
}
|
||||||
static B vec_add(B w, B x) { // consumes both
|
static inline bool inplace_add(B w, B x) { // fails if fills wouldn't be correct
|
||||||
usz wia = a(w)->ia;
|
usz wia = a(w)->ia;
|
||||||
usz ria = wia+1;
|
usz ria = wia+1;
|
||||||
if (v(w)->refc==1) {
|
if (v(w)->refc==1) {
|
||||||
@ -307,25 +307,30 @@ static B vec_add(B w, B x) { // consumes both
|
|||||||
if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)<wsz && q_i32(x)) {
|
if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)<wsz && q_i32(x)) {
|
||||||
a(w)->ia = ria;
|
a(w)->ia = ria;
|
||||||
i32arr_ptr(w)[wia] = o2iu(x);
|
i32arr_ptr(w)[wia] = o2iu(x);
|
||||||
return w;
|
return true;
|
||||||
}
|
}
|
||||||
if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)<wsz && isC32(x)) {
|
if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)<wsz && isC32(x)) {
|
||||||
a(w)->ia = ria;
|
a(w)->ia = ria;
|
||||||
c32arr_ptr(w)[wia] = o2cu(x);
|
c32arr_ptr(w)[wia] = o2cu(x);
|
||||||
return w;
|
return true;
|
||||||
}
|
}
|
||||||
if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)<wsz && isNum(x)) {
|
if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)<wsz && isNum(x)) {
|
||||||
a(w)->ia = ria;
|
a(w)->ia = ria;
|
||||||
f64arr_ptr(w)[wia] = o2fu(x);
|
f64arr_ptr(w)[wia] = o2fu(x);
|
||||||
return w;
|
return true;
|
||||||
}
|
}
|
||||||
if (wt==t_harr && fsizeof(HArr,a,B,ria)<wsz) {
|
if (wt==t_harr && fsizeof(HArr,a,B,ria)<wsz) {
|
||||||
a(w)->ia = ria;
|
a(w)->ia = ria;
|
||||||
harr_ptr(w)[wia] = x;
|
harr_ptr(w)[wia] = x;
|
||||||
return w;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MAKE_MUT(r, ria); mut_to(r, el_or(TI(w).elType, selfElType(x)));
|
return false;
|
||||||
|
}
|
||||||
|
static B vec_add(B w, B x) { // consumes both; fills may be wrong
|
||||||
|
if (inplace_add(w, x)) return w;
|
||||||
|
usz wia = a(w)->ia;
|
||||||
|
MAKE_MUT(r, wia+1); mut_to(r, el_or(TI(w).elType, selfElType(x)));
|
||||||
mut_copy(r, 0, w, 0, wia);
|
mut_copy(r, 0, w, 0, wia);
|
||||||
mut_set(r, wia, x);
|
mut_set(r, wia, x);
|
||||||
dec(w);
|
dec(w);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user