diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index a1012727..696870b3 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -534,14 +534,14 @@ class JsonDeserializer { return DeserializationError::NoMemory; case NumberType::Float: - if (VariantImpl(result, resources_).setFloat(number.asFloat())) + if (VariantImpl::setFloat(number.asFloat(), result, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; #if ARDUINOJSON_USE_DOUBLE case NumberType::Double: - if (VariantImpl(result, resources_).setFloat(number.asDouble())) + if (VariantImpl::setFloat(number.asDouble(), result, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index a42092ab..4077e243 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -257,7 +257,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - VariantImpl(variant, resources_).setFloat(value); + VariantImpl::setFloat(value, variant, resources_); return DeserializationError::Ok; } @@ -273,7 +273,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - if (VariantImpl(variant, resources_).setFloat(value)) + if (VariantImpl::setFloat(value, variant, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; @@ -293,7 +293,7 @@ class MsgPackDeserializer { doubleToFloat(i, o); fixEndianness(value); - VariantImpl(variant, resources_).setFloat(value); + VariantImpl::setFloat(value, variant, resources_); return DeserializationError::Ok; } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index e9ebbe89..72741243 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -424,17 +424,25 @@ class VariantImpl { } template - enable_if_t setFloat(T value) { - ARDUINOJSON_ASSERT(type() == VariantType::Null); // must call clear() first + bool setFloat(T value) { if (!data_) return false; + return setFloat(value, data_, resources_); + } + + template + static enable_if_t setFloat(T value, VariantData* data_, + ResourceManager*) { + ARDUINOJSON_ASSERT(data_ != nullptr); + ARDUINOJSON_ASSERT(data_->type == VariantType::Null); data_->type = VariantType::Float; data_->content.asFloat = value; return true; } template - enable_if_t setFloat(T value); + static enable_if_t setFloat( + T value, VariantData* data_, ResourceManager* resources_); template bool setInteger(T value) { diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 30e1b4aa..d21c84b2 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -70,11 +70,11 @@ inline const EightByteValue* VariantImpl::getEightByte() const { #endif template -enable_if_t VariantImpl::setFloat(T value) { - ARDUINOJSON_ASSERT(isNull()); // must call clear() first - - if (!data_) - return false; +enable_if_t VariantImpl::setFloat( + T value, VariantData* data_, ResourceManager* resources_) { + ARDUINOJSON_ASSERT(data_ != nullptr); + ARDUINOJSON_ASSERT(data_->type == VariantType::Null); + ARDUINOJSON_ASSERT(resources_ != nullptr); float valueAsFloat = static_cast(value);