From e7afef895e08f892fec1590e4215cf400107a26d Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 6 Apr 2022 12:32:21 +0200 Subject: [PATCH] Add FloatTraits::highest_for() --- src/ArduinoJson/Numbers/FloatTraits.hpp | 24 ++++++++++ src/ArduinoJson/Numbers/convertNumber.hpp | 58 ++--------------------- 2 files changed, 29 insertions(+), 53 deletions(-) diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp index 0af77f3b..94529a9c 100644 --- a/src/ArduinoJson/Numbers/FloatTraits.hpp +++ b/src/ArduinoJson/Numbers/FloatTraits.hpp @@ -116,6 +116,14 @@ struct FloatTraits { return forge(0x7FEFFFFF, 0xFFFFFFFF); } + static T highest_for(int64_t) { + return forge(0x43DFFFFF, 0xFFFFFFFF); // 9.2233720368547748e+18 + } + + static T highest_for(uint64_t) { + return forge(0x43EFFFFF, 0xFFFFFFFF); // 1.8446744073709549568e+19 + } + static T lowest() { return forge(0xFFEFFFFF, 0xFFFFFFFF); } @@ -212,6 +220,22 @@ struct FloatTraits { return forge(0x7f7fffff); } + static T highest_for(int32_t) { + return forge(0x4EFFFFFF); // 2.14748352E9 + } + + static T highest_for(uint32_t) { + return forge(0x4F7FFFFF); // 4.29496704E9 + } + + static T highest_for(int64_t) { + return forge(0x5EFFFFFF); // 9.22337148709896192E18 + } + + static T highest_for(uint64_t) { + return forge(0x5F7FFFFF); // 1.844674297419792384E19 + } + static T lowest() { return forge(0xFf7fffff); } diff --git a/src/ArduinoJson/Numbers/convertNumber.hpp b/src/ArduinoJson/Numbers/convertNumber.hpp index 8f4c1af8..52a3f677 100644 --- a/src/ArduinoJson/Numbers/convertNumber.hpp +++ b/src/ArduinoJson/Numbers/convertNumber.hpp @@ -109,68 +109,20 @@ canConvertNumber(TIn value) { } // float32 -> int32 -template -typename enable_if::value && sizeof(TIn) == 4 && - is_integral::value && is_signed::value && - sizeof(TOut) == 4, - bool>::type -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && value <= 2.14748352e+9f; -} - // float32 -> uint32 -template -typename enable_if::value && sizeof(TIn) == 4 && - is_integral::value && is_unsigned::value && - sizeof(TOut) == 4, - bool>::type -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && value <= 4.29496704e+9f; -} - // float32 -> int64 -template -typename enable_if::value && sizeof(TIn) == 4 && - is_integral::value && is_signed::value && - sizeof(TOut) == 8, - bool>::type -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && value <= 9.22337149e+18f; -} - // float32 -> uint64 -template -typename enable_if::value && sizeof(TIn) == 4 && - is_integral::value && is_unsigned::value && - sizeof(TOut) == 8, - bool>::type -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && - value <= 1.844674297419792384e+19f; -} - // float64 -> int64 -template -typename enable_if::value && sizeof(TIn) == 8 && - is_integral::value && is_signed::value && - sizeof(TOut) == 8, - bool>::type -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && - value <= FloatTraits::forge( - 0x43DFFFFF, 0xFFFFFFFF); // 9.2233720368547748e+18 -} - // float64 -> uint64 template -typename enable_if::value && sizeof(TIn) == 8 && - is_integral::value && is_unsigned::value && - sizeof(TOut) == 8, +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::forge( - 0x43EFFFFF, 0xFFFFFFFF); // 1.8446744073709549568e+19 + value <= FloatTraits::highest_for(TOut()); } template