Skip to content

Commit 034ff43

Browse files
committed
Refactor jtXfromI()
1 parent 285e7be commit 034ff43

1 file changed

Lines changed: 15 additions & 16 deletions

File tree

jsrc/conversions.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -133,23 +133,22 @@ jtXfromB(J jt, A w, void *yv) {
133133

134134
static B
135135
jtXfromI(J jt, A w, void *yv) {
136-
B b;
137-
I c, d, i, j, n, r, u[XIDIG], *v;
138-
X *x;
139-
n = AN(w);
140-
v = AV(w);
141-
x = (X *)yv;
142-
for (i = 0; i < n; ++i) {
143-
c = v[i];
144-
b = c == IMIN;
145-
d = b ? -(1 + c) : ABS(c);
146-
j = 0;
147-
DO(XIDIG, u[i] = r = d % XBASE; d = d / XBASE; if (r) j = i;);
148-
++j;
136+
I u[XIDIG];
137+
auto const v = AV(w);
138+
std::transform(v, v + AN(w), static_cast<X *>(yv), [&](auto c) {
139+
auto const b = c == IMIN;
140+
auto d = b ? -(1 + c) : std::abs(c);
141+
int64_t length = 0;
142+
for (int64_t i = 0; i < XIDIG; ++i) {
143+
u[i] = d % XBASE;
144+
d = d / XBASE;
145+
if (u[i]) length = i;
146+
}
147+
++length;
149148
*u += b;
150-
if (0 > c) DO(XIDIG, u[i] = -u[i];);
151-
x[i] = jtvec(jt, INT, j, u);
152-
}
149+
if (0 > c) std::transform(u, u + XIDIG, u, [](auto v) { return -v; });
150+
return jtvec(jt, INT, length, u);
151+
});
153152
return !jt->jerr;
154153
}
155154

0 commit comments

Comments
 (0)