@@ -35,7 +35,7 @@ in_range() -> bool {
3535template <typename From, typename To>
3636[[nodiscard]] auto
3737convert (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 {
4848template <typename From, typename To, typename Transform>
4949[[nodiscard]] auto
5050convert (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
5858convert<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
7373convert<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
9898convert<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 {
204204template <>
205205[[nodiscard]] auto
206206convert<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
213213template <typename T>
214214[[nodiscard]] static auto
215215value_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
221221template <>
222222[[nodiscard]] auto
223223convert<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
240240convert<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 <>
257257convert<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 <>
305305convert<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 {
353353template <>
354354[[nodiscard]] auto
355355convert<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) {
369369template <>
370370[[nodiscard]] auto
371371convert<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) {
592592A
593593jticvt (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