native vec⊐scalar

This commit is contained in:
dzaima 2021-06-27 18:03:51 +03:00
parent fdcb158ca5
commit 27b1e9ed8c

View File

@ -212,21 +212,49 @@ B indexOf_c1(B t, B x) {
return c1(rt_indexOf, x);
}
B indexOf_c2(B t, B w, B x) {
if (!isArr(w) || rnk(w)!=1 || !isArr(x) || rnk(x)!=1) return c2(rt_indexOf, w, x);
usz wia = a(w)->ia;
usz xia = a(x)->ia;
// TODO O(wia×xia) for small wia
i32* rp; B r = m_i32arrv(&rp, xia);
H_b2i* map = m_b2i(64);
BS2B xgetU = TI(x).getU;
BS2B wgetU = TI(w).getU;
for (usz i = 0; i < wia; i++) {
bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had);
if (!had) map->a[p].val = i;
if (!isArr(w) || rnk(w)==0) thrM("⊐: 𝕨 must have rank at least 1");
if (rnk(w)==1) {
if (!isArr(x) || rnk(x)==0) {
usz wia = a(w)->ia;
B el = isArr(x)? TI(x).getU(x,0) : x;
i32 res = wia;
if (TI(w).elType==el_i32) {
if (q_i32(el)) {
i32* wp = i32any_ptr(w);
i32 v = o2iu(el);
for (usz i = 0; i < wia; i++) {
if (wp[i] == v) { res = i; break; }
}
}
} else {
BS2B wgetU = TI(w).getU;
for (usz i = 0; i < wia; i++) {
if (equal(wgetU(w,i), el)) { res = i; break; }
}
}
dec(w); dec(x);
i32* rp; B r = m_i32arrp(&rp, 1);
arr_shAllocR(r,0);
rp[0] = res;
return r;
} else if (rnk(x)==1) {
usz wia = a(w)->ia;
usz xia = a(x)->ia;
// TODO O(wia×xia) for small wia
i32* rp; B r = m_i32arrv(&rp, xia);
H_b2i* map = m_b2i(64);
BS2B xgetU = TI(x).getU;
BS2B wgetU = TI(w).getU;
for (usz i = 0; i < wia; i++) {
bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had);
if (!had) map->a[p].val = i;
}
for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, xgetU(x,i), wia);
free_b2i(map); dec(w); dec(x);
return r;
}
}
for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, xgetU(x,i), wia);
free_b2i(map); dec(w); dec(x);
return r;
return c2(rt_indexOf, w, x);
}
extern B rt_memberOf;