62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
#include "h.h"
|
|
|
|
typedef struct I32Arr {
|
|
struct Arr;
|
|
i32 a[];
|
|
} I32Arr;
|
|
|
|
|
|
B m_i32arrv(usz ia) {
|
|
B r = m_arr(fsizeof(I32Arr,a,i32,ia), t_i32arr);
|
|
arr_shVec(r, ia);
|
|
return r;
|
|
}
|
|
B m_i32arrc(B x) { assert(isArr(x));
|
|
B r = m_arr(fsizeof(I32Arr,a,B,a(x)->ia), t_i32arr);
|
|
arr_shCopy(r, x);
|
|
return r;
|
|
}
|
|
B m_i32arrp(usz ia) { // doesn't write any shape/size info! be careful!
|
|
return m_arr(fsizeof(I32Arr,a,i32,ia), t_i32arr);
|
|
}
|
|
|
|
|
|
i32* i32arr_ptr(B x) {
|
|
assert(v(x)->type==t_i32arr);
|
|
return c(I32Arr,x)->a;
|
|
}
|
|
|
|
|
|
B m_vai32(usz sz, ...) {
|
|
va_list vargs;
|
|
va_start(vargs, sz);
|
|
B r = m_i32arrv(sz);
|
|
i32* rp = i32arr_ptr(r);
|
|
for (usz i = 0; i < sz; i++) rp[i] = va_arg(vargs, i32);
|
|
va_end(vargs);
|
|
return r;
|
|
}
|
|
|
|
I32Arr* toI32Arr(B x) {
|
|
if (v(x)->type==t_i32arr) return c(I32Arr,x);
|
|
B r = m_i32arrc(x);
|
|
i32* rp = i32arr_ptr(r);
|
|
usz ia = a(r)->ia;
|
|
BS2B xget = TI(x).get;
|
|
for (usz i = 0; i < ia; i++) rp[i] = o2i(xget(x,i));
|
|
dec(x);
|
|
return c(I32Arr,r);
|
|
}
|
|
|
|
|
|
void i32arr_free(B x) { decSh(x); }
|
|
void i32arr_print(B x) { arr_print(x); }
|
|
B i32arr_get(B x, usz n) { assert(v(x)->type==t_i32arr); return m_i32(c(I32Arr,x)->a[n]); }
|
|
|
|
void i32arr_init() {
|
|
ti[t_i32arr].free = i32arr_free;
|
|
ti[t_i32arr].print = i32arr_print;
|
|
ti[t_i32arr].get = i32arr_get;
|
|
}
|
|
|