copy fallback instead of slice in take_head
This commit is contained in:
parent
bd6d40a4fa
commit
b7c3815d4a
@ -66,29 +66,45 @@ static Arr* take_head(usz ria, B x) { // consumes; returns ria↑x with unset sh
|
|||||||
if (reusable(x)) {
|
if (reusable(x)) {
|
||||||
usz xia = IA(x);
|
usz xia = IA(x);
|
||||||
u64 tgt = mm_sizeUsable(v(x)) / 4; // ÷4 to, even at minimum initial bucket utilization, require at least halving size before stopping in-place truncation
|
u64 tgt = mm_sizeUsable(v(x)) / 4; // ÷4 to, even at minimum initial bucket utilization, require at least halving size before stopping in-place truncation
|
||||||
switch (TY(x)) {
|
u64 used;
|
||||||
|
u8 xt = TY(x);
|
||||||
|
switch (xt) {
|
||||||
default: goto base;
|
default: goto base;
|
||||||
case t_bitarr: if (BITARR_SZ( ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_bitarr: used = BITARR_SZ( ria); goto try_tyarr;
|
||||||
case t_i8arr: if (TYARR_SZ(I8, ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_i8arr: used = TYARR_SZ(I8, ria); goto try_tyarr;
|
||||||
case t_i16arr: if (TYARR_SZ(I16,ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_i16arr: used = TYARR_SZ(I16,ria); goto try_tyarr;
|
||||||
case t_i32arr: if (TYARR_SZ(I32,ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_i32arr: used = TYARR_SZ(I32,ria); goto try_tyarr;
|
||||||
case t_c8arr: if (TYARR_SZ(C8, ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_c8arr: used = TYARR_SZ(C8, ria); goto try_tyarr;
|
||||||
case t_c16arr: if (TYARR_SZ(C16,ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_c16arr: used = TYARR_SZ(C16,ria); goto try_tyarr;
|
||||||
case t_c32arr: if (TYARR_SZ(C32,ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_c32arr: used = TYARR_SZ(C32,ria); goto try_tyarr;
|
||||||
case t_f64arr: if (TYARR_SZ(F64,ria)<tgt) goto base; else goto inplace_tyarr;
|
case t_f64arr: used = TYARR_SZ(F64,ria); goto try_tyarr;
|
||||||
case t_harr: if (fsizeof(HArr, a,B,ria)<tgt) goto base; else goto inplace_b;
|
case t_harr: used = fsizeof(HArr, a,B,ria); goto try_b;
|
||||||
case t_fillarr: if (fsizeof(FillArr,a,B,ria)<tgt) goto base; else goto inplace_b;
|
case t_fillarr: used = fsizeof(FillArr,a,B,ria); goto try_b;
|
||||||
}
|
}
|
||||||
|
|
||||||
inplace_b:;
|
try_b:;
|
||||||
|
if (used < tgt) goto try_copy;
|
||||||
B* xp = arr_bptrG(x);
|
B* xp = arr_bptrG(x);
|
||||||
for (ux i = ria; i < xia; i++) dec(xp[i]);
|
for (ux i = ria; i < xia; i++) dec(xp[i]);
|
||||||
|
goto inplace_ok;
|
||||||
|
|
||||||
inplace_tyarr:
|
try_tyarr:;
|
||||||
|
if (used < tgt) goto try_copy;
|
||||||
|
|
||||||
|
inplace_ok:;
|
||||||
reinit_portion(a(x), ria, xia);
|
reinit_portion(a(x), ria, xia);
|
||||||
arr_shErase(a(x), 1);
|
arr_shErase(a(x), 1);
|
||||||
a(x)->ia = ria;
|
a(x)->ia = ria;
|
||||||
return a(x);
|
return a(x);
|
||||||
|
|
||||||
|
try_copy:;
|
||||||
|
// if (used > 64) goto base;
|
||||||
|
MAKE_MUT_INIT(rm, ria, TI(x,elType)); MUTG_INIT(rm);
|
||||||
|
mut_copyG(rm, 0, x, 0, ria);
|
||||||
|
Arr* r = mut_fp(rm);
|
||||||
|
if (xt==t_fillarr) r = a(withFill(taga(arr_shVec(r)), getFillR(x)));
|
||||||
|
decG(x);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
base:;
|
base:;
|
||||||
return TI(x,slice)(x,0,ria);
|
return TI(x,slice)(x,0,ria);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user