// Copyright Benoit Blanchon 2014-2017 // MIT License // // Arduino JSON library // https://bblanchon.github.io/ArduinoJson/ // If you like this project, please add a star! #pragma once // If Visual Studo #if defined(_MSC_VER) #include #include namespace ArduinoJson { namespace Polyfills { template bool isNaN(T x) { return _isnan(x) != 0; } template bool isInfinity(T x) { return !_finite(x); } template T nan() { return std::numeric_limits::quiet_NaN(); } template T inf() { return std::numeric_limits::infinity(); } } } #else #include // GCC warning: "conversion to 'float' from 'double' may alter its value" #ifdef __GNUC__ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #pragma GCC diagnostic push #endif #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) #pragma GCC diagnostic ignored "-Wfloat-conversion" #else #pragma GCC diagnostic ignored "-Wconversion" #endif #endif // Workaround for libs that #undef isnan or isinf // https://bblanchon.github.io/ArduinoJson//issues/284 #if !defined(isnan) || !defined(isinf) namespace std {} #endif namespace ArduinoJson { namespace Polyfills { template bool isNaN(T x) { // Workaround for libs that #undef isnan // https://bblanchon.github.io/ArduinoJson//issues/284 #ifndef isnan using namespace std; #endif return isnan(x); } #if defined(_GLIBCXX_HAVE_ISNANL) && _GLIBCXX_HAVE_ISNANL template <> inline bool isNaN(double x) { return isnanl(x); } #endif #if defined(_GLIBCXX_HAVE_ISNANF) && _GLIBCXX_HAVE_ISNANF template <> inline bool isNaN(float x) { return isnanf(x); } #endif template bool isInfinity(T x) { // Workaround for libs that #undef isinf // https://bblanchon.github.io/ArduinoJson//issues/284 #ifndef isinf using namespace std; #endif return isinf(x); } #if defined(_GLIBCXX_HAVE_ISINFL) && _GLIBCXX_HAVE_ISINFL template <> inline bool isInfinity(double x) { return isinfl(x); } #endif #if defined(_GLIBCXX_HAVE_ISINFF) && _GLIBCXX_HAVE_ISINFF template <> inline bool isInfinity(float x) { return isinff(x); } #endif template T nan() { return static_cast(NAN); } template T inf() { return static_cast(INFINITY); } #if defined(__GNUC__) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #pragma GCC diagnostic pop #endif #endif } } #endif