special-case appending atoms with ∾

This commit is contained in:
dzaima 2021-05-27 20:10:31 +03:00
parent 3ad82faadd
commit ff2af490b8
4 changed files with 29 additions and 18 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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(' ');

View File

@ -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);