This commit is contained in:
dzaima 2021-09-10 16:53:34 +03:00
parent 82a32684f5
commit 3d62f9c109

View File

@ -397,58 +397,42 @@ B slash_c2(B t, B w, B x) {
B xf = getFillQ(x); B xf = getFillQ(x);
usz ri = 0; usz ri = 0;
if (TI(w,elType)==el_i32) { #define CASE(WT,XT) if (TI(x,elType)==el_##XT) { \
i32* wp = i32any_ptr(w); XT* xp = XT##any_ptr(x); \
while (wia>0 && !wp[wia-1]) wia--; XT* rp; B r = m_##XT##arrv(&rp, wsum); \
if (or<2) for (usz i = 0; i < wia; i++) { \
i64 wsum = 0; *rp = xp[i]; \
u32 or = 0; rp+= wp[i]; \
for (usz i = 0; i < wia; i++) { } else for (usz i = 0; i < wia; i++) { \
wsum+= wp[i]; WT cw = wp[i]; XT cx = xp[i]; \
or|= (u32)wp[i]; for (i64 j = 0; j < cw; j++) *rp++ = cx; \
} \
dec(w); dec(x); return r; \
} }
if (or>>31) thrM("/: 𝕨 must consist of natural numbers"); #define TYPED(WT,SIGN) { \
WT* wp = WT##any_ptr(w); \
if (TI(x,elType)==el_i32) { while (wia>0 && !wp[wia-1]) wia--; \
i32* xp = i32any_ptr(x); i64 wsum = 0; \
i32* rp; B r = m_i32arrv(&rp, wsum); u32 or = 0; \
if (or<2) { for (usz i = 0; i < wia; i++) { \
for (usz i = 0; i < wia; i++) { wsum+= wp[i]; \
*rp = xp[i]; or|= (u32)wp[i]; \
rp+= wp[i]; } \
if (or>>SIGN) thrM("/: 𝕨 must consist of natural numbers"); \
CASE(WT,i8) CASE(WT,i16) CASE(WT,i32) CASE(WT,f64) \
HArr_p r = m_harrs(wsum, &ri); SGetU(x) \
for (usz i = 0; i < wia; i++) { \
i32 cw = wp[i]; if (cw==0) continue; \
B cx = incBy(GetU(x, i), cw); \
for (i64 j = 0; j < cw; j++) r.a[ri++] = cx; \
} \
dec(w); dec(x); \
return withFill(harr_fv(r), xf); \
} }
} else { if (TI(w,elType)==el_i8 ) TYPED(i8,7);
for (usz i = 0; i < wia; i++) { if (TI(w,elType)==el_i32) TYPED(i32,31);
i32 cw = wp[i]; #undef TYPED
i32 cx = xp[i]; #undef CASE
for (i64 j = 0; j < cw; j++) *rp++ = cx;
}
}
dec(w); dec(x);
return r;
} else if (TI(x,elType)==el_f64) {
f64* xp = f64any_ptr(x);
f64* rp; B r = m_f64arrv(&rp, wsum);
for (usz i = 0; i < wia; i++) {
i32 cw = wp[i];
f64 cx = xp[i];
for (i64 j = 0; j < cw; j++) *rp++ = cx;
}
dec(w); dec(x);
return r;
} else {
HArr_p r = m_harrs(wsum, &ri);
SGetU(x)
for (usz i = 0; i < wia; i++) {
i32 cw = wp[i];
if (cw==0) continue;
B cx = incBy(GetU(x, i), cw);
for (i64 j = 0; j < cw; j++) r.a[ri++] = cx;
}
dec(w); dec(x);
return withFill(harr_fv(r), xf);
}
} else {
i64 ria = isum(w); i64 ria = isum(w);
if (ria>USZ_MAX) thrOOM(); if (ria>USZ_MAX) thrOOM();
HArr_p r = m_harrs(ria, &ri); HArr_p r = m_harrs(ria, &ri);
@ -464,7 +448,6 @@ B slash_c2(B t, B w, B x) {
dec(w); dec(x); dec(w); dec(x);
return withFill(harr_fv(r), xf); return withFill(harr_fv(r), xf);
} }
}
if (isArr(x) && rnk(x)==1 && q_i32(w)) { if (isArr(x) && rnk(x)==1 && q_i32(w)) {
usz xia = a(x)->ia; usz xia = a(x)->ia;
i32 wv = o2i(w); i32 wv = o2i(w);