From c69a3373b975df399fe249f0210f55c77db1df3a Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 21 Aug 2022 08:50:33 +0300 Subject: [PATCH] better m_atomUnit --- src/core/fillarr.c | 22 ++++++++++++++++++++++ src/core/fillarr.h | 24 +----------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/core/fillarr.c b/src/core/fillarr.c index a16c7e36..47d2d0e2 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -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); +} diff --git a/src/core/fillarr.h b/src/core/fillarr.h index 5404adc1..f4f86ccc 100644 --- a/src/core/fillarr.h +++ b/src/core/fillarr.h @@ -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)) {