Skip to content

Commit a8eb922

Browse files
committed
Refactor jtDfromX()
1 parent 009a35c commit a8eb922

1 file changed

Lines changed: 10 additions & 21 deletions

File tree

jsrc/conversions.cpp

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
/* Conversions Amongst Internal Types */
55

66
#include <algorithm>
7+
#include <limits>
8+
#include <numeric>
79

810
#include "array.hpp"
911
extern "C" {
@@ -232,27 +234,14 @@ jtIfromX(J jt, A w, void *yv) {
232234

233235
static B
234236
jtDfromX(J jt, A w, void *yv) {
235-
D d, *x = (D *)yv /*,dm,dp*/;
236-
I c, i, n, *v, wn;
237-
X p, *wv;
238-
// dp=1.7976931348623157e308; dm=-dp;
239-
wn = AN(w);
240-
wv = XAV(w);
241-
for (i = 0; i < wn; ++i) {
242-
p = wv[i];
243-
n = AN(p);
244-
v = AV(p) + n - 1;
245-
c = *v;
246-
if (c == XPINF)
247-
d = inf;
248-
else if (c == XNINF)
249-
d = infm;
250-
else {
251-
d = 0.0;
252-
DQ(n, d = *v-- + d * XBASE;);
253-
}
254-
x[i] = d;
255-
}
237+
auto const wv = XAV(w);
238+
std::transform(wv, wv + AN(w), static_cast<D *>(yv), [](auto p) {
239+
auto const n = AN(p);
240+
auto const v = std::reverse_iterator(AV(p) + n);
241+
if (*v == XPINF) return inf;
242+
if (*v == XNINF) return infm;
243+
return std::accumulate(v, v + n, 0.0, [](auto d, auto v) { return v + d * XBASE; });
244+
});
256245
return 1;
257246
}
258247

0 commit comments

Comments
 (0)