native vec⊐scalar
This commit is contained in:
parent
fdcb158ca5
commit
27b1e9ed8c
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user