move mut_copyG out of header
i'd still like to be able to have the compiler invert a loop of mut_copyG-s to a switch over the type to various loops, but that doesn't even work as it probably can't guarantee that m->type doesn't change
This commit is contained in:
parent
4d6369af06
commit
9dc3ef1eb8
@ -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);
|
||||
|
||||
@ -177,71 +177,9 @@ static void bit_cpy(u64* r, usz rs, u64* x, usz xs, usz l) { // TODO rewrite thi
|
||||
}
|
||||
for (; i<re; i++) bitp_set(r, i, bitp_get(x, i+d));
|
||||
}
|
||||
|
||||
// mut_copy but x is guaranteed to be a subtype of m
|
||||
static 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user