From 7b4f4380653de678e59626fa7dc4d92904ff2b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 14 Apr 2017 16:53:03 +0200 Subject: [PATCH] Math/Algorithm: Fix NumberEquals for signed integers --- include/Nazara/Math/Algorithm.inl | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/include/Nazara/Math/Algorithm.inl b/include/Nazara/Math/Algorithm.inl index 9a0eaabfb..612cdf952 100644 --- a/include/Nazara/Math/Algorithm.inl +++ b/include/Nazara/Math/Algorithm.inl @@ -97,6 +97,29 @@ namespace Nz return 0; } + + template /*constexpr*/ std::enable_if_t::value || !std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) + { + if (b > a) + std::swap(a, b); + + T diff = a - b; + return diff <= maxDifference; + } + + template /*constexpr*/ std::enable_if_t::value && std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) + { + if (b > a) + std::swap(a, b); + + if ((b < 0) && (a > std::numeric_limits::max() + b)) + return false; + + if ((b > 0) && (a < std::numeric_limits::min() + b)) + return false; + + return std::abs(a - b) <= maxDifference; + } } /*! @@ -565,11 +588,7 @@ namespace Nz //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline bool NumberEquals(T a, T b, T maxDifference) { - if (b > a) - std::swap(a, b); - - T diff = a - b; - return diff <= maxDifference; + return Detail::NumberEquals(a, b, maxDifference); } /*!