43 lines
975 B
C
43 lines
975 B
C
#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
|