diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index d59cd905..a1012727 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -520,15 +520,15 @@ class JsonDeserializer { auto number = parseNumber(buffer_); switch (number.type()) { case NumberType::UnsignedInteger: - if (VariantImpl(result, resources_) - .setInteger(number.asUnsignedInteger())) + if (VariantImpl::setInteger(number.asUnsignedInteger(), result, + resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; case NumberType::SignedInteger: - if (VariantImpl(result, resources_) - .setInteger(number.asSignedInteger())) + if (VariantImpl::setInteger(number.asSignedInteger(), result, + resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index cb81e5c5..a42092ab 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -91,7 +91,7 @@ class MsgPackDeserializer { if (code <= 0x7f || code >= 0xe0) { // fixint if (allowValue) - VariantImpl(variant, resources_).setInteger(static_cast(code)); + VariantImpl::setInteger(static_cast(code), variant, resources_); return DeserializationError::Ok; } @@ -231,14 +231,14 @@ class MsgPackDeserializer { if (isSigned) { auto truncatedValue = static_cast(signedValue); if (truncatedValue == signedValue) { - if (!VariantImpl(variant, resources_).setInteger(truncatedValue)) + if (!VariantImpl::setInteger(truncatedValue, variant, resources_)) return DeserializationError::NoMemory; } // else set null on overflow } else { auto truncatedValue = static_cast(unsignedValue); if (truncatedValue == unsignedValue) - if (!VariantImpl(variant, resources_).setInteger(truncatedValue)) + if (!VariantImpl::setInteger(truncatedValue, variant, resources_)) return DeserializationError::NoMemory; // else set null on overflow } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 8395b4cc..e9ebbe89 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -437,10 +437,21 @@ class VariantImpl { enable_if_t setFloat(T value); template - enable_if_t::value, bool> setInteger(T value); + bool setInteger(T value) { + if (!data_) + return false; + return setInteger(value, data_, resources_); + } template - enable_if_t::value, bool> setInteger(T value); + static enable_if_t::value, bool> setInteger(T value, + VariantData*, + ResourceManager*); + + template + static enable_if_t::value, bool> setInteger(T value, + VariantData*, + ResourceManager*); template void setRawString(SerializedValue value); diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 93758e5d..30e1b4aa 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -98,11 +98,11 @@ enable_if_t VariantImpl::setFloat(T value) { } template -enable_if_t::value, bool> VariantImpl::setInteger(T value) { - ARDUINOJSON_ASSERT(isNull()); // must call clear() first - - if (!data_) - return false; +enable_if_t::value, bool> VariantImpl::setInteger( + T value, VariantData* data_, ResourceManager* resources_) { + ARDUINOJSON_ASSERT(data_ != nullptr); + ARDUINOJSON_ASSERT(data_->type == VariantType::Null); + ARDUINOJSON_ASSERT(resources_ != nullptr); if (canConvertNumber(value)) { data_->type = VariantType::Int32; @@ -117,16 +117,18 @@ enable_if_t::value, bool> VariantImpl::setInteger(T value) { data_->content.asSlotId = slot.id(); slot->asInt64 = value; } +#else + (void)resources_; #endif return true; } template -enable_if_t::value, bool> VariantImpl::setInteger(T value) { - ARDUINOJSON_ASSERT(isNull()); // must call clear() first - - if (!data_) - return false; +enable_if_t::value, bool> VariantImpl::setInteger( + T value, VariantData* data_, ResourceManager* resources_) { + ARDUINOJSON_ASSERT(data_ != nullptr); + ARDUINOJSON_ASSERT(data_->type == VariantType::Null); + ARDUINOJSON_ASSERT(resources_ != nullptr); if (canConvertNumber(value)) { data_->type = VariantType::Uint32; @@ -141,6 +143,8 @@ enable_if_t::value, bool> VariantImpl::setInteger(T value) { data_->content.asSlotId = slot.id(); slot->asUint64 = value; } +#else + (void)resources_; #endif return true; }