Skip to content

Commit 45fef08

Browse files
committed
Replace *AV() macros with pointer_to_values()
1 parent e9e7f41 commit 45fef08

1 file changed

Lines changed: 42 additions & 42 deletions

File tree

jsrc/conversions.cpp

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ in_range() -> bool {
3535
template <typename From, typename To>
3636
[[nodiscard]] auto
3737
convert(J jt, array w, void *yv) -> bool {
38-
From *v = reinterpret_cast<From *>(UAV(w));
38+
auto *v = pointer_to_values<From>(w);
3939
if constexpr (!in_range<To, From>()) {
4040
// TODO: replace with short circuiting solution
4141
auto out = static_cast<To *>(yv);
@@ -48,7 +48,7 @@ convert(J jt, array w, void *yv) -> bool {
4848
template <typename From, typename To, typename Transform>
4949
[[nodiscard]] auto
5050
convert(J jt, array w, void *yv, Transform t) -> bool {
51-
From *v = reinterpret_cast<From*>(UAV(w));
51+
auto *v = pointer_to_values<From>(w);
5252
std::transform(v, v + AN(w), static_cast<To*>(yv), t);
5353
return 1;
5454
}
@@ -57,7 +57,7 @@ template <>
5757
[[nodiscard]] auto
5858
convert<D, bool>(J jt, A w, void *yv, D fuzz) -> bool {
5959
auto n = AN(w);
60-
auto v = DAV(w);
60+
auto v = pointer_to_values<double>(w);
6161
auto x = (B *)yv;
6262
DQ(n, auto p = *v++; if (p < -2 || 2 < p) return 0; // handle infinities
6363
I val = 2;
@@ -72,7 +72,7 @@ template <>
7272
[[nodiscard]] auto
7373
convert<D, I>(J jt, A w, void *yv, D fuzz) -> bool {
7474
auto n = AN(w);
75-
auto v = DAV(w);
75+
auto v = pointer_to_values<double>(w);
7676
auto x = (I *)yv;
7777
for (int64_t i = 0; i < n; ++i) {
7878
auto const p = v[i];
@@ -97,7 +97,7 @@ template <>
9797
[[nodiscard]] auto
9898
convert<Z, D>(J jt, A w, void *yv, D fuzz) -> bool {
9999
auto const n = AN(w);
100-
auto const *v = ZAV(w);
100+
auto const *v = pointer_to_values<Z>(w);
101101
auto x = (D *)yv;
102102
if (fuzz)
103103
DQ(
@@ -172,7 +172,7 @@ jtxd1(J jt, D p, I mode) {
172172
if (p == -inf) return jtvci(jt, XNINF);
173173
A t;
174174
GAT0(t, INT, 30, 1);
175-
auto u = AV(t);
175+
auto u = pointer_to_values(t);
176176
int64_t m = 0;
177177
auto d = std::abs(p);
178178
while (0 < d) {
@@ -182,7 +182,7 @@ jtxd1(J jt, D p, I mode) {
182182
d = q;
183183
if (m == AN(t)) {
184184
RZ(t = jtext(jt, 0, t));
185-
u = AV(t);
185+
u = pointer_to_values(t);
186186
}
187187
}
188188
if (!m) {
@@ -204,24 +204,24 @@ convert<D, X>(J jt, A w, void *yv, I mode) -> bool {
204204
template <>
205205
[[nodiscard]] auto
206206
convert<X, bool>(J jt, A w, void *yv) -> bool {
207-
auto v = XAV(w);
207+
auto v = pointer_to_values<X>(w);
208208
auto x = (B *)yv;
209-
DO(AN(w), A q = v[i]; I e = AV(q)[0]; if ((AN(q) ^ 1) | (e & -2)) return 0; x[i] = (B)e;);
209+
DO(AN(w), A q = v[i]; I e = pointer_to_values(q)[0]; if ((AN(q) ^ 1) | (e & -2)) return 0; x[i] = (B)e;);
210210
return 1;
211211
}
212212

213213
template <typename T>
214214
[[nodiscard]] static auto
215215
value_from_X(X p) -> T {
216216
auto const n = AN(p);
217-
auto const v = std::reverse_iterator(AV(p) + n);
217+
auto const v = std::reverse_iterator(pointer_to_values(p) + n);
218218
return std::accumulate(v, v + n, T{}, [](auto d, auto v) { return v + d * XBASE; });
219219
}
220220

221221
template <>
222222
[[nodiscard]] auto
223223
convert<X, I>(J jt, A w, void *yv) -> bool {
224-
auto v = XAV(w);
224+
auto v = pointer_to_values<X>(w);
225225
auto x = (I *)yv;
226226
auto n = AN(w);
227227
X p, q;
@@ -239,7 +239,7 @@ template <>
239239
[[nodiscard]] auto
240240
convert<X, D>(J jt, A w, void *yv) -> bool {
241241
return convert<X, D>(jt, w, yv, [](auto p) {
242-
auto const c = AV(p)[AN(p) - 1];
242+
auto const c = pointer_to_values(p)[AN(p) - 1];
243243
if (c == XPINF) return inf;
244244
if (c == XNINF) return infm;
245245
return value_from_X<double>(p);
@@ -257,7 +257,7 @@ template <>
257257
convert<D, Q>(J jt, A w, void *yv, I mode) -> bool {
258258
if (!(w)) return 0;
259259
auto const n = AN(w);
260-
auto const wv = DAV(w);
260+
auto const wv = pointer_to_values<double>(w);
261261
auto x = (Q *)yv;
262262
D t;
263263
auto tv = 3 + (S *)&t;
@@ -294,7 +294,7 @@ convert<D, Q>(J jt, A w, void *yv, I mode) -> bool {
294294
q.d = jtca(jt, iv1);
295295
}
296296
}
297-
if (neg) inplace_negate(AV(q.n), AN(q.n));
297+
if (neg) inplace_negate(pointer_to_values(q.n), AN(q.n));
298298
*x++ = q;
299299
}
300300
return !jt->jerr;
@@ -305,7 +305,7 @@ template <>
305305
convert<Q, D>(J jt, A w, void *yv) -> bool {
306306
auto const xb = (D)XBASE;
307307
auto const wn = AN(w);
308-
auto const wv = QAV(w);
308+
auto const wv = pointer_to_values<Q>(w);
309309
auto const x = (D *)yv;
310310
auto const nn = 308 / XBASEN;
311311

@@ -321,16 +321,16 @@ convert<Q, D>(J jt, A w, void *yv) -> bool {
321321
for (int64_t i = 0; i < wn; ++i) {
322322
auto const p = wv[i].n;
323323
auto const pn = AN(p);
324-
auto const k = 1 == pn ? AV(p)[0] : 0;
324+
auto const k = 1 == pn ? pointer_to_values(p)[0] : 0;
325325
auto const q = wv[i].d;
326326
auto const qn = AN(q);
327327
if (k == XPINF)
328328
x[i] = inf;
329329
else if (k == XNINF)
330330
x[i] = infm;
331331
else if (pn <= nn && qn <= nn) {
332-
auto const n = add_digits(pn, AV(p));
333-
auto const d = add_digits(qn, AV(q));
332+
auto const n = add_digits(pn, pointer_to_values(p));
333+
auto const d = add_digits(qn, pointer_to_values(q));
334334
x[i] = n / d;
335335
} else {
336336
if (!x2)
@@ -341,7 +341,7 @@ convert<Q, D>(J jt, A w, void *yv) -> bool {
341341
auto const cn = AN(c);
342342
auto const m = MIN(cn, 5);
343343
auto const r = cn - (m + k);
344-
auto const v = AV(c) + cn - m;
344+
auto const v = pointer_to_values(c) + cn - m;
345345
auto const n = add_digits(m, v);
346346
auto d = std::pow(xb, std::abs(r));
347347
x[i] = 0 > r ? n / d : n * d;
@@ -353,7 +353,7 @@ convert<Q, D>(J jt, A w, void *yv) -> bool {
353353
template <>
354354
[[nodiscard]] auto
355355
convert<Q, X>(J jt, A w, void *yv) -> bool {
356-
auto v = QAV(w);
356+
auto v = pointer_to_values<Q>(w);
357357
auto x = (X *)yv;
358358
DQ(AN(w), if (!(jtequ(jt, iv1, v->d))) return 0; *x++ = v->n; ++v;);
359359
return !jt->jerr;
@@ -369,7 +369,7 @@ set_real_part(Z *z, int64_t n, T *t) {
369369
template <>
370370
[[nodiscard]] auto
371371
convert<D, Z>(J jt, A w, void *yv) -> bool {
372-
set_real_part(static_cast<Z*>(yv), AN(w), DAV(w));
372+
set_real_part(static_cast<Z*>(yv), AN(w), pointer_to_values<double>(w));
373373
return 1;
374374
}
375375

@@ -399,8 +399,8 @@ jtccvt(J jt, I tflagged, A w, A *y) {
399399
case 3: // sparse to sparse
400400
t1 = DTYPE(t);
401401
GASPARSE(*y, t, 1, r, s);
402-
yp = PAV(*y);
403-
wp = PAV(w);
402+
yp = pointer_to_values<P>(*y);
403+
wp = pointer_to_values<P>(w);
404404
SPB(yp, a, jtca(jt, SPA(wp, a)));
405405
SPB(yp, i, jtca(jt, SPA(wp, i)));
406406
SPB(yp, e, jtcvt(jt, t1, SPA(wp, e)));
@@ -425,7 +425,7 @@ jtccvt(J jt, I tflagged, A w, A *y) {
425425
auto n = AN(w);
426426
A d;
427427
GA(d, t, n, r, s);
428-
auto yv = voidAV(d); // allocate the same # atoms, even if we will convert fewer
428+
auto yv = pointer_to_values<void>(d); // allocate the same # atoms, even if we will convert fewer
429429
if (tflagged & NOUNCVTVALIDCT) {
430430
I inputn = *(I *)y; // fetch input, in case it is called for
431431
if (inputn > 0) { // if converting the leading values, just update the counts
@@ -441,7 +441,7 @@ jtccvt(J jt, I tflagged, A w, A *y) {
441441
// as n or s[0] since only n atoms will be used. For higher ranks, we need the shape from s. So it's just as well
442442
// that we take the shape from s now
443443
*y = d;
444-
auto wv = voidAV(w); // return the address of the new block
444+
auto wv = pointer_to_values<void>(w); // return the address of the new block
445445
if (t & CMPX) jtfillv(jt, t, n, (C *)yv); // why?? just fill in imaginary parts as we need to
446446
if (!n) return 1;
447447
// Perform the conversion based on data types
@@ -467,12 +467,12 @@ jtccvt(J jt, I tflagged, A w, A *y) {
467467
case CVCASE(XNUMX, B01X): return convert<bool, X>(jt, w, yv);
468468
case CVCASE(RATX, B01X):
469469
GATV(d, XNUM, n, r, s);
470-
return convert<bool, X>(jt, w, AV(d)) && convert<X, Q>(jt, d, yv);
470+
return convert<bool, X>(jt, w, pointer_to_values(d)) && convert<X, Q>(jt, d, yv);
471471
case CVCASE(FLX, B01X): std::copy_n(static_cast<B *>(wv), n, static_cast<D *>(yv)); return 1;
472472
case CVCASE(CMPXX, B01X): set_real_part(static_cast<Z*>(yv), n, static_cast<B*>(wv)); return 1;
473473
case CVCASE(B01X, INTX): return convert<I, bool>(jt, w, yv);
474474
case CVCASE(XNUMX, INTX): return convert<I, X>(jt, w, yv);
475-
case CVCASE(RATX, INTX): GATV(d, XNUM, n, r, s); return convert<I, X>(jt, w, AV(d)) && convert<X, Q>(jt, d, yv);
475+
case CVCASE(RATX, INTX): GATV(d, XNUM, n, r, s); return convert<I, X>(jt, w, pointer_to_values(d)) && convert<X, Q>(jt, d, yv);
476476
case CVCASE(FLX, INTX): std::copy_n(static_cast<I *>(wv), n, static_cast<D *>(yv)); return 1;
477477
case CVCASE(CMPXX, INTX): set_real_part(static_cast<Z *>(yv), n, static_cast<I *>(wv)); return 1;
478478
case CVCASE(B01X, FLX): return convert<D, bool>(jt, w, yv, (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ);
@@ -486,20 +486,20 @@ jtccvt(J jt, I tflagged, A w, A *y) {
486486
case CVCASE(CMPXX, FLX): return convert<D, Z>(jt, w, yv);
487487
case CVCASE(B01X, CMPXX):
488488
GATV(d, FL, n, r, s);
489-
if (!(convert<Z, D>(jt, w, AV(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
489+
if (!(convert<Z, D>(jt, w, pointer_to_values(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
490490
return convert<D, bool>(jt, d, yv, (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ);
491491
case CVCASE(INTX, CMPXX):
492492
GATV(d, FL, n, r, s);
493-
if (!(convert<Z, D>(jt, w, AV(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
493+
if (!(convert<Z, D>(jt, w, pointer_to_values(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
494494
return convert<D, I>(jt, d, yv, (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ);
495495
case CVCASE(XNUMX, CMPXX):
496496
GATV(d, FL, n, r, s);
497-
if (!(convert<Z, D>(jt, w, AV(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
497+
if (!(convert<Z, D>(jt, w, pointer_to_values(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
498498
return convert<D, X>(
499499
jt, d, yv, (jt->xmode & REPSGN(SGNIFNOT(tflagged, XCVTXNUMORIDEX))) | (tflagged >> XCVTXNUMCVX));
500500
case CVCASE(RATX, CMPXX):
501501
GATV(d, FL, n, r, s);
502-
if (!(convert<Z, D>(jt, w, AV(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
502+
if (!(convert<Z, D>(jt, w, pointer_to_values(d), (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ))) return 0;
503503
return convert<D, Q>(
504504
jt, d, yv, (jt->xmode & REPSGN(SGNIFNOT(tflagged, XCVTXNUMORIDEX))) | (tflagged >> XCVTXNUMCVX));
505505
case CVCASE(FLX, CMPXX): return convert<Z, D>(jt, w, yv, (I)jtinplace & JTNOFUZZ ? 0.0 : FUZZ);
@@ -509,21 +509,21 @@ jtccvt(J jt, I tflagged, A w, A *y) {
509509
case CVCASE(FLX, XNUMX): return convert<X, D>(jt, w, yv);
510510
case CVCASE(CMPXX, XNUMX):
511511
GATV(d, FL, n, r, s);
512-
if (!(convert<X, D>(jt, w, AV(d)))) return 0;
512+
if (!(convert<X, D>(jt, w, pointer_to_values(d)))) return 0;
513513
return convert<D, Z>(jt, d, yv);
514514
case CVCASE(B01X, RATX):
515515
GATV(d, XNUM, n, r, s);
516-
if (!(convert<Q, X>(jt, w, AV(d)))) return 0;
516+
if (!(convert<Q, X>(jt, w, pointer_to_values(d)))) return 0;
517517
return convert<X, bool>(jt, d, yv);
518518
case CVCASE(INTX, RATX):
519519
GATV(d, XNUM, n, r, s);
520-
if (!(convert<Q, X>(jt, w, AV(d)))) return 0;
520+
if (!(convert<Q, X>(jt, w, pointer_to_values(d)))) return 0;
521521
return convert<X, I>(jt, d, yv);
522522
case CVCASE(XNUMX, RATX): return convert<Q, X>(jt, w, yv);
523523
case CVCASE(FLX, RATX): return convert<Q, D>(jt, w, yv);
524524
case CVCASE(CMPXX, RATX):
525525
GATV(d, FL, n, r, s);
526-
if (!(convert<Q, D>(jt, w, AV(d)))) return 0;
526+
if (!(convert<Q, D>(jt, w, pointer_to_values(d)))) return 0;
527527
return convert<D, Z>(jt, d, yv);
528528
default: ASSERT(0, EVDOMAIN);
529529
}
@@ -557,16 +557,16 @@ jtbcvt(J jt, C mode, A w) {
557557
// convert the flagged values to float and keep the result as complex
558558
array result = w;
559559
if ((((AN(w) - 1) | (AT(w) & CMPX) - 1)) >= 0) { // not empty AND complex
560-
Z *wv = ZAV(w);
560+
Z *wv = pointer_to_values<Z>(w);
561561
auto flags = std::transform_reduce(wv, wv + AN(w), int64_t{}, std::plus{}, isflag);
562562
if (flags) {
563563
I ipok = SGNIF(jtinplace, JTINPLACEWX) & AC(w); // both sign bits set (<0) if inplaceable
564564
if (flags == AN(w)) {
565565
if (ipok >= 0) GATV(result, INT, AN(w), AR(w), AS(w));
566-
std::transform(wv, wv + AN(w), IAV(result), [&](auto const &z) { return as_integer(z.re); });
566+
std::transform(wv, wv + AN(w), pointer_to_values(result), [&](auto const &z) { return as_integer(z.re); });
567567
} else {
568568
if (ipok >= 0) GATV(result, CMPX, AN(w), AR(w), AS(w));
569-
std::transform(wv, wv + AN(w), ZAV(result), [&](auto const &z) -> Z {
569+
std::transform(wv, wv + AN(w), pointer_to_values<Z>(result), [&](auto const &z) -> Z {
570570
if (isflag(z)) return {.re = (D)as_integer(z.re), .im = 0.0};
571571
return z; // copy floats, and converts any integers back to float
572572
});
@@ -592,10 +592,10 @@ jtbcvt(J jt, C mode, A w) {
592592
A
593593
jticvt(J jt, A w) {
594594
auto const n = AN(w);
595-
auto const* v = DAV(w);
595+
auto const* v = pointer_to_values<double>(w);
596596
A z;
597597
GATV(z, INT, n, AR(w), AS(w));
598-
auto u = AV(z);
598+
auto u = pointer_to_values(z);
599599
for (int64_t i = 0; i < n; ++i) {
600600
auto x = *v++;
601601
if (x < IMIN || FLIMAX <= x) return w; // if conversion will fail, skip it
@@ -619,7 +619,7 @@ jtcvt0(J jt, A w) {
619619
auto const t = AT(w);
620620
auto const n = (t & CMPX) ? 2 * AN(w) : AN(w);
621621
if (n && t & FL + CMPX) {
622-
auto u = DAV(w);
622+
auto u = pointer_to_values<double>(w);
623623
std::transform(u, u + n, u, [](auto v) { return v == 0.0 ? 0.0 : v; });
624624
}
625625
return w;
@@ -648,7 +648,7 @@ jtxco2(J jt, A a, A w) {
648648
A z;
649649
GATV(z, XNUM, 2 * n, r + 1, AS(w));
650650
AS(z)[r] = 2;
651-
memcpy(AV(z), AV(w), 2 * n * SZI);
651+
memcpy(pointer_to_values(z), pointer_to_values(w), 2 * n * SZI);
652652
return z;
653653
}
654654
default: ASSERT(0, EVDOMAIN);

0 commit comments

Comments
 (0)