diff --git a/src/utils/mut.h b/src/utils/mut.h index 69456ca2..e6c7d3a1 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -4,12 +4,12 @@ Start with MAKE_MUT(name, itemAmount); MAKE_MUT allocates the object on the stack, so everything must happen within the scope of it. -Optionally, call mut_init(name, el_something) with an appropriate ElType +Optionally, call mut_init(name, el_something) with an appropriate ElType. End with mut_f(v|c|cd|p); There must be no allocations while a mut object is being built so GC doesn't do bad things. -mut_pfree must be used to free a partially finished `mut` instance safely (e.g. before throwing an error) -methods ending with G expect that mut_init has been called with a type that can fit the elements that it'll set +mut_pfree must be used to free a partially finished `mut` instance safely (e.g. before throwing an error). +Methods ending with G expect that mut_init has been called with a type that can fit the elements that it'll set, and MUTG_INIT afterwards in the same scope. */ typedef struct Mut Mut; @@ -168,36 +168,39 @@ FORCE_INLINE B vec_join_inline(B w, B x) { u64 wsz = mm_size(v(w)); u8 wt = v(w)->type; // TODO f64∾i32, i32∾i8, c32∾c8 etc - if (wt==t_bitarr && BITARR_SZ( ria)ia=ria; bit_cpy(bitarr_ptr(w),wia,bitarr_ptr(x),0,xia); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_i8arr && TYARR_SZ(I8, ria)ia=ria; memcpy(i8arr_ptr (w)+wia, i8any_ptr (x), xia*1); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_i16arr && TYARR_SZ(I16,ria)ia=ria; memcpy(i16arr_ptr(w)+wia, i16any_ptr(x), xia*2); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_i32arr && TYARR_SZ(I32,ria)ia=ria; memcpy(i32arr_ptr(w)+wia, i32any_ptr(x), xia*4); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_c8arr && TYARR_SZ(C8, ria)ia=ria; memcpy(c8arr_ptr (w)+wia, c8any_ptr (x), xia*1); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_c16arr && TYARR_SZ(C16,ria)ia=ria; memcpy(c16arr_ptr(w)+wia, c16any_ptr(x), xia*2); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_c32arr && TYARR_SZ(C32,ria)ia=ria; memcpy(c32arr_ptr(w)+wia, c32any_ptr(x), xia*4); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_f64arr && TYARR_SZ(F64,ria)ia=ria; memcpy(f64arr_ptr(w)+wia, f64any_ptr(x), xia*8); decG(x); return FL_KEEP(w,fl_squoze); } - if (wt==t_harr && fsizeof(HArr,a,B,ria)ia = ria; - B* rp = harr_ptr(w)+wia; - u8 xe = TI(x,elType); - B* xpB = arr_bptr(x); - if (xpB!=NULL) { - memcpy(rp, xpB, xia*sizeof(B)); - for (usz i = 0; i < xia; i++) inc(rp[i]); - } - else if (xe==el_i8 ) { i8* xp=i8any_ptr (x); for (usz i=0; iia=ria; bit_cpy(bitarr_ptr(w),wia,bitarr_ptr(x),0,xia); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_i8arr: if (TYARR_SZ(I8, ria)ia=ria; memcpy(i8arr_ptr (w)+wia, i8any_ptr (x), xia*1); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_i16arr: if (TYARR_SZ(I16,ria)ia=ria; memcpy(i16arr_ptr(w)+wia, i16any_ptr(x), xia*2); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_i32arr: if (TYARR_SZ(I32,ria)ia=ria; memcpy(i32arr_ptr(w)+wia, i32any_ptr(x), xia*4); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_c8arr: if (TYARR_SZ(C8, ria)ia=ria; memcpy(c8arr_ptr (w)+wia, c8any_ptr (x), xia*1); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_c16arr: if (TYARR_SZ(C16,ria)ia=ria; memcpy(c16arr_ptr(w)+wia, c16any_ptr(x), xia*2); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_c32arr: if (TYARR_SZ(C32,ria)ia=ria; memcpy(c32arr_ptr(w)+wia, c32any_ptr(x), xia*4); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_f64arr: if (TYARR_SZ(F64,ria)ia=ria; memcpy(f64arr_ptr(w)+wia, f64any_ptr(x), xia*8); decG(x); return FL_KEEP(w,fl_squoze); } break; + case t_harr: if (fsizeof(HArr,a,B,ria)ia = ria; + B* rp = harr_ptr(w)+wia; + B* xpB = arr_bptr(x); + if (xpB!=NULL) { + memcpy(rp, xpB, xia*sizeof(B)); + for (usz i = 0; i < xia; i++) inc(rp[i]); + } else { + switch(TI(x,elType)) { + case el_i8: { i8* xp=i8any_ptr (x); for (usz i=0; itype; - if (wt==t_bitarr && BITARR_SZ( ria)ia=ria; bitp_set(bitarr_ptr(w),wia,o2bu(x)); return true; } - if (wt==t_i8arr && TYARR_SZ(I8, ria)ia=ria; i8arr_ptr (w)[wia]=o2iu(x); return true; } - if (wt==t_i16arr && TYARR_SZ(I16,ria)ia=ria; i16arr_ptr(w)[wia]=o2iu(x); return true; } - if (wt==t_i32arr && TYARR_SZ(I32,ria)ia=ria; i32arr_ptr(w)[wia]=o2iu(x); return true; } - if (wt==t_c8arr && TYARR_SZ(C8, ria)ia=ria; c8arr_ptr (w)[wia]=o2cu(x); return true; } - if (wt==t_c16arr && TYARR_SZ(C16,ria)ia=ria; c16arr_ptr(w)[wia]=o2cu(x); return true; } - if (wt==t_c32arr && TYARR_SZ(C32,ria)ia=ria; c32arr_ptr(w)[wia]=o2cu(x); return true; } - if (wt==t_f64arr && TYARR_SZ(F64,ria)ia=ria; f64arr_ptr(w)[wia]=o2fu(x); return true; } - if (wt==t_harr && fsizeof(HArr,a,B,ria)ia = ria; - harr_ptr(w)[wia] = x; - return true; + 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_harr: if (fsizeof(HArr,a,B,ria)ia = ria; + harr_ptr(w)[wia] = x; + return true; + } break; } } return false;