Skip to content

Commit 445aa6a

Browse files
committed
Refactor conversions to complex (Z)
1 parent 2fc34dc commit 445aa6a

File tree

1 file changed

+9
-20
lines changed

1 file changed

+9
-20
lines changed

jsrc/conversions.cpp

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,15 @@ convert(J jt, array w, void *yv, Transform t) -> bool {
6969
template <typename From, typename To>
7070
[[nodiscard]] auto
7171
convert(J jt, array w, void *yv) -> bool {
72-
if constexpr (!in_range<To, From>()) {
72+
if constexpr (std::is_same_v<To, Z>) {
73+
return convert<From, To>(jt, w, yv, [](auto v) { return To{.re = static_cast<D>(v), .im = {}}; });
74+
} else if constexpr (!in_range<To, From>()) {
7375
return convert<From, To>(jt, w, yv, [](auto v) { return value_if(in_range<To>(v), v); });
76+
} else {
77+
auto *v = pointer_to_values<From>(w);
78+
std::copy(v, v + AN(w), static_cast<To *>(yv));
79+
return true;
7480
}
75-
auto *v = pointer_to_values<From>(w);
76-
std::copy(v, v + AN(w), static_cast<To *>(yv));
77-
return true;
7881
}
7982

8083
template <>
@@ -349,20 +352,6 @@ convert<Q, X>(J jt, array w, void *yv) -> bool {
349352
return convert<Q, X>(jt, w, yv, [&](auto v) { return value_if(jtequ(jt, iv1, v.d), v.n); }) && !jt->jerr;
350353
}
351354

352-
template <typename T>
353-
auto
354-
set_real_part(Z *z, int64_t n, T *t) {
355-
for (int64_t i = 0; i < n; ++i) { z[i].re = t[i]; }
356-
}
357-
358-
// Imaginary parts have already been cleared
359-
template <>
360-
[[nodiscard]] auto
361-
convert<D, Z>(J jt, array w, void *yv) -> bool {
362-
set_real_part(static_cast<Z *>(yv), AN(w), pointer_to_values<double>(w));
363-
return true;
364-
}
365-
366355
// Convert the data in w to the type t. w and t must be noun types. array new buffer is always created (with a
367356
// copy of the data if w is already of the right type), and returned in *y. Result is
368357
// 0 if error, 1 if success. If the conversion loses precision, error is returned
@@ -459,14 +448,14 @@ jtccvt(J jt, I tflagged, array w, array *y) -> bool {
459448
GATV(d, XNUM, n, r, s);
460449
return convert<bool, X>(jt, w, pointer_to_values<int64_t>(d)) && convert<X, Q>(jt, d, yv);
461450
case CVCASE(FLX, B01X): return convert<bool, double>(jt, w, yv);
462-
case CVCASE(CMPXX, B01X): set_real_part(static_cast<Z *>(yv), n, pointer_to_values<B>(w)); return true;
451+
case CVCASE(CMPXX, B01X): return convert<bool, Z>(jt, w, yv);
463452
case CVCASE(B01X, INTX): return convert<I, bool>(jt, w, yv);
464453
case CVCASE(XNUMX, INTX): return convert<I, X>(jt, w, yv);
465454
case CVCASE(RATX, INTX):
466455
GATV(d, XNUM, n, r, s);
467456
return convert<I, X>(jt, w, pointer_to_values<int64_t>(d)) && convert<X, Q>(jt, d, yv);
468457
case CVCASE(FLX, INTX): return convert<int64_t, double>(jt, w, yv);
469-
case CVCASE(CMPXX, INTX): set_real_part(static_cast<Z *>(yv), n, pointer_to_values<I>(w)); return true;
458+
case CVCASE(CMPXX, INTX): return convert<int64_t, Z>(jt, w, yv);
470459
case CVCASE(B01X, FLX): return convert<D, bool>(jt, w, yv, ((I)jtinplace & JTNOFUZZ) != 0 ? 0.0 : FUZZ);
471460
case CVCASE(INTX, FLX): return convert<D, I>(jt, w, yv, ((I)jtinplace & JTNOFUZZ) != 0 ? 0.0 : FUZZ);
472461
case CVCASE(XNUMX, FLX):

0 commit comments

Comments
 (0)