Native Windows (↕)
This commit is contained in:
parent
88f73d2585
commit
9028ebfe8b
@ -76,9 +76,80 @@ B ud_c1(B t, B x) {
|
||||
return taga(r);
|
||||
}
|
||||
|
||||
extern B rt_ud;
|
||||
B ud_c2(B t, B w, B x) {
|
||||
return c2(rt_ud, w, x);
|
||||
usz wia=1;
|
||||
if (isArr(w)) {
|
||||
if (RNK(w)>1) thrM("↕: 𝕨 must have rank at most 1");
|
||||
wia = IA(w);
|
||||
if (wia==0) { decG(w); return x; }
|
||||
}
|
||||
ur xr;
|
||||
if (isAtm(x) || (xr=RNK(x))<wia) thrM("↕: Length of 𝕨 must be at most rank of 𝕩");
|
||||
if (xr+wia > UR_MAX) thrM("↕: Result rank too large");
|
||||
ur wr = wia;
|
||||
ur rr = xr + wr;
|
||||
ShArr* sh = m_shArr(rr);
|
||||
usz* rsh = sh->a;
|
||||
usz* wsh = rsh + wr;
|
||||
if (isAtm(w)) {
|
||||
wsh[0] = o2s(w);
|
||||
} else {
|
||||
SGetU(w)
|
||||
for (usz i=0; i<wr; i++) wsh[i] = o2s(GetU(w, i));
|
||||
decG(w);
|
||||
}
|
||||
|
||||
usz* xsh = SH(x);
|
||||
bool empty = IA(x)==0;
|
||||
for (usz i=0; i<wr; i++) {
|
||||
usz l = xsh[i] + 1;
|
||||
usz m = wsh[i];
|
||||
if (l<m) thrM("↕: Window length 𝕨 must be at most axis length plus one");
|
||||
empty|= m==0 | m==l;
|
||||
rsh[i] = l - m;
|
||||
}
|
||||
for (usz i=wr; i<xr; i++) wsh[i] = xsh[i];
|
||||
|
||||
if (empty) {
|
||||
Arr* ra = m_fillarrp(0);
|
||||
arr_shSetU(ra, rr, sh);
|
||||
fillarr_setFill(ra, getFillQ(x));
|
||||
decG(x);
|
||||
return taga(ra);
|
||||
}
|
||||
ur fr=2*wr; // Frame rank in result
|
||||
usz cia=1; // Cell length
|
||||
for (usz i=fr; i<rr; i++) if (mulOn(cia, rsh[i])) thrM("↕: result shape too large");
|
||||
usz ria=cia;
|
||||
for (usz i=0; i<fr; i++) if (mulOn(ria, rsh[i])) thrM("↕: result shape too large");
|
||||
B xf = getFillQ(x);
|
||||
TALLOC(usz, ri, fr-1);
|
||||
MAKE_MUT(r, ria); mut_init(r, TI(x,elType));
|
||||
MUTG_INIT(r);
|
||||
usz k = cia*rsh[fr-1];
|
||||
if (wr==1) {
|
||||
for (usz i=0, j=0; i<ria; i+=k, j+=cia) mut_copyG(r, i, x, j, k);
|
||||
} else {
|
||||
for (usz i=0; i<fr-1; i++) ri[i]=0;
|
||||
for (usz i=0, j=0;;) {
|
||||
mut_copyG(r, i, x, j, k);
|
||||
usz str = cia*xsh[xr-1];
|
||||
i += k;
|
||||
if (i == ria) break;
|
||||
j += str;
|
||||
for (usz a=fr-2, b=xr-2; RARE(++ri[a] == rsh[a]); ) {
|
||||
ri[a] = 0;
|
||||
j -= rsh[a] * str;
|
||||
str *= xsh[b]; if (!b) { str=cia; b=xr; }
|
||||
a--; b--;
|
||||
j += str;
|
||||
}
|
||||
}
|
||||
}
|
||||
decG(x); TFREE(ri);
|
||||
Arr* ra = mut_fp(r);
|
||||
arr_shSetU(ra, rr, sh);
|
||||
return withFill(taga(ra), xf);
|
||||
}
|
||||
|
||||
B ltack_c1(B t, B x) { return x; }
|
||||
|
||||
@ -103,7 +103,7 @@ B comp_currArgs;
|
||||
B comp_currSrc;
|
||||
B comp_currRe;
|
||||
|
||||
B rt_undo, rt_select, rt_slash, rt_ud, rt_pick, rt_take, rt_drop, rt_insert, rt_depth,
|
||||
B rt_undo, rt_select, rt_slash, rt_pick, rt_take, rt_drop, rt_insert, rt_depth,
|
||||
rt_group, rt_under, rt_reverse, rt_indexOf, rt_count, rt_memberOf, rt_find, rt_transp;
|
||||
Block* load_compObj(B x, B src, B path, Scope* sc) { // consumes x,src
|
||||
SGet(x)
|
||||
@ -386,7 +386,6 @@ void load_init() { // very last init function
|
||||
rt_undo = Get(rtObjRaw, n_undo ); gc_add(rt_undo);
|
||||
rt_select = Get(rtObjRaw, n_select ); gc_add(rt_select);
|
||||
rt_slash = Get(rtObjRaw, n_slash ); gc_add(rt_slash);
|
||||
rt_ud = Get(rtObjRaw, n_ud ); gc_add(rt_ud);
|
||||
rt_take = Get(rtObjRaw, n_take ); gc_add(rt_take);
|
||||
rt_drop = Get(rtObjRaw, n_drop ); gc_add(rt_drop);
|
||||
rt_group = Get(rtObjRaw, n_group ); gc_add(rt_group);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user