From f0a602ccde02130ead5e3726cc0af6299919431e Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 28 Apr 2021 12:22:51 +0300 Subject: [PATCH] random utility functions --- src/c32arr.c | 11 +++++++++++ src/f64arr.c | 11 +++++++++++ src/h.h | 1 + 3 files changed, 23 insertions(+) diff --git a/src/c32arr.c b/src/c32arr.c index 403576ff..e793111d 100644 --- a/src/c32arr.c +++ b/src/c32arr.c @@ -37,6 +37,17 @@ NOINLINE B m_str32(u32* s) { return r; } +C32Arr* toC32Arr(B x) { + if (v(x)->type==t_c32arr) return c(C32Arr,x); + B r = m_c32arrc(x); + u32* rp = c32arr_ptr(r); + usz ia = a(r)->ia; + BS2B xgetU = TI(x).get; + for (usz i = 0; i < ia; i++) rp[i] = o2c(xgetU(x,i)); + dec(x); + return c(C32Arr,r); +} + typedef struct C32Slice { struct Slice; u32* a; diff --git a/src/f64arr.c b/src/f64arr.c index d8c6db6f..6dd3ac0b 100644 --- a/src/f64arr.c +++ b/src/f64arr.c @@ -31,6 +31,17 @@ B m_caf64(usz sz, f64* a) { return r; } +F64Arr* toF64Arr(B x) { + if (v(x)->type==t_f64arr) return c(F64Arr,x); + B r = m_f64arrc(x); + f64* rp = f64arr_ptr(r); + usz ia = a(r)->ia; + BS2B xgetU = TI(x).get; + for (usz i = 0; i < ia; i++) rp[i] = o2f(xgetU(x,i)); + dec(x); + return c(F64Arr,r); +} + typedef struct F64Slice { struct Slice; f64* a; diff --git a/src/h.h b/src/h.h index 513737f1..3d801903 100644 --- a/src/h.h +++ b/src/h.h @@ -320,6 +320,7 @@ usz o2s (B x) { if ((usz)x.f!=x.f) thrM("Expected integer"); return (usz)x.f; i64 o2i64 (B x) { if ((i64)x.f!=x.f) thrM("Expected integer"); return (i64)x.f; } f64 o2f (B x) { if (!isNum(x)) thrM("Expected integer"); return x.f; } i32 o2iu (B x) { return isI32(x)? (i32)(u32)x.u : (i32)x.f; } +usz o2c (B x) { if (!isC32(x)) thrM("Expected character"); return (u32)x.u; } usz o2su (B x) { return (usz)x.f; } i64 o2i64u(B x) { return (i64)x.f; } bool q_i32(B x) { return isI32(x) || isF64(x)&(x.f==(i32)x.f); }