better m_atomUnit
This commit is contained in:
parent
7393c4b663
commit
c69a3373b9
@ -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);
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user