@@ -69,12 +69,15 @@ convert(J jt, array w, void *yv, Transform t) -> bool {
6969template <typename From, typename To>
7070[[nodiscard]] auto
7171convert (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
8083template <>
@@ -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