Extract setInteger()

Before: 9918, 8796, 9742, 12698, 9994
After:  9902, 8796, 9724, 12682, 9978
Target: 9800, 8458, 9634, 12290, 9702
This commit is contained in:
Benoit Blanchon
2025-09-17 18:26:05 +02:00
parent 769e10c8ed
commit 71063c4ddb
4 changed files with 34 additions and 19 deletions

View File

@@ -520,15 +520,15 @@ class JsonDeserializer {
auto number = parseNumber(buffer_); auto number = parseNumber(buffer_);
switch (number.type()) { switch (number.type()) {
case NumberType::UnsignedInteger: case NumberType::UnsignedInteger:
if (VariantImpl(result, resources_) if (VariantImpl::setInteger(number.asUnsignedInteger(), result,
.setInteger(number.asUnsignedInteger())) resources_))
return DeserializationError::Ok; return DeserializationError::Ok;
else else
return DeserializationError::NoMemory; return DeserializationError::NoMemory;
case NumberType::SignedInteger: case NumberType::SignedInteger:
if (VariantImpl(result, resources_) if (VariantImpl::setInteger(number.asSignedInteger(), result,
.setInteger(number.asSignedInteger())) resources_))
return DeserializationError::Ok; return DeserializationError::Ok;
else else
return DeserializationError::NoMemory; return DeserializationError::NoMemory;

View File

@@ -91,7 +91,7 @@ class MsgPackDeserializer {
if (code <= 0x7f || code >= 0xe0) { // fixint if (code <= 0x7f || code >= 0xe0) { // fixint
if (allowValue) if (allowValue)
VariantImpl(variant, resources_).setInteger(static_cast<int8_t>(code)); VariantImpl::setInteger(static_cast<int8_t>(code), variant, resources_);
return DeserializationError::Ok; return DeserializationError::Ok;
} }
@@ -231,14 +231,14 @@ class MsgPackDeserializer {
if (isSigned) { if (isSigned) {
auto truncatedValue = static_cast<JsonInteger>(signedValue); auto truncatedValue = static_cast<JsonInteger>(signedValue);
if (truncatedValue == signedValue) { if (truncatedValue == signedValue) {
if (!VariantImpl(variant, resources_).setInteger(truncatedValue)) if (!VariantImpl::setInteger(truncatedValue, variant, resources_))
return DeserializationError::NoMemory; return DeserializationError::NoMemory;
} }
// else set null on overflow // else set null on overflow
} else { } else {
auto truncatedValue = static_cast<JsonUInt>(unsignedValue); auto truncatedValue = static_cast<JsonUInt>(unsignedValue);
if (truncatedValue == unsignedValue) if (truncatedValue == unsignedValue)
if (!VariantImpl(variant, resources_).setInteger(truncatedValue)) if (!VariantImpl::setInteger(truncatedValue, variant, resources_))
return DeserializationError::NoMemory; return DeserializationError::NoMemory;
// else set null on overflow // else set null on overflow
} }

View File

@@ -437,10 +437,21 @@ class VariantImpl {
enable_if_t<sizeof(T) == 8, bool> setFloat(T value); enable_if_t<sizeof(T) == 8, bool> setFloat(T value);
template <typename T> template <typename T>
enable_if_t<is_signed<T>::value, bool> setInteger(T value); bool setInteger(T value) {
if (!data_)
return false;
return setInteger(value, data_, resources_);
}
template <typename T> template <typename T>
enable_if_t<is_unsigned<T>::value, bool> setInteger(T value); static enable_if_t<is_signed<T>::value, bool> setInteger(T value,
VariantData*,
ResourceManager*);
template <typename T>
static enable_if_t<is_unsigned<T>::value, bool> setInteger(T value,
VariantData*,
ResourceManager*);
template <typename T> template <typename T>
void setRawString(SerializedValue<T> value); void setRawString(SerializedValue<T> value);

View File

@@ -98,11 +98,11 @@ enable_if_t<sizeof(T) == 8, bool> VariantImpl::setFloat(T value) {
} }
template <typename T> template <typename T>
enable_if_t<is_signed<T>::value, bool> VariantImpl::setInteger(T value) { enable_if_t<is_signed<T>::value, bool> VariantImpl::setInteger(
ARDUINOJSON_ASSERT(isNull()); // must call clear() first T value, VariantData* data_, ResourceManager* resources_) {
ARDUINOJSON_ASSERT(data_ != nullptr);
if (!data_) ARDUINOJSON_ASSERT(data_->type == VariantType::Null);
return false; ARDUINOJSON_ASSERT(resources_ != nullptr);
if (canConvertNumber<int32_t>(value)) { if (canConvertNumber<int32_t>(value)) {
data_->type = VariantType::Int32; data_->type = VariantType::Int32;
@@ -117,16 +117,18 @@ enable_if_t<is_signed<T>::value, bool> VariantImpl::setInteger(T value) {
data_->content.asSlotId = slot.id(); data_->content.asSlotId = slot.id();
slot->asInt64 = value; slot->asInt64 = value;
} }
#else
(void)resources_;
#endif #endif
return true; return true;
} }
template <typename T> template <typename T>
enable_if_t<is_unsigned<T>::value, bool> VariantImpl::setInteger(T value) { enable_if_t<is_unsigned<T>::value, bool> VariantImpl::setInteger(
ARDUINOJSON_ASSERT(isNull()); // must call clear() first T value, VariantData* data_, ResourceManager* resources_) {
ARDUINOJSON_ASSERT(data_ != nullptr);
if (!data_) ARDUINOJSON_ASSERT(data_->type == VariantType::Null);
return false; ARDUINOJSON_ASSERT(resources_ != nullptr);
if (canConvertNumber<uint32_t>(value)) { if (canConvertNumber<uint32_t>(value)) {
data_->type = VariantType::Uint32; data_->type = VariantType::Uint32;
@@ -141,6 +143,8 @@ enable_if_t<is_unsigned<T>::value, bool> VariantImpl::setInteger(T value) {
data_->content.asSlotId = slot.id(); data_->content.asSlotId = slot.id();
slot->asUint64 = value; slot->asUint64 = value;
} }
#else
(void)resources_;
#endif #endif
return true; return true;
} }