diff --git a/src/utils/mut.h b/src/utils/mut.h index f41c73f3..d1aceb1c 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -169,16 +169,15 @@ FORCE_INLINE B arr_join_inline(B w, B x, bool consume, bool* reusedW) { u8 wt = v(w)->type; // TODO f64∾i32, i32∾i8, c32∾c8 etc switch (wt) { - case t_bitarr: if (BITARR_SZ( ria)ia=ria; bit_cpy(bitarr_ptr(w),wia,bitarr_ptr(x),0,xia); goto rw; } break; - case t_i8arr: if (TYARR_SZ(I8, ria)ia=ria; memcpy(i8arr_ptr (w)+wia, i8any_ptr (x), xia*1); goto rw; } break; - case t_i16arr: if (TYARR_SZ(I16,ria)ia=ria; memcpy(i16arr_ptr(w)+wia, i16any_ptr(x), xia*2); goto rw; } break; - case t_i32arr: if (TYARR_SZ(I32,ria)ia=ria; memcpy(i32arr_ptr(w)+wia, i32any_ptr(x), xia*4); goto rw; } break; - case t_c8arr: if (TYARR_SZ(C8, ria)ia=ria; memcpy(c8arr_ptr (w)+wia, c8any_ptr (x), xia*1); goto rw; } break; - case t_c16arr: if (TYARR_SZ(C16,ria)ia=ria; memcpy(c16arr_ptr(w)+wia, c16any_ptr(x), xia*2); goto rw; } break; - case t_c32arr: if (TYARR_SZ(C32,ria)ia=ria; memcpy(c32arr_ptr(w)+wia, c32any_ptr(x), xia*4); goto rw; } break; - case t_f64arr: if (TYARR_SZ(F64,ria)ia=ria; memcpy(f64arr_ptr(w)+wia, f64any_ptr(x), xia*8); goto rw; } break; + case t_bitarr: if (BITARR_SZ( ria)ia = ria; B* rp = harr_ptr(w)+wia; B* xpB = arr_bptr(x); if (xpB!=NULL) { @@ -212,6 +211,7 @@ FORCE_INLINE B arr_join_inline(B w, B x, bool consume, bool* reusedW) { rw: if (consume) decG(x); *reusedW = true; + a(w)->ia = ria; return FL_KEEP(w,fl_squoze); // keeping fl_squoze as appending items can't make the smallest item smaller } @@ -222,22 +222,24 @@ static inline bool inplace_add(B w, B x) { // consumes x if returns true; fails u64 wsz = mm_size(v(w)); u8 wt = v(w)->type; switch (wt) { - case t_bitarr: if (BITARR_SZ( ria)ia=ria; bitp_set(bitarr_ptr(w),wia,o2bu(x)); return true; } break; - case t_i8arr: if (TYARR_SZ(I8, ria)ia=ria; i8arr_ptr (w)[wia]=o2iu(x); return true; } break; - case t_i16arr: if (TYARR_SZ(I16,ria)ia=ria; i16arr_ptr(w)[wia]=o2iu(x); return true; } break; - case t_i32arr: if (TYARR_SZ(I32,ria)ia=ria; i32arr_ptr(w)[wia]=o2iu(x); return true; } break; - case t_c8arr: if (TYARR_SZ(C8, ria)ia=ria; c8arr_ptr (w)[wia]=o2cu(x); return true; } break; - case t_c16arr: if (TYARR_SZ(C16,ria)ia=ria; c16arr_ptr(w)[wia]=o2cu(x); return true; } break; - case t_c32arr: if (TYARR_SZ(C32,ria)ia=ria; c32arr_ptr(w)[wia]=o2cu(x); return true; } break; - case t_f64arr: if (TYARR_SZ(F64,ria)ia=ria; f64arr_ptr(w)[wia]=o2fu(x); return true; } break; + case t_bitarr: if (BITARR_SZ( ria)ia = ria; harr_ptr(w)[wia] = x; - return true; + goto ok; } break; } } return false; + ok: + a(FL_KEEP(w,fl_squoze))->ia = ria; + return true; } B vec_addF(B w, B x); B vec_addN(B w, B x); // vec_add but not inlined