From bfdaa9173ed5b20dd5a9cd83241ce44fc0eff960 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 18 Sep 2013 17:30:30 +0000 Subject: [PATCH] Use std::isfinite() for wxFinite() for C++11 compilers. This should fix compilation with MinGW 4.8.1 cross-compiler in C++11 mode as it doesn't seem to provide finite() any more then. Also, only defined wxFinite() and wxIsNaN() for C++, not C. This makes the checks for __cplusplus >= 201103 simpler and is consistent with how wxIsSameDouble() and wxRound() were already only defined for C++ (this is also the source of most of the changes in this diff, viewing it ignoring whitespace will show the only real changes). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74837 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/math.h | 71 ++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/include/wx/math.h b/include/wx/math.h index 3ee45490e0..2787163f78 100644 --- a/include/wx/math.h +++ b/include/wx/math.h @@ -51,9 +51,13 @@ #endif -/* unknown __VISAGECC__, __SYMANTECCC__ */ +#ifdef __cplusplus -#if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) +/* Any C++11 compiler should provide isfinite() */ +#if __cplusplus >= 201103 + #include + #define wxFinite(x) std::isfinite(x) +#elif defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) #include #define wxFinite(x) _finite(x) #elif defined(__MINGW64__) || defined(__clang__) @@ -89,47 +93,46 @@ #define wxIsNaN(x) ((x) != (x)) #endif -#ifdef __cplusplus +#ifdef __INTELC__ - #ifdef __INTELC__ + inline bool wxIsSameDouble(double x, double y) + { + // VZ: this warning, given for operators==() and !=() is not wrong, as == + // shouldn't be used with doubles, but we get too many of them and + // removing these operators is probably not a good idea + // + // Maybe we should always compare doubles up to some "epsilon" precision + #pragma warning(push) - inline bool wxIsSameDouble(double x, double y) - { - // VZ: this warning, given for operators==() and !=() is not wrong, as == - // shouldn't be used with doubles, but we get too many of them and - // removing these operators is probably not a good idea - // - // Maybe we should always compare doubles up to some "epsilon" precision - #pragma warning(push) + // floating-point equality and inequality comparisons are unreliable + #pragma warning(disable: 1572) - // floating-point equality and inequality comparisons are unreliable - #pragma warning(disable: 1572) + return x == y; - return x == y; + #pragma warning(pop) + } - #pragma warning(pop) - } +#else /* !__INTELC__ */ + wxGCC_WARNING_SUPPRESS(float-equal) + inline bool wxIsSameDouble(double x, double y) { return x == y; } + wxGCC_WARNING_RESTORE(float-equal) - #else /* !__INTELC__ */ - wxGCC_WARNING_SUPPRESS(float-equal) - inline bool wxIsSameDouble(double x, double y) { return x == y; } - wxGCC_WARNING_RESTORE(float-equal) +#endif /* __INTELC__/!__INTELC__ */ - #endif /* __INTELC__/!__INTELC__ */ +inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } - inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } +inline int wxRound(double x) +{ + wxASSERT_MSG( x > INT_MIN - 0.5 && x < INT_MAX + 0.5, + wxT("argument out of supported range") ); + + #if defined(HAVE_ROUND) + return int(round(x)); + #else + return (int)(x < 0 ? x - 0.5 : x + 0.5); + #endif +} - inline int wxRound(double x) - { - wxASSERT_MSG( x > INT_MIN - 0.5 && x < INT_MAX + 0.5, - wxT("argument out of supported range") ); - - #if defined(HAVE_ROUND) - return int(round(x)); - #else - return (int)(x < 0 ? x - 0.5 : x + 0.5); - #endif - } #endif /* __cplusplus */ -- 2.45.2