Move string copy logic into VariantData::setString()

This commit is contained in:
Benoit Blanchon
2023-05-25 09:54:52 +02:00
parent 8ab45e6f82
commit 3a73ccf027
5 changed files with 24 additions and 21 deletions

View File

@ -394,7 +394,7 @@ class JsonDeserializer {
if (err)
return err;
variant.setString(stringBuilder_.save());
variant.setOwnedString(stringBuilder_.save());
return DeserializationError::Ok;
}

View File

@ -370,7 +370,7 @@ class MsgPackDeserializer {
if (err)
return err;
variant->setString(stringBuilder_.save());
variant->setOwnedString(stringBuilder_.save());
return DeserializationError::Ok;
}

View File

@ -227,7 +227,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) {
data->setNull();
return;
}
data->setString(print.save());
data->setOwnedString(print.save());
}
#endif

View File

@ -304,13 +304,30 @@ class VariantData {
setRawString(s);
}
void setString(const char* s) {
template <typename TAdaptedString>
void setString(TAdaptedString value, MemoryPool* pool) {
setNull(pool);
if (value.isNull())
return;
if (value.isLinked()) {
setLinkedString(value.data());
return;
}
auto dup = pool->saveString(value);
if (dup)
setOwnedString(dup);
}
void setLinkedString(const char* s) {
ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_LINKED_STRING);
content_.asLinkedString = s;
}
void setString(StringNode* s) {
void setOwnedString(StringNode* s) {
ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_OWNED_STRING);
content_.asOwnedString = s;

View File

@ -47,7 +47,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src,
auto dup = pool->saveString(str);
if (!dup)
return false;
dst->setString(dup);
dst->setOwnedString(dup);
return true;
}
case VALUE_IS_RAW_STRING: {
@ -95,21 +95,7 @@ inline void variantSetString(VariantData* var, TAdaptedString value,
MemoryPool* pool) {
if (!var)
return;
var->setNull(pool);
if (value.isNull())
return;
if (value.isLinked()) {
var->setString(value.data());
return;
}
auto dup = pool->saveString(value);
if (dup)
var->setString(dup);
else
var->setNull();
var->setString(value, pool);
}
template <typename T>