tyarr.c
This commit is contained in:
parent
a191222967
commit
80be141968
2
makefile
2
makefile
@ -81,7 +81,7 @@ builddir: # create the build directory. makefiles are stupid
|
||||
@mkdir -p ${bd}
|
||||
|
||||
# build individual object files
|
||||
core: builddir ${addprefix ${bd}/, i32arr.o c32arr.o f64arr.o harr.o fillarr.o stuff.o derv.o mm.o heap.o}
|
||||
core: builddir ${addprefix ${bd}/, tyarr.o harr.o fillarr.o stuff.o derv.o mm.o heap.o}
|
||||
${bd}/%.o: src/core/%.c
|
||||
@echo $< | cut -c 5-
|
||||
@$(CMD) $@.d -o $@ -c $<
|
||||
|
||||
@ -36,9 +36,9 @@
|
||||
#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/f64arr.h"
|
||||
|
||||
#include "core/fillarr.h"
|
||||
#include "core/derv.h"
|
||||
|
||||
@ -1,53 +0,0 @@
|
||||
#include "../core.h"
|
||||
|
||||
static Arr* m_c32slice(Arr* p, u32* ptr, usz ia) {
|
||||
C32Slice* r = m_arr(sizeof(C32Slice), t_c32slice, ia);
|
||||
r->p = p;
|
||||
r->a = ptr;
|
||||
return (Arr*)r;
|
||||
}
|
||||
static Arr* c32arr_slice (B x, usz s, usz ia) { return m_c32slice(a(x), c(C32Arr,x)->a+s, ia); }
|
||||
static Arr* c32slice_slice(B x, usz s, usz ia) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_c32slice(p, c(C32Slice,x)->a+s, ia); dec(x); return r; }
|
||||
|
||||
static B c32arr_get (B x, usz n) { VTY(x,t_c32arr ); return m_c32(c(C32Arr ,x)->a[n]); }
|
||||
static B c32slice_get(B x, usz n) { VTY(x,t_c32slice); return m_c32(c(C32Slice,x)->a[n]); }
|
||||
static bool c32arr_canStore(B x) { return isC32(x); }
|
||||
|
||||
void c32arr_init() {
|
||||
TIi(t_c32arr,get) = c32arr_get; TIi(t_c32slice,get) = c32slice_get;
|
||||
TIi(t_c32arr,getU) = c32arr_get; TIi(t_c32slice,getU) = c32slice_get;
|
||||
TIi(t_c32arr,slice) = c32arr_slice; TIi(t_c32slice,slice) = c32slice_slice;
|
||||
TIi(t_c32arr,freeO) = tyarr_freeO; TIi(t_c32slice,freeO) = slice_freeO;
|
||||
TIi(t_c32arr,freeF) = tyarr_freeF; TIi(t_c32slice,freeF) = slice_freeF;
|
||||
TIi(t_c32arr,visit) = noop_visit; TIi(t_c32slice,visit) = slice_visit;
|
||||
TIi(t_c32arr,print) = arr_print; TIi(t_c32slice,print) = arr_print;
|
||||
TIi(t_c32arr,isArr) = true; TIi(t_c32slice,isArr) = true;
|
||||
TIi(t_c32arr,arrD1) = true; TIi(t_c32slice,arrD1) = true;
|
||||
TIi(t_c32arr,elType) = el_c32; TIi(t_c32slice,elType) = el_c32;
|
||||
TIi(t_c32arr,canStore) = c32arr_canStore;
|
||||
|
||||
u32* tmp; bi_emptyCVec = m_c32arrv(&tmp, 0); gc_add(bi_emptyCVec);
|
||||
|
||||
Arr* emptySVec = m_fillarrp(0); arr_shVec(emptySVec);
|
||||
fillarr_setFill(emptySVec, emptyCVec());
|
||||
bi_emptySVec = taga(emptySVec); gc_add(bi_emptySVec);
|
||||
}
|
||||
|
||||
B m_str8(usz sz, char* s) {
|
||||
u32* rp; B r = m_c32arrv(&rp, sz);
|
||||
for (u64 i = 0; i < sz; i++) rp[i] = (u32)s[i];
|
||||
return r;
|
||||
}
|
||||
B m_str8l(char* s) {
|
||||
usz sz = strlen(s);
|
||||
u32* rp; B r = m_c32arrv(&rp, sz);
|
||||
for (u64 i = 0; i < sz; i++) rp[i] = (u32)s[i];
|
||||
return r;
|
||||
}
|
||||
|
||||
B m_str32(u32* s) {
|
||||
usz sz = 0; while(s[sz]) sz++;
|
||||
u32* rp; B r = m_c32arrv(&rp, sz);
|
||||
for (usz i = 0; i < sz; i++) rp[i] = s[i];
|
||||
return r;
|
||||
}
|
||||
@ -1,34 +0,0 @@
|
||||
#include "../core.h"
|
||||
|
||||
static Arr* m_f64slice(Arr* p, f64* ptr, usz ia) {
|
||||
F64Slice* r = m_arr(sizeof(F64Slice), t_f64slice, ia);
|
||||
r->p = p;
|
||||
r->a = ptr;
|
||||
return (Arr*)r;
|
||||
}
|
||||
static Arr* f64arr_slice (B x, usz s, usz ia) { return m_f64slice(a(x), c(F64Arr,x)->a+s, ia); }
|
||||
static Arr* f64slice_slice(B x, usz s, usz ia) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_f64slice(p, c(F64Slice,x)->a+s, ia); dec(x); return r; }
|
||||
|
||||
static B f64arr_get (B x, usz n) { VTY(x,t_f64arr ); return m_f64(c(F64Arr ,x)->a[n]); }
|
||||
static B f64slice_get(B x, usz n) { VTY(x,t_f64slice); return m_f64(c(F64Slice,x)->a[n]); }
|
||||
static bool f64arr_canStore(B x) { return q_f64(x); }
|
||||
|
||||
void f64arr_init() {
|
||||
TIi(t_f64arr,get) = f64arr_get; TIi(t_f64slice,get) = f64slice_get;
|
||||
TIi(t_f64arr,getU) = f64arr_get; TIi(t_f64slice,getU) = f64slice_get;
|
||||
TIi(t_f64arr,slice) = f64arr_slice; TIi(t_f64slice,slice) = f64slice_slice;
|
||||
TIi(t_f64arr,freeO) = tyarr_freeO; TIi(t_f64slice,freeO) = slice_freeO;
|
||||
TIi(t_f64arr,freeF) = tyarr_freeF; TIi(t_f64slice,freeF) = slice_freeF;
|
||||
TIi(t_f64arr,visit) = noop_visit; TIi(t_f64slice,visit) = slice_visit;
|
||||
TIi(t_f64arr,print) = arr_print; TIi(t_f64slice,print) = arr_print;
|
||||
TIi(t_f64arr,isArr) = true; TIi(t_f64slice,isArr) = true;
|
||||
TIi(t_f64arr,arrD1) = true; TIi(t_f64slice,arrD1) = true;
|
||||
TIi(t_f64arr,elType) = el_f64; TIi(t_f64slice,elType) = el_f64;
|
||||
TIi(t_f64arr,canStore) = f64arr_canStore;
|
||||
}
|
||||
|
||||
NOINLINE B m_caf64(usz sz, f64* a) {
|
||||
f64* rp; B r = m_f64arrv(&rp, sz);
|
||||
for (usz i = 0; i < sz; i++) rp[i] = a[i];
|
||||
return r;
|
||||
}
|
||||
@ -1,35 +0,0 @@
|
||||
#include "../core.h"
|
||||
|
||||
static Arr* m_i32slice(Arr* p, i32* ptr, usz ia) {
|
||||
I32Slice* r = m_arr(sizeof(I32Slice), t_i32slice, ia);
|
||||
r->p = p;
|
||||
r->a = ptr;
|
||||
return (Arr*)r;
|
||||
}
|
||||
static Arr* i32arr_slice (B x, usz s, usz ia) { return m_i32slice(a(x), c(I32Arr,x)->a+s, ia); }
|
||||
static Arr* i32slice_slice(B x, usz s, usz ia) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_i32slice(p, c(I32Slice,x)->a+s, ia); dec(x); return r; }
|
||||
|
||||
static B i32arr_get (B x, usz n) { VTY(x,t_i32arr ); return m_i32(c(I32Arr ,x)->a[n]); }
|
||||
static B i32slice_get(B x, usz n) { VTY(x,t_i32slice); return m_i32(c(I32Slice,x)->a[n]); }
|
||||
static bool i32arr_canStore(B x) { return q_i32(x); }
|
||||
|
||||
void i32arr_init() {
|
||||
TIi(t_i32arr,get) = i32arr_get; TIi(t_i32slice,get) = i32slice_get;
|
||||
TIi(t_i32arr,getU) = i32arr_get; TIi(t_i32slice,getU) = i32slice_get;
|
||||
TIi(t_i32arr,slice) = i32arr_slice; TIi(t_i32slice,slice) = i32slice_slice;
|
||||
TIi(t_i32arr,freeO) = tyarr_freeO; TIi(t_i32slice,freeO) = slice_freeO;
|
||||
TIi(t_i32arr,freeF) = tyarr_freeF; TIi(t_i32slice,freeF) = slice_freeF;
|
||||
TIi(t_i32arr,visit) = noop_visit; TIi(t_i32slice,visit) = slice_visit;
|
||||
TIi(t_i32arr,print) = arr_print; TIi(t_i32slice,print) = arr_print;
|
||||
TIi(t_i32arr,isArr) = true; TIi(t_i32slice,isArr) = true;
|
||||
TIi(t_i32arr,arrD1) = true; TIi(t_i32slice,arrD1) = true;
|
||||
TIi(t_i32arr,elType) = el_i32; TIi(t_i32slice,elType) = el_i32;
|
||||
TIi(t_i32arr,canStore) = i32arr_canStore;
|
||||
i32* tmp; bi_emptyIVec = m_i32arrv(&tmp, 0); gc_add(bi_emptyIVec);
|
||||
}
|
||||
|
||||
NOINLINE B m_cai32(usz ia, i32* a) {
|
||||
i32* rp; B r = m_i32arrv(&rp, ia);
|
||||
for (usz i = 0; i < ia; i++) rp[i] = a[i];
|
||||
return r;
|
||||
}
|
||||
31
src/core/tyarr.c
Normal file
31
src/core/tyarr.c
Normal file
@ -0,0 +1,31 @@
|
||||
#include "../core.h"
|
||||
|
||||
#define TU F64
|
||||
#define TP(W,X) W##f64##X
|
||||
#include "tyarrTemplate.c"
|
||||
#define TU C32
|
||||
#define TP(W,X) W##c32##X
|
||||
#include "tyarrTemplate.c"
|
||||
#define TU I32
|
||||
#define TP(W,X) W##i32##X
|
||||
#include "tyarrTemplate.c"
|
||||
|
||||
NOINLINE B m_caf64(usz sz, f64* a) { f64* rp; B r = m_f64arrv(&rp, sz); for (usz i = 0; i < sz; i++) rp[i] = a[i]; return r; }
|
||||
NOINLINE B m_cai32(usz sz, i32* a) { i32* rp; B r = m_i32arrv(&rp, sz); for (usz i = 0; i < sz; i++) rp[i] = a[i]; return r; }
|
||||
NOINLINE B m_str8(usz sz, char* s) { u32* rp; B r = m_c32arrv(&rp, sz); for (u64 i = 0; i < sz; i++) rp[i] = (u32)s[i]; return r; }
|
||||
NOINLINE B m_str8l(char* s) { return m_str8(strlen(s), s); }
|
||||
NOINLINE B m_str32(u32* s) {
|
||||
usz sz = 0; while(s[sz]) sz++;
|
||||
u32* rp; B r = m_c32arrv(&rp, sz);
|
||||
for (usz i = 0; i < sz; i++) rp[i] = s[i];
|
||||
return r;
|
||||
}
|
||||
|
||||
void tyarr_init() {
|
||||
{ i32* tmp; bi_emptyIVec = m_i32arrv(&tmp, 0); gc_add(bi_emptyIVec); }
|
||||
{ u32* tmp; bi_emptyCVec = m_c32arrv(&tmp, 0); gc_add(bi_emptyCVec); }
|
||||
|
||||
Arr* emptySVec = m_fillarrp(0); arr_shVec(emptySVec);
|
||||
fillarr_setFill(emptySVec, emptyCVec());
|
||||
bi_emptySVec = taga(emptySVec); gc_add(bi_emptySVec);
|
||||
}
|
||||
38
src/core/tyarrTemplate.c
Normal file
38
src/core/tyarrTemplate.c
Normal file
@ -0,0 +1,38 @@
|
||||
#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)
|
||||
|
||||
static Arr* TP(m_,slice) (Arr* p, TEl* ptr, usz ia) {
|
||||
TSlice* r = m_arr(sizeof(TSlice), T_SLICE, ia);
|
||||
r->p = p;
|
||||
r->a = ptr;
|
||||
return (Arr*)r;
|
||||
}
|
||||
static Arr* TP(,arr_slice) (B x, usz s, usz ia) { return TP(m_,slice) (a(x), c(TArr,x)->a+s, ia); }
|
||||
static Arr* TP(,slice_slice) (B x, usz s, usz ia) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = TP(m_,slice) (p, c(TSlice,x)->a+s, ia); dec(x); return r; }
|
||||
|
||||
static B TP(,arr_get) (B x, usz n) { VTY(x,T_ARR ); return TP(m_,) (c(TArr ,x)->a[n]); }
|
||||
static B TP(,slice_get) (B x, usz n) { VTY(x,T_SLICE); return TP(m_,) (c(TSlice,x)->a[n]); }
|
||||
static bool TP(,arr_canStore) (B x) { return TP(q_,) (x); }
|
||||
|
||||
void TP(,arr_init)() {
|
||||
TIi(T_ARR,get) = TP(,arr_get); TIi(T_SLICE,get) = TP(,slice_get);
|
||||
TIi(T_ARR,getU) = TP(,arr_get); TIi(T_SLICE,getU) = TP(,slice_get);
|
||||
TIi(T_ARR,slice) = TP(,arr_slice); TIi(T_SLICE,slice) = TP(,slice_slice);
|
||||
TIi(T_ARR,freeO) = tyarr_freeO; TIi(T_SLICE,freeO) = slice_freeO;
|
||||
TIi(T_ARR,freeF) = tyarr_freeF; TIi(T_SLICE,freeF) = slice_freeF;
|
||||
TIi(T_ARR,visit) = noop_visit; TIi(T_SLICE,visit) = slice_visit;
|
||||
TIi(T_ARR,print) = arr_print; TIi(T_SLICE,print) = arr_print;
|
||||
TIi(T_ARR,isArr) = true; TIi(T_SLICE,isArr) = true;
|
||||
TIi(T_ARR,arrD1) = true; TIi(T_SLICE,arrD1) = true;
|
||||
TIi(T_ARR,elType) = TP(el_,); TIi(T_SLICE,elType) = TP(el_,);
|
||||
TIi(T_ARR,canStore) = TP(,arr_canStore);
|
||||
}
|
||||
|
||||
#undef TEl
|
||||
#undef TSlice
|
||||
#undef TArr
|
||||
#undef TU
|
||||
#undef TP
|
||||
5
src/h.h
5
src/h.h
@ -345,6 +345,11 @@ static usz o2su (B x) { return (usz)x.f; }
|
||||
static f64 o2fu (B x) { return x.f; }
|
||||
static i64 o2i64u(B x) { return (i64)x.f; }
|
||||
static bool o2b (B x) { usz t=o2s(x); if(t!=0&t!=1)thrM("Expected boolean"); return t; }
|
||||
static bool q_c8 (B x) { return isC32(x) && ((u32)x.u) == ((u8 )x.u); }
|
||||
static bool q_c16(B x) { return isC32(x) && ((u32)x.u) == ((u16)x.u); }
|
||||
static bool q_c32(B x) { return isC32(x); }
|
||||
static bool q_i8 (B x) { return isF64(x) && x.f==(f64)(i8 )x.f; }
|
||||
static bool q_i16(B x) { return isF64(x) && x.f==(f64)(i16)x.f; }
|
||||
static bool q_i32(B x) { return isF64(x) && x.f==(f64)(i32)x.f; }
|
||||
static bool q_i64(B x) { return isF64(x) && x.f==(f64)(i64)x.f; }
|
||||
static bool q_f64(B x) { return isF64(x); }
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
#include "utils/file.h"
|
||||
#include "utils/builtins.h"
|
||||
|
||||
#define FOR_INIT(F) F(base) F(harr) F(fillarr) F(i32arr) F(c32arr) F(f64arr) F(hash) F(sfns) F(fns) F(arith) F(md1) F(md2) F(derv) F(comp) F(rtWrap) F(ns) F(nfn) F(sysfn) F(load) F(sysfnPost)
|
||||
#define FOR_INIT(F) F(base) F(harr) F(fillarr) F(i32arr) F(c32arr) F(f64arr) F(tyarr) F(hash) F(sfns) F(fns) F(arith) F(md1) F(md2) F(derv) F(comp) F(rtWrap) F(ns) F(nfn) F(sysfn) F(load) F(sysfnPost)
|
||||
#define F(X) void X##_init(void);
|
||||
FOR_INIT(F)
|
||||
#undef F
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
#include "../core.h"
|
||||
#include "../core/i32arr.c"
|
||||
#include "../core/c32arr.c"
|
||||
#include "../core/f64arr.c"
|
||||
#include "../core/tyarr.c"
|
||||
#include "../core/harr.c"
|
||||
#include "../core/fillarr.c"
|
||||
#include "../core/stuff.c"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user