Skip to content

Commit 2fc34dc

Browse files
committed
Replace std::copy_n() with convert()
Also use std::copy_n() instead of std::copy() in convert() Also also, I kind of understand, but wtf: std::numeric_limits<T>::min() and std::numeric_limits<T>::lowest() Now fixed behaviour with double (and bool)
1 parent ee1f07a commit 2fc34dc

1 file changed

Lines changed: 8 additions & 5 deletions

File tree

jsrc/conversions.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@ fuzzy_equal(double u, double v, double fuzz) -> bool {
2525
template <typename T, typename V>
2626
[[nodiscard]] constexpr auto
2727
in_range(V value) -> bool {
28-
return std::numeric_limits<T>::min() <= value && value <= std::numeric_limits<T>::max();
28+
if constexpr (std::is_same_v<bool, V>)
29+
return true;
30+
else
31+
return std::numeric_limits<T>::lowest() <= value && value <= std::numeric_limits<T>::max();
2932
}
3033

3134
template <typename T, typename V>
3235
[[nodiscard]] constexpr auto
3336
in_range() -> bool {
34-
return in_range<T>(std::numeric_limits<V>::min()) && in_range<T>(std::numeric_limits<V>::max());
37+
return in_range<T>(std::numeric_limits<V>::lowest()) && in_range<T>(std::numeric_limits<V>::max());
3538
}
3639

3740
template <typename T>
@@ -450,19 +453,19 @@ jtccvt(J jt, I tflagged, array w, array *y) -> bool {
450453
}
451454
}
452455
switch (CVCASE(CTTZ(t), CTTZ(wt))) {
453-
case CVCASE(INTX, B01X): std::copy_n(pointer_to_values<B>(w), n, static_cast<I *>(yv)); return true;
456+
case CVCASE(INTX, B01X): return convert<bool, int64_t>(jt, w, yv);
454457
case CVCASE(XNUMX, B01X): return convert<bool, X>(jt, w, yv);
455458
case CVCASE(RATX, B01X):
456459
GATV(d, XNUM, n, r, s);
457460
return convert<bool, X>(jt, w, pointer_to_values<int64_t>(d)) && convert<X, Q>(jt, d, yv);
458-
case CVCASE(FLX, B01X): std::copy_n(pointer_to_values<B>(w), n, static_cast<D *>(yv)); return true;
461+
case CVCASE(FLX, B01X): return convert<bool, double>(jt, w, yv);
459462
case CVCASE(CMPXX, B01X): set_real_part(static_cast<Z *>(yv), n, pointer_to_values<B>(w)); return true;
460463
case CVCASE(B01X, INTX): return convert<I, bool>(jt, w, yv);
461464
case CVCASE(XNUMX, INTX): return convert<I, X>(jt, w, yv);
462465
case CVCASE(RATX, INTX):
463466
GATV(d, XNUM, n, r, s);
464467
return convert<I, X>(jt, w, pointer_to_values<int64_t>(d)) && convert<X, Q>(jt, d, yv);
465-
case CVCASE(FLX, INTX): std::copy_n(pointer_to_values<I>(w), n, static_cast<D *>(yv)); return true;
468+
case CVCASE(FLX, INTX): return convert<int64_t, double>(jt, w, yv);
466469
case CVCASE(CMPXX, INTX): set_real_part(static_cast<Z *>(yv), n, pointer_to_values<I>(w)); return true;
467470
case CVCASE(B01X, FLX): return convert<D, bool>(jt, w, yv, ((I)jtinplace & JTNOFUZZ) != 0 ? 0.0 : FUZZ);
468471
case CVCASE(INTX, FLX): return convert<D, I>(jt, w, yv, ((I)jtinplace & JTNOFUZZ) != 0 ? 0.0 : FUZZ);

0 commit comments

Comments
 (0)