Math/Algorithm: Optimize NumberEquals unsigned and float cases

This commit is contained in:
Lynix 2017-04-22 15:08:43 +02:00
parent d8a2d08e27
commit 883d7b02a7
1 changed files with 10 additions and 9 deletions

View File

@ -98,7 +98,13 @@ namespace Nz
return 0; return 0;
} }
template<typename T> /*constexpr*/ std::enable_if_t<!std::is_signed<T>::value || !std::is_integral<T>::value, bool> NumberEquals(T a, T b, T maxDifference) template<typename T> /*constexpr*/ std::enable_if_t<std::is_floating_point<T>::value, bool> NumberEquals(T a, T b, T maxDifference)
{
T diff = std::abs(a - b);
return diff <= maxDifference;
}
template<typename T> /*constexpr*/ std::enable_if_t<!std::is_signed<T>::value || (!std::is_integral<T>::value && !std::is_floating_point<T>::value), bool> NumberEquals(T a, T b, T maxDifference)
{ {
if (b > a) if (b > a)
std::swap(a, b); std::swap(a, b);
@ -112,13 +118,8 @@ namespace Nz
if (b > a) if (b > a)
std::swap(a, b); std::swap(a, b);
if ((b < 0) && (a > std::numeric_limits<T>::max() + b)) using UnsignedT = std::make_unsigned_t<T>;
return false; return static_cast<UnsignedT>(a) - static_cast<UnsignedT>(b) <= static_cast<UnsignedT>(maxDifference);
if ((b > 0) && (a < std::numeric_limits<T>::min() + b))
return false;
return std::abs(a - b) <= maxDifference;
} }
} }
@ -487,7 +488,7 @@ namespace Nz
template<typename T, typename T2> template<typename T, typename T2>
constexpr T Lerp(const T& from, const T& to, const T2& interpolation) constexpr T Lerp(const T& from, const T& to, const T2& interpolation)
{ {
return from + interpolation * (to - from); return static_cast<T>(from + interpolation * (to - from));
} }
/*! /*!