uCBQN/src/i32arr.c
2021-03-30 00:58:56 +03:00

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;
}