tyarrTemplate.h
This commit is contained in:
parent
4961c22c8b
commit
a191222967
22
src/core.h
22
src/core.h
@ -15,9 +15,31 @@
|
||||
|
||||
#include "core/gstack.h"
|
||||
#include "core/harr.h"
|
||||
|
||||
#define I8Atom i8
|
||||
#define C8Atom u8
|
||||
#define I16Atom i16
|
||||
#define C16Atom u16
|
||||
#define I32Atom i32
|
||||
#define C32Atom u32
|
||||
#define F64Atom f64
|
||||
#define TYARR_SZ(T,IA) fsizeof(T##Arr, a, T##Atom, IA)
|
||||
#define TYARR_SZ2(T,IA) TYARR_SZ(T,IA)
|
||||
|
||||
#define TU I32
|
||||
#define TP(W,X) W##i32##X
|
||||
#include "core/tyarrTemplate.h"
|
||||
#define TU C32
|
||||
#define TP(W,X) W##c32##X
|
||||
#include "core/tyarrTemplate.h"
|
||||
#define TU F64
|
||||
#define TP(W,X) W##f64##X
|
||||
#include "core/tyarrTemplate.h"
|
||||
|
||||
#include "core/f64arr.h"
|
||||
#include "core/i32arr.h"
|
||||
#include "core/c32arr.h"
|
||||
|
||||
#include "core/fillarr.h"
|
||||
#include "core/derv.h"
|
||||
|
||||
|
||||
@ -1,35 +1,3 @@
|
||||
typedef struct C32Arr {
|
||||
struct Arr;
|
||||
u32 a[];
|
||||
} C32Arr;
|
||||
typedef struct C32Slice {
|
||||
struct Slice;
|
||||
u32* a;
|
||||
} C32Slice;
|
||||
|
||||
|
||||
#define C32A_SZ(IA) fsizeof(C32Arr,a,u32,IA)
|
||||
static B m_c32arrv(u32** p, usz ia) {
|
||||
C32Arr* r = m_arr(C32A_SZ(ia), t_c32arr, ia);
|
||||
arr_shVec((Arr*)r);
|
||||
*p = r->a;
|
||||
return taga(r);
|
||||
}
|
||||
static B m_c32arrc(u32** p, B x) { assert(isArr(x));
|
||||
C32Arr* r = m_arr(C32A_SZ(a(x)->ia), t_c32arr, a(x)->ia);
|
||||
*p = r->a;
|
||||
arr_shCopy((Arr*)r, x);
|
||||
return taga(r);
|
||||
}
|
||||
static Arr* m_c32arrp(u32** p, usz ia) {
|
||||
C32Arr* r = m_arr(C32A_SZ(ia), t_c32arr, ia);
|
||||
*p = r->a;
|
||||
return (Arr*)r;
|
||||
}
|
||||
|
||||
static u32* c32arr_ptr(B x) { VTY(x, t_c32arr); return c(C32Arr,x)->a; }
|
||||
static u32* c32any_ptr(B x) { assert(isArr(x)); u8 t=v(x)->type; if(t==t_c32arr) return c(C32Arr,x)->a; assert(t==t_c32slice); return c(C32Slice,x)->a; }
|
||||
|
||||
B m_str8(usz sz, char* s);
|
||||
B m_str8l(char* s);
|
||||
B m_str32(u32* s);
|
||||
|
||||
@ -1,35 +1,3 @@
|
||||
typedef struct F64Arr {
|
||||
struct Arr;
|
||||
f64 a[];
|
||||
} F64Arr;
|
||||
typedef struct F64Slice {
|
||||
struct Slice;
|
||||
f64* a;
|
||||
} F64Slice;
|
||||
|
||||
|
||||
#define F64A_SZ(IA) fsizeof(F64Arr,a,f64,IA)
|
||||
static B m_f64arrv(f64** p, usz ia) {
|
||||
F64Arr* r = m_arr(F64A_SZ(ia), t_f64arr, ia);
|
||||
arr_shVec((Arr*)r);
|
||||
*p = r->a;
|
||||
return taga(r);
|
||||
}
|
||||
static B m_f64arrc(f64** p, B x) { assert(isArr(x));
|
||||
F64Arr* r = m_arr(F64A_SZ(a(x)->ia), t_f64arr, a(x)->ia);
|
||||
*p = r->a;
|
||||
arr_shCopy((Arr*)r, x);
|
||||
return taga(r);
|
||||
}
|
||||
static Arr* m_f64arrp(f64** p, usz ia) {
|
||||
F64Arr* r = m_arr(F64A_SZ(ia), t_f64arr, ia);
|
||||
*p = r->a;
|
||||
return (Arr*)r;
|
||||
}
|
||||
|
||||
static f64* f64arr_ptr(B x) { VTY(x, t_f64arr); return c(F64Arr,x)->a; }
|
||||
static f64* f64any_ptr(B x) { assert(isArr(x)); u8 t=v(x)->type; if(t==t_f64arr) return c(F64Arr,x)->a; assert(t==t_f64slice); return c(F64Slice,x)->a; }
|
||||
|
||||
B m_caf64(usz sz, f64* a);
|
||||
|
||||
static F64Arr* toF64Arr(B x) {
|
||||
|
||||
@ -1,35 +1,3 @@
|
||||
typedef struct I32Arr {
|
||||
struct Arr;
|
||||
i32 a[];
|
||||
} I32Arr;
|
||||
typedef struct I32Slice {
|
||||
struct Slice;
|
||||
i32* a;
|
||||
} I32Slice;
|
||||
|
||||
|
||||
#define I32A_SZ(IA) fsizeof(I32Arr,a,i32,IA)
|
||||
static B m_i32arrv(i32** p, usz ia) {
|
||||
I32Arr* r = m_arr(I32A_SZ(ia), t_i32arr, ia);
|
||||
arr_shVec((Arr*)r);
|
||||
*p = r->a;
|
||||
return taga(r);
|
||||
}
|
||||
static B m_i32arrc(i32** p, B x) { assert(isArr(x));
|
||||
I32Arr* r = m_arr(I32A_SZ(a(x)->ia), t_i32arr, a(x)->ia);
|
||||
*p = r->a;
|
||||
arr_shCopy((Arr*)r, x);
|
||||
return taga(r);
|
||||
}
|
||||
static Arr* m_i32arrp(i32** p, usz ia) {
|
||||
I32Arr* r = m_arr(I32A_SZ(ia), t_i32arr, ia);
|
||||
*p = r->a;
|
||||
return (Arr*)r;
|
||||
}
|
||||
|
||||
static i32* i32arr_ptr(B x) { VTY(x, t_i32arr); return c(I32Arr,x)->a; }
|
||||
static i32* i32any_ptr(B x) { assert(isArr(x)); u8 t=v(x)->type; if(t==t_i32arr) return c(I32Arr,x)->a; assert(t==t_i32slice); return c(I32Slice,x)->a; }
|
||||
|
||||
B m_cai32(usz ia, i32* a);
|
||||
|
||||
static I32Arr* toI32Arr(B x) { // assumes it's possible
|
||||
|
||||
42
src/core/tyarrTemplate.h
Normal file
42
src/core/tyarrTemplate.h
Normal file
@ -0,0 +1,42 @@
|
||||
#define T_ARR TP(t_,arr)
|
||||
#define T_SLICE TP(t_,slice)
|
||||
#define TArr JOIN(TU,Arr)
|
||||
#define TSlice JOIN(TU,Slice)
|
||||
#define TEl JOIN(TU,Atom)
|
||||
|
||||
typedef struct TArr {
|
||||
struct Arr;
|
||||
TEl a[];
|
||||
} TArr;
|
||||
typedef struct TSlice {
|
||||
struct Slice;
|
||||
TEl* a;
|
||||
} TSlice;
|
||||
|
||||
|
||||
static B TP(m_,arrv) (TEl** p, usz ia) {
|
||||
TArr* r = m_arr(TYARR_SZ2(TU,ia), T_ARR, ia);
|
||||
arr_shVec((Arr*)r);
|
||||
*p = r->a;
|
||||
return taga(r);
|
||||
}
|
||||
static B TP(m_,arrc) (TEl** p, B x) { assert(isArr(x));
|
||||
TArr* r = m_arr(TYARR_SZ2(TU,a(x)->ia), T_ARR, a(x)->ia);
|
||||
*p = r->a;
|
||||
arr_shCopy((Arr*)r, x);
|
||||
return taga(r);
|
||||
}
|
||||
static Arr* TP(m_,arrp) (TEl** p, usz ia) {
|
||||
TArr* r = m_arr(TYARR_SZ2(TU,ia), T_ARR, ia);
|
||||
*p = r->a;
|
||||
return (Arr*)r;
|
||||
}
|
||||
|
||||
static TEl* TP(,arr_ptr) (B x) { VTY(x, T_ARR); return c(TArr,x)->a; }
|
||||
static TEl* TP(,any_ptr) (B x) { assert(isArr(x)); u8 t=v(x)->type; if(t==T_ARR) return c(TArr,x)->a; assert(t==T_SLICE); return c(TSlice,x)->a; }
|
||||
|
||||
#undef TEl
|
||||
#undef TSlice
|
||||
#undef TArr
|
||||
#undef TU
|
||||
#undef TP
|
||||
3
src/h.h
3
src/h.h
@ -118,6 +118,9 @@
|
||||
#define N64d "%"SCNd64
|
||||
#define N64u "%"SCNu64
|
||||
|
||||
#define JOIN0(A,B) A##B
|
||||
#define JOIN(A,B) JOIN0(A,B)
|
||||
|
||||
typedef u32 usz;
|
||||
#define USZ_MAX ((u32)((1LL<<32)-1))
|
||||
// typedef u64 usz;
|
||||
|
||||
@ -33,9 +33,9 @@ static void mut_init(Mut* m, u8 n) {
|
||||
usz sz;
|
||||
// hack around inlining of the allocator too many times
|
||||
switch(n) { default: UD;
|
||||
case el_i32: ty = t_i32arr; sz = I32A_SZ(ia); break;
|
||||
case el_f64: ty = t_f64arr; sz = F64A_SZ(ia); break;
|
||||
case el_c32: ty = t_c32arr; sz = C32A_SZ(ia); break;
|
||||
case el_i32: ty = t_i32arr; sz = TYARR_SZ(I32,ia); break;
|
||||
case el_f64: ty = t_f64arr; sz = TYARR_SZ(F64,ia); break;
|
||||
case el_c32: ty = t_c32arr; sz = TYARR_SZ(C32,ia); break;
|
||||
case el_B:;
|
||||
HArr_p t = m_harrUp(ia);
|
||||
m->val = (Arr*)t.c;
|
||||
@ -391,17 +391,17 @@ static inline bool inplace_add(B w, B x) { // fails if fills wouldn't be correct
|
||||
if (v(w)->refc==1) {
|
||||
u64 wsz = mm_size(v(w));
|
||||
u8 wt = v(w)->type;
|
||||
if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)<wsz && q_i32(x)) {
|
||||
if (wt==t_i32arr && TYARR_SZ(I32,ria)<wsz && q_i32(x)) {
|
||||
a(w)->ia = ria;
|
||||
i32arr_ptr(w)[wia] = o2iu(x);
|
||||
return true;
|
||||
}
|
||||
if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)<wsz && isC32(x)) {
|
||||
if (wt==t_c32arr && TYARR_SZ(C32,ria)<wsz && isC32(x)) {
|
||||
a(w)->ia = ria;
|
||||
c32arr_ptr(w)[wia] = o2cu(x);
|
||||
return true;
|
||||
}
|
||||
if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)<wsz && isNum(x)) {
|
||||
if (wt==t_f64arr && TYARR_SZ(F64,ria)<wsz && isNum(x)) {
|
||||
a(w)->ia = ria;
|
||||
f64arr_ptr(w)[wia] = o2fu(x);
|
||||
return true;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user