diff --git a/src/utils/mut.c b/src/utils/mut.c index 2d91ba70..e80a0fa9 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -1,6 +1,71 @@ #include "../core.h" #include "mut.h" +void mut_copyG(Mut* m, usz ms, B x, usz xs, usz l) { assert(isArr(x)); + // printf("mut_%d[%d…%d] ← %s[%d…%d]\n", m->type, ms, ms+l, type_repr(xt), xs, xs+l); fflush(stdout); + u8 xt = v(x)->type; + switch(m->type) { default: UD; + case el_bit: bit_cpy(m->abit, ms, bitarr_ptr(x), xs, l); return; + case el_i8: { i8* rp = m->ai8+ms; + switch (xt) { default: UD; + case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } + case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_i16: { i16* rp = m->ai16+ms; + switch (xt) { default: UD; + case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } + case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_i32: { i32* rp = m->ai32+ms; + switch (xt) { default: UD; + case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } + case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_i32arr: case t_i32slice: { i32* xp = i32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_f64: { + f64* rp = m->af64+ms; + switch (xt) { default: UD; + case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } + case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_i32arr: case t_i32slice: { i32* xp = i32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_f64arr: case t_f64slice: { f64* xp = f64any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_c8: { u8* rp = m->ac8+ms; u8* xp = c8any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case el_c16: { u16* rp = m->ac16+ms; + switch (xt) { default: UD; + case t_c8arr: case t_c8slice: { u8* xp = c8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_c16arr: case t_c16slice: { u16* xp = c16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_c32: { u32* rp = m->ac32+ms; + switch (xt) { default: UD; + case t_c8arr: case t_c8slice: { u8* xp = c8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_c16arr: case t_c16slice: { u16* xp = c16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + case t_c32arr: case t_c32slice: { u32* xp = c32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } + } + } + case el_B: { + B* mpo = m->aB+ms; + B* xp = arr_bptr(x); + if (xp!=NULL) { + memcpy(mpo, xp+xs, l*sizeof(B)); + for (usz i = 0; i < l; i++) inc(mpo[i]); + return; + } + SGet(x) + for (usz i = 0; i < l; i++) mpo[i] = Get(x,i+xs); + return; + } + } +} + NOINLINE void mut_to(Mut* m, u8 n) { u8 o = m->type; assert(o!=el_B); diff --git a/src/utils/mut.h b/src/utils/mut.h index 68b70996..04fa4ee7 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -177,71 +177,9 @@ static void bit_cpy(u64* r, usz rs, u64* x, usz xs, usz l) { // TODO rewrite thi } for (; itype, ms, ms+l, type_repr(xt), xs, xs+l); fflush(stdout); - u8 xt = v(x)->type; - switch(m->type) { default: UD; - case el_bit: bit_cpy(m->abit, ms, bitarr_ptr(x), xs, l); return; - case el_i8: { i8* rp = m->ai8+ms; - switch (xt) { default: UD; - case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } - case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_i16: { i16* rp = m->ai16+ms; - switch (xt) { default: UD; - case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } - case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_i32: { i32* rp = m->ai32+ms; - switch (xt) { default: UD; - case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } - case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_i32arr: case t_i32slice: { i32* xp = i32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_f64: { - f64* rp = m->af64+ms; - switch (xt) { default: UD; - case t_bitarr: { u64* xp = bitarr_ptr(x); for (usz i = 0; i < l; i++) rp[i] = bitp_get(xp, xs+i); return; } - case t_i8arr: case t_i8slice: { i8* xp = i8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_i16arr: case t_i16slice: { i16* xp = i16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_i32arr: case t_i32slice: { i32* xp = i32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_f64arr: case t_f64slice: { f64* xp = f64any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_c8: { u8* rp = m->ac8+ms; u8* xp = c8any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case el_c16: { u16* rp = m->ac16+ms; - switch (xt) { default: UD; - case t_c8arr: case t_c8slice: { u8* xp = c8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_c16arr: case t_c16slice: { u16* xp = c16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_c32: { u32* rp = m->ac32+ms; - switch (xt) { default: UD; - case t_c8arr: case t_c8slice: { u8* xp = c8any_ptr (x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_c16arr: case t_c16slice: { u16* xp = c16any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - case t_c32arr: case t_c32slice: { u32* xp = c32any_ptr(x); for (usz i = 0; i < l; i++) rp[i] = xp[i+xs]; return; } - } - } - case el_B: { - B* mpo = m->aB+ms; - B* xp = arr_bptr(x); - if (xp!=NULL) { - memcpy(mpo, xp+xs, l*sizeof(B)); - for (usz i = 0; i < l; i++) inc(mpo[i]); - return; - } - SGet(x) - for (usz i = 0; i < l; i++) mpo[i] = Get(x,i+xs); - return; - } - } -} +void mut_copyG(Mut* m, usz ms, B x, usz xs, usz l); // expects x to be an array, each position must be written to precisely once // doesn't consume x