From 96ef6ae9ba5ec7c1d4544478fbd464c53fd7411c Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Mon, 4 Aug 2014 01:00:49 +0200 Subject: [PATCH 1/3] Fixed infinite loop in isfinite function with GCC #221 --- glm/gtx/compatibility.inl | 4 +++- readme.txt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/glm/gtx/compatibility.inl b/glm/gtx/compatibility.inl index d08ffb82..e50f3df6 100644 --- a/glm/gtx/compatibility.inl +++ b/glm/gtx/compatibility.inl @@ -7,6 +7,8 @@ // File : glm/gtx/compatibility.inl /////////////////////////////////////////////////////////////////////////////////////////////////// +#include + namespace glm { // isfinite @@ -21,7 +23,7 @@ namespace glm # elif(GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID) return _isfinite(x) != 0; # else - return isfinite(x) != 0; + return x >= std::numeric_limits::min() && x <= std::numeric_limits::max(); # endif } diff --git a/readme.txt b/readme.txt index 5320c51d..f1214670 100644 --- a/readme.txt +++ b/readme.txt @@ -42,6 +42,7 @@ GLM 0.9.5.5: 2014-XX-XX - Fixed std::nextafter not supported with C++11 on Android #213 - Fixed missing value_type for dual quaternion - Fixed return type of dual quaternion length +- Fixed infinite loop in isfinite function with GCC #221 ================================================================================ GLM 0.9.5.4: 2014-06-21 From f916339ca7722389d4eb560e885180f5b73e6351 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Mon, 4 Aug 2014 01:18:34 +0200 Subject: [PATCH 2/3] Rely on C++11 to implement isinf and isnan --- glm/detail/func_common.inl | 12 +++++++----- readme.txt | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/glm/detail/func_common.inl b/glm/detail/func_common.inl index 4026e0c8..814b0a93 100644 --- a/glm/detail/func_common.inl +++ b/glm/detail/func_common.inl @@ -713,7 +713,9 @@ namespace detail std::numeric_limits::is_iec559, "'isnan' only accept floating-point inputs"); -# if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_INTEL)) +# if(GLM_LANG & GLM_LANG_CXX11_FLAG) + return std::isnan(x); +# elif(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_INTEL)) return _isnan(x) != 0; # elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) # if(GLM_PLATFORM & GLM_PLATFORM_ANDROID && __cplusplus < 201103L) @@ -780,11 +782,11 @@ namespace detail GLM_FUNC_QUALIFIER bool isinf( genType const & x) { - GLM_STATIC_ASSERT( - std::numeric_limits::is_iec559, - "'isinf' only accept floating-point inputs"); + GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'isinf' only accept floating-point inputs"); -# if(GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC)) +# if(GLM_LANG & GLM_LANG_CXX11_FLAG) + return std::isinf(x); +# elif(GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC)) return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; # elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) # if(GLM_PLATFORM & GLM_PLATFORM_ANDROID && __cplusplus < 201103L) diff --git a/readme.txt b/readme.txt index f1214670..d9005474 100644 --- a/readme.txt +++ b/readme.txt @@ -43,6 +43,7 @@ GLM 0.9.5.5: 2014-XX-XX - Fixed missing value_type for dual quaternion - Fixed return type of dual quaternion length - Fixed infinite loop in isfinite function with GCC #221 +- Rely on C++11 to implement isinf and isnan ================================================================================ GLM 0.9.5.4: 2014-06-21 From 041276c93d2908b5fd11b640bb09efd36f3a55e3 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 31 Aug 2014 22:25:40 -0400 Subject: [PATCH 3/3] Fix 'nextafter*' for android build issue. #217 --- glm/gtc/ulp.inl | 10 +++++++--- readme.txt | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/glm/gtc/ulp.inl b/glm/gtc/ulp.inl index 91846b22..be2770f9 100644 --- a/glm/gtc/ulp.inl +++ b/glm/gtc/ulp.inl @@ -204,7 +204,7 @@ namespace glm # elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) return detail::nextafterf(x, FLT_MAX); # elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) - return _nextafterf(x, FLT_MAX); + return __builtin_nextafterf(x, FLT_MAX); # else return nextafterf(x, FLT_MAX); # endif @@ -217,6 +217,8 @@ namespace glm return std::nextafter(x, std::numeric_limits::max()); # elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) return detail::nextafter(x, std::numeric_limits::max()); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, FLT_MAX); # else return nextafter(x, DBL_MAX); # endif @@ -238,7 +240,7 @@ namespace glm # elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) return detail::nextafterf(x, FLT_MIN); # elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) - return _nextafterf(x, FLT_MIN); + return __builtin_nextafterf(x, FLT_MIN); # else return nextafterf(x, FLT_MIN); # endif @@ -248,8 +250,10 @@ namespace glm { # if((GLM_LANG & GLM_LANG_CXX11_FLAG) && !(GLM_PLATFORM & GLM_PLATFORM_ANDROID)) return std::nextafter(x, std::numeric_limits::min()); -# elif((GLM_PLATFORM & GLM_PLATFORM_ANDROID) || (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) +# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) return _nextafter(x, DBL_MIN); +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return __builtin_nextafter(x, DBL_MIN); # else return nextafter(x, DBL_MIN); # endif diff --git a/readme.txt b/readme.txt index 5581eb21..cc17c1f7 100644 --- a/readme.txt +++ b/readme.txt @@ -50,7 +50,7 @@ GLM 0.9.6.0: 2014-XX-XX ================================================================================ GLM 0.9.5.5: 2014-XX-XX -------------------------------------------------------------------------------- -- Fixed std::nextafter not supported with C++11 on Android #213 +- Fixed std::nextafter not supported with C++11 on Android #217 - Fixed missing value_type for dual quaternion - Fixed return type of dual quaternion length - Fixed infinite loop in isfinite function with GCC #221