From a9461f8e4d9b87d7aa4aaab1585c0d35ac3b137d Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 17 Sep 2025 19:27:07 +0200 Subject: [PATCH] Extract `setFloat()` Before: 9902, 8796, 9724, 12682, 9978 After: 9894, 8796, 9708, 12674, 9970 Target: 9800, 8458, 9634, 12290, 9702 --- src/ArduinoJson/Json/JsonDeserializer.hpp | 4 ++-- src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp | 6 +++--- src/ArduinoJson/Variant/VariantData.hpp | 14 +++++++++++--- src/ArduinoJson/Variant/VariantImpl.hpp | 10 +++++----- 4 files changed, 21 insertions(+), 13 deletions(-) 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);