forked from bblanchon/ArduinoJson
Remove string size from VariantContent
(#1650)
This commit is contained in:
@ -43,10 +43,8 @@ union VariantContent {
|
|||||||
JsonUInt asUnsignedInteger;
|
JsonUInt asUnsignedInteger;
|
||||||
JsonInteger asSignedInteger;
|
JsonInteger asSignedInteger;
|
||||||
CollectionData asCollection;
|
CollectionData asCollection;
|
||||||
struct {
|
const char* asLinkedString;
|
||||||
const char* data;
|
struct StringNode* asOwnedString;
|
||||||
size_t size;
|
|
||||||
} asString;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||||
|
@ -41,13 +41,16 @@ class VariantData {
|
|||||||
return visitor.visitObject(content_.asCollection);
|
return visitor.visitObject(content_.asCollection);
|
||||||
|
|
||||||
case VALUE_IS_LINKED_STRING:
|
case VALUE_IS_LINKED_STRING:
|
||||||
|
return visitor.visitString(content_.asLinkedString,
|
||||||
|
strlen(content_.asLinkedString));
|
||||||
|
|
||||||
case VALUE_IS_OWNED_STRING:
|
case VALUE_IS_OWNED_STRING:
|
||||||
return visitor.visitString(content_.asString.data,
|
return visitor.visitString(content_.asOwnedString->data,
|
||||||
content_.asString.size);
|
content_.asOwnedString->length);
|
||||||
|
|
||||||
case VALUE_IS_RAW_STRING:
|
case VALUE_IS_RAW_STRING:
|
||||||
return visitor.visitRawString(content_.asString.data,
|
return visitor.visitRawString(content_.asOwnedString->data,
|
||||||
content_.asString.size);
|
content_.asOwnedString->length);
|
||||||
|
|
||||||
case VALUE_IS_SIGNED_INTEGER:
|
case VALUE_IS_SIGNED_INTEGER:
|
||||||
return visitor.visitSignedInteger(content_.asSignedInteger);
|
return visitor.visitSignedInteger(content_.asSignedInteger);
|
||||||
@ -76,7 +79,7 @@ class VariantData {
|
|||||||
|
|
||||||
const char* getOwnedString() const {
|
const char* getOwnedString() const {
|
||||||
if (flags_ & OWNED_VALUE_BIT)
|
if (flags_ & OWNED_VALUE_BIT)
|
||||||
return content_.asString.data;
|
return content_.asOwnedString->data;
|
||||||
else
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -160,8 +163,7 @@ class VariantData {
|
|||||||
void setRawString(StringNode* s) {
|
void setRawString(StringNode* s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
setType(VALUE_IS_RAW_STRING);
|
setType(VALUE_IS_RAW_STRING);
|
||||||
content_.asString.data = s->data;
|
content_.asOwnedString = s;
|
||||||
content_.asString.size = s->length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -183,15 +185,13 @@ class VariantData {
|
|||||||
void setString(StringNode* s) {
|
void setString(StringNode* s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
setType(VALUE_IS_OWNED_STRING);
|
setType(VALUE_IS_OWNED_STRING);
|
||||||
content_.asString.data = s->data;
|
content_.asOwnedString = s;
|
||||||
content_.asString.size = s->length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setString(const char* s) {
|
void setString(const char* s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
setType(VALUE_IS_LINKED_STRING);
|
setType(VALUE_IS_LINKED_STRING);
|
||||||
content_.asString.data = s;
|
content_.asLinkedString = s;
|
||||||
content_.asString.size = strlen(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CollectionData& toArray() {
|
CollectionData& toArray() {
|
||||||
@ -210,7 +210,7 @@ class VariantData {
|
|||||||
switch (type()) {
|
switch (type()) {
|
||||||
case VALUE_IS_OWNED_STRING:
|
case VALUE_IS_OWNED_STRING:
|
||||||
case VALUE_IS_RAW_STRING:
|
case VALUE_IS_RAW_STRING:
|
||||||
return sizeofString(content_.asString.size);
|
return sizeofString(content_.asOwnedString->length);
|
||||||
case VALUE_IS_OBJECT:
|
case VALUE_IS_OBJECT:
|
||||||
case VALUE_IS_ARRAY:
|
case VALUE_IS_ARRAY:
|
||||||
return content_.asCollection.memoryUsage();
|
return content_.asCollection.memoryUsage();
|
||||||
|
@ -25,8 +25,9 @@ inline T VariantData::asIntegral() const {
|
|||||||
case VALUE_IS_SIGNED_INTEGER:
|
case VALUE_IS_SIGNED_INTEGER:
|
||||||
return convertNumber<T>(content_.asSignedInteger);
|
return convertNumber<T>(content_.asSignedInteger);
|
||||||
case VALUE_IS_LINKED_STRING:
|
case VALUE_IS_LINKED_STRING:
|
||||||
|
return parseNumber<T>(content_.asLinkedString);
|
||||||
case VALUE_IS_OWNED_STRING:
|
case VALUE_IS_OWNED_STRING:
|
||||||
return parseNumber<T>(content_.asString.data);
|
return parseNumber<T>(content_.asOwnedString->data);
|
||||||
case VALUE_IS_FLOAT:
|
case VALUE_IS_FLOAT:
|
||||||
return convertNumber<T>(content_.asFloat);
|
return convertNumber<T>(content_.asFloat);
|
||||||
default:
|
default:
|
||||||
@ -62,7 +63,7 @@ inline T VariantData::asFloat() const {
|
|||||||
return static_cast<T>(content_.asSignedInteger);
|
return static_cast<T>(content_.asSignedInteger);
|
||||||
case VALUE_IS_LINKED_STRING:
|
case VALUE_IS_LINKED_STRING:
|
||||||
case VALUE_IS_OWNED_STRING:
|
case VALUE_IS_OWNED_STRING:
|
||||||
return parseNumber<T>(content_.asString.data);
|
return parseNumber<T>(content_.asOwnedString->data);
|
||||||
case VALUE_IS_FLOAT:
|
case VALUE_IS_FLOAT:
|
||||||
return static_cast<T>(content_.asFloat);
|
return static_cast<T>(content_.asFloat);
|
||||||
default:
|
default:
|
||||||
@ -73,11 +74,10 @@ inline T VariantData::asFloat() const {
|
|||||||
inline JsonString VariantData::asString() const {
|
inline JsonString VariantData::asString() const {
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case VALUE_IS_LINKED_STRING:
|
case VALUE_IS_LINKED_STRING:
|
||||||
return JsonString(content_.asString.data, content_.asString.size,
|
return JsonString(content_.asLinkedString, JsonString::Linked);
|
||||||
JsonString::Linked);
|
|
||||||
case VALUE_IS_OWNED_STRING:
|
case VALUE_IS_OWNED_STRING:
|
||||||
return JsonString(content_.asString.data, content_.asString.size,
|
return JsonString(content_.asOwnedString->data,
|
||||||
JsonString::Copied);
|
content_.asOwnedString->length, JsonString::Copied);
|
||||||
default:
|
default:
|
||||||
return JsonString();
|
return JsonString();
|
||||||
}
|
}
|
||||||
@ -86,8 +86,8 @@ inline JsonString VariantData::asString() const {
|
|||||||
inline JsonString VariantData::asRawString() const {
|
inline JsonString VariantData::asRawString() const {
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case VALUE_IS_RAW_STRING:
|
case VALUE_IS_RAW_STRING:
|
||||||
return JsonString(content_.asString.data, content_.asString.size,
|
return JsonString(content_.asOwnedString->data,
|
||||||
JsonString::Copied);
|
content_.asOwnedString->length, JsonString::Copied);
|
||||||
default:
|
default:
|
||||||
return JsonString();
|
return JsonString();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user