fix distance<unsigned>

This commit is contained in:
BlackMATov
2021-02-28 13:40:50 +07:00
parent 29755fe067
commit 9cf33dd16d
3 changed files with 22 additions and 9 deletions

View File

@@ -339,13 +339,22 @@ namespace vmath_hpp
template < typename T >
[[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T>
constexpr distance(T x, T y) noexcept {
return length(y - x);
if constexpr ( std::is_unsigned_v<T> ) {
return x < y ? (y - x) : (x - y);
} else {
return length(x - y);
}
}
template < typename T >
[[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, T>
constexpr distance2(T x, T y) noexcept {
return length2(y - x);
if constexpr ( std::is_unsigned_v<T> ) {
const T d = x < y ? (y - x) : (x - y);
return d * d;
} else {
return length2(x - y);
}
}
template < typename T >
@@ -396,11 +405,7 @@ namespace vmath_hpp
template < typename T >
[[nodiscard]] std::enable_if_t<std::is_arithmetic_v<T>, bool>
constexpr approx(T x, T y, T epsilon) noexcept {
if constexpr ( std::is_unsigned_v<T> ) {
return (x < y ? (y - x) : (x - y)) <= epsilon;
} else {
return abs(x - y) <= epsilon;
}
return distance(x, y) <= epsilon;
}
template < typename T >

View File

@@ -954,12 +954,12 @@ namespace vmath_hpp
template < typename T, std::size_t Size >
[[nodiscard]] constexpr T distance(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return length(ys - xs);
return length(xs - ys);
}
template < typename T, std::size_t Size >
[[nodiscard]] constexpr T distance2(const vec<T, Size>& xs, const vec<T, Size>& ys) {
return length2(ys - xs);
return length2(xs - ys);
}
template < typename T, typename U

View File

@@ -120,9 +120,17 @@ TEST_CASE("vmath/fun") {
STATIC_CHECK(rlength2(10.f) == uapprox(0.01f));
STATIC_CHECK(rlength2(-10.f) == uapprox(0.01f));
STATIC_CHECK(distance(5, 10) == 5);
STATIC_CHECK(distance(10, 5) == 5);
STATIC_CHECK(distance(5u, 10u) == 5);
STATIC_CHECK(distance(10u, 5u) == 5);
STATIC_CHECK(distance(5.f, 10.f) == uapprox(5.f));
STATIC_CHECK(distance(-5.f, -10.f) == uapprox(5.f));
STATIC_CHECK(distance2(5, 10) == 25);
STATIC_CHECK(distance2(10, 5) == 25);
STATIC_CHECK(distance2(5u, 10u) == 25);
STATIC_CHECK(distance2(10u, 5u) == 25);
STATIC_CHECK(distance2(5.f, 10.f) == uapprox(25.f));
STATIC_CHECK(distance2(-5.f, -10.f) == uapprox(25.f));