better m_atomUnit

This commit is contained in:
dzaima 2022-08-21 08:50:33 +03:00
parent 7393c4b663
commit c69a3373b9
2 changed files with 23 additions and 23 deletions

View File

@ -160,3 +160,25 @@ B withFill(B x, B fill) { // consumes both
decG(x);
return taga(r);
}
B m_atomUnit(B x) {
u64 data; assert(sizeof(f64)<=8);
u8 t;
if (isNum(x)) {
i32 xi = (i32)x.f;
if (RARE(xi!=x.f)) { f64 v=x.f; memcpy(&data, &v, sizeof(v)); t=t_f64arr; }
else if (q_ibit(xi)) { u64 v=bitx(x); memcpy(&data, &v, sizeof(v)); t=t_bitarr; }
else if (xi==(i8 )xi) { i8 v=xi; memcpy(&data, &v, sizeof(v)); t=t_i8arr; }
else if (xi==(i16)xi) { i16 v=xi; memcpy(&data, &v, sizeof(v)); t=t_i16arr; }
else { i32 v=xi; memcpy(&data, &v, sizeof(v)); t=t_i32arr; }
} else if (isC32(x)) {
u32 xi = o2cu(x);
if (xi==(u8 )xi) { u8 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c8arr; }
else if (xi==(u16)xi) { u16 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c16arr; }
else { u32 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c32arr; }
} else return m_unit(x);
TyArr* r = m_arr(offsetof(TyArr,a) + sizeof(u64), t, 1);
*((u64*)r->a) = data;
arr_shAlloc((Arr*)r, 0);
return taga(r);
}

View File

@ -88,29 +88,7 @@ static B m_unit(B x) { // consumes
return taga(r);
}
static B m_atomUnit(B x) { // consumes
if (isNum(x)) {
Arr* r;
i32 xi = (i32)x.f;
if (RARE(xi!=x.f)) { f64* rp; r = m_f64arrp(&rp, 1); rp[0] = x.f; }
else if (q_ibit(xi)) { u64* rp; r = m_bitarrp(&rp, 1); rp[0] = bitx(x); }
else if (xi==(i8 )xi) { i8* rp; r = m_i8arrp (&rp, 1); rp[0] = xi; }
else if (xi==(i16)xi) { i16* rp; r = m_i16arrp(&rp, 1); rp[0] = xi; }
else { i32* rp; r = m_i32arrp(&rp, 1); rp[0] = xi; }
arr_shAlloc(r, 0);
return taga(r);
}
if (isC32(x)) {
Arr* r;
u32 xi = o2cu(x);
if (xi==(i8 )xi) { u8* rp; r = m_c8arrp (&rp, 1); rp[0] = xi; }
else if (xi==(i16)xi) { u16* rp; r = m_c16arrp(&rp, 1); rp[0] = xi; }
else { u32* rp; r = m_c32arrp(&rp, 1); rp[0] = xi; }
arr_shAlloc(r,0);
return taga(r);
}
return m_unit(x);
}
B m_atomUnit(B x); // consumes
static B fill_or(B wf, B xf) { // consumes
if (fillEqual(wf, xf)) {