// ArduinoJson - https://arduinojson.org // Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wconversion" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wconversion" #endif #include #include #include #include ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE // uint32 -> int32 // uint64 -> int32 template typename enable_if::value && is_unsigned::value && is_integral::value && sizeof(TOut) <= sizeof(TIn), bool>::type canConvertNumber(TIn value) { return value <= TIn(numeric_limits::highest()); } // uint32 -> int64 template typename enable_if::value && is_unsigned::value && is_integral::value && sizeof(TIn) < sizeof(TOut), bool>::type canConvertNumber(TIn) { return true; } // uint32 -> float // int32 -> float template typename enable_if::value && is_floating_point::value, bool>::type canConvertNumber(TIn) { return true; } // int64 -> int32 template typename enable_if::value && is_signed::value && is_integral::value && is_signed::value && sizeof(TOut) < sizeof(TIn), bool>::type canConvertNumber(TIn value) { return value >= TIn(numeric_limits::lowest()) && value <= TIn(numeric_limits::highest()); } // int32 -> int32 // int32 -> int64 template typename enable_if::value && is_signed::value && is_integral::value && is_signed::value && sizeof(TIn) <= sizeof(TOut), bool>::type canConvertNumber(TIn) { return true; } // int32 -> uint32 // int32 -> uint64 template typename enable_if::value && is_signed::value && is_integral::value && is_unsigned::value && sizeof(TOut) >= sizeof(TIn), bool>::type canConvertNumber(TIn value) { if (value < 0) return false; return TOut(value) <= numeric_limits::highest(); } // int32 -> uint16 template typename enable_if::value && is_signed::value && is_integral::value && is_unsigned::value && sizeof(TOut) < sizeof(TIn), bool>::type canConvertNumber(TIn value) { if (value < 0) return false; return value <= TIn(numeric_limits::highest()); } // float32 -> int16 // float64 -> int32 template typename enable_if::value && is_integral::value && sizeof(TOut) < sizeof(TIn), bool>::type canConvertNumber(TIn value) { return value >= numeric_limits::lowest() && value <= numeric_limits::highest(); } // float32 -> int32 // float32 -> uint32 // float32 -> int64 // float32 -> uint64 // float64 -> int64 // float64 -> uint64 template typename enable_if::value && is_integral::value && sizeof(TOut) >= sizeof(TIn), bool>::type canConvertNumber(TIn value) { // Avoid error "9.22337e+18 is outside the range of representable values of // type 'long'" return value >= numeric_limits::lowest() && value <= FloatTraits::template highest_for(); } template TOut convertNumber(TIn value) { return canConvertNumber(value) ? TOut(value) : 0; } ARDUINOJSON_END_PRIVATE_NAMESPACE #if defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif