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_);
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;

View File

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

View File

@@ -437,10 +437,21 @@ class VariantImpl {
enable_if_t<sizeof(T) == 8, bool> setFloat(T value);
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>
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>
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>
enable_if_t<is_signed<T>::value, bool> VariantImpl::setInteger(T value) {
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
if (!data_)
return false;
enable_if_t<is_signed<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<int32_t>(value)) {
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();
slot->asInt64 = value;
}
#else
(void)resources_;
#endif
return true;
}
template <typename T>
enable_if_t<is_unsigned<T>::value, bool> VariantImpl::setInteger(T value) {
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
if (!data_)
return false;
enable_if_t<is_unsigned<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<uint32_t>(value)) {
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();
slot->asUint64 = value;
}
#else
(void)resources_;
#endif
return true;
}