From 9321f8fdab164ee2c1d8b097a90d623bc1341874 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Tue, 2 May 2023 18:44:12 +0200 Subject: [PATCH] Remove string size from `VariantContent` (#1650) --- src/ArduinoJson/Variant/VariantContent.hpp | 6 ++---- src/ArduinoJson/Variant/VariantData.hpp | 24 +++++++++++----------- src/ArduinoJson/Variant/VariantImpl.hpp | 16 +++++++-------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/ArduinoJson/Variant/VariantContent.hpp b/src/ArduinoJson/Variant/VariantContent.hpp index 65d5a6ef..4e7d97bb 100644 --- a/src/ArduinoJson/Variant/VariantContent.hpp +++ b/src/ArduinoJson/Variant/VariantContent.hpp @@ -43,10 +43,8 @@ union VariantContent { JsonUInt asUnsignedInteger; JsonInteger asSignedInteger; CollectionData asCollection; - struct { - const char* data; - size_t size; - } asString; + const char* asLinkedString; + struct StringNode* asOwnedString; }; ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index fe5a8173..00be130a 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -41,13 +41,16 @@ class VariantData { return visitor.visitObject(content_.asCollection); case VALUE_IS_LINKED_STRING: + return visitor.visitString(content_.asLinkedString, + strlen(content_.asLinkedString)); + case VALUE_IS_OWNED_STRING: - return visitor.visitString(content_.asString.data, - content_.asString.size); + return visitor.visitString(content_.asOwnedString->data, + content_.asOwnedString->length); case VALUE_IS_RAW_STRING: - return visitor.visitRawString(content_.asString.data, - content_.asString.size); + return visitor.visitRawString(content_.asOwnedString->data, + content_.asOwnedString->length); case VALUE_IS_SIGNED_INTEGER: return visitor.visitSignedInteger(content_.asSignedInteger); @@ -76,7 +79,7 @@ class VariantData { const char* getOwnedString() const { if (flags_ & OWNED_VALUE_BIT) - return content_.asString.data; + return content_.asOwnedString->data; else return nullptr; } @@ -160,8 +163,7 @@ class VariantData { void setRawString(StringNode* s) { ARDUINOJSON_ASSERT(s); setType(VALUE_IS_RAW_STRING); - content_.asString.data = s->data; - content_.asString.size = s->length; + content_.asOwnedString = s; } template @@ -183,15 +185,13 @@ class VariantData { void setString(StringNode* s) { ARDUINOJSON_ASSERT(s); setType(VALUE_IS_OWNED_STRING); - content_.asString.data = s->data; - content_.asString.size = s->length; + content_.asOwnedString = s; } void setString(const char* s) { ARDUINOJSON_ASSERT(s); setType(VALUE_IS_LINKED_STRING); - content_.asString.data = s; - content_.asString.size = strlen(s); + content_.asLinkedString = s; } CollectionData& toArray() { @@ -210,7 +210,7 @@ class VariantData { switch (type()) { case VALUE_IS_OWNED_STRING: case VALUE_IS_RAW_STRING: - return sizeofString(content_.asString.size); + return sizeofString(content_.asOwnedString->length); case VALUE_IS_OBJECT: case VALUE_IS_ARRAY: return content_.asCollection.memoryUsage(); diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index cb728330..9f2874f3 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -25,8 +25,9 @@ inline T VariantData::asIntegral() const { case VALUE_IS_SIGNED_INTEGER: return convertNumber(content_.asSignedInteger); case VALUE_IS_LINKED_STRING: + return parseNumber(content_.asLinkedString); case VALUE_IS_OWNED_STRING: - return parseNumber(content_.asString.data); + return parseNumber(content_.asOwnedString->data); case VALUE_IS_FLOAT: return convertNumber(content_.asFloat); default: @@ -62,7 +63,7 @@ inline T VariantData::asFloat() const { return static_cast(content_.asSignedInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: - return parseNumber(content_.asString.data); + return parseNumber(content_.asOwnedString->data); case VALUE_IS_FLOAT: return static_cast(content_.asFloat); default: @@ -73,11 +74,10 @@ inline T VariantData::asFloat() const { inline JsonString VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: - return JsonString(content_.asString.data, content_.asString.size, - JsonString::Linked); + return JsonString(content_.asLinkedString, JsonString::Linked); case VALUE_IS_OWNED_STRING: - return JsonString(content_.asString.data, content_.asString.size, - JsonString::Copied); + return JsonString(content_.asOwnedString->data, + content_.asOwnedString->length, JsonString::Copied); default: return JsonString(); } @@ -86,8 +86,8 @@ inline JsonString VariantData::asString() const { inline JsonString VariantData::asRawString() const { switch (type()) { case VALUE_IS_RAW_STRING: - return JsonString(content_.asString.data, content_.asString.size, - JsonString::Copied); + return JsonString(content_.asOwnedString->data, + content_.asOwnedString->length, JsonString::Copied); default: return JsonString(); }