forked from bblanchon/ArduinoJson
Pass StringNode* to VariantData
This commit is contained in:
@@ -28,12 +28,12 @@ inline VariantData* collectionAddMember(CollectionData* obj, TAdaptedString key,
|
||||
if (!slot)
|
||||
return nullptr;
|
||||
if (key.isLinked())
|
||||
slot->setKey(JsonString(key.data(), key.size(), JsonString::Linked));
|
||||
slot->setKey(key.data());
|
||||
else {
|
||||
auto storedKey = pool->saveString(key);
|
||||
if (!storedKey)
|
||||
return nullptr;
|
||||
slot->setKey(JsonString(storedKey, key.size(), JsonString::Copied));
|
||||
slot->setKey(storedKey);
|
||||
}
|
||||
obj->add(slot);
|
||||
return slot->data();
|
||||
|
||||
@@ -277,14 +277,14 @@ class JsonDeserializer {
|
||||
VariantSlot* slot = object.get(adaptString(key.c_str()));
|
||||
if (!slot) {
|
||||
// Save key in memory pool.
|
||||
key = stringStorage_.save();
|
||||
auto savedKey = stringStorage_.save();
|
||||
|
||||
// Allocate slot in object
|
||||
slot = pool_->allocVariant();
|
||||
if (!slot)
|
||||
return DeserializationError::NoMemory;
|
||||
|
||||
slot->setKey(key);
|
||||
slot->setKey(savedKey);
|
||||
object.add(slot);
|
||||
}
|
||||
|
||||
|
||||
@@ -107,14 +107,14 @@ class MemoryPool {
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
const char* saveString(TAdaptedString str) {
|
||||
StringNode* saveString(TAdaptedString str) {
|
||||
if (str.isNull())
|
||||
return 0;
|
||||
|
||||
auto node = findString(str);
|
||||
if (node) {
|
||||
node->references++;
|
||||
return node->data;
|
||||
return node;
|
||||
}
|
||||
|
||||
size_t n = str.size();
|
||||
@@ -126,7 +126,7 @@ class MemoryPool {
|
||||
stringGetChars(str, node->data, n);
|
||||
node->data[n] = 0; // force NUL terminator
|
||||
addStringToList(node);
|
||||
return node->data;
|
||||
return node;
|
||||
}
|
||||
|
||||
void addStringToList(StringNode* node) {
|
||||
|
||||
@@ -494,13 +494,13 @@ class MsgPackDeserializer {
|
||||
ARDUINOJSON_ASSERT(object != 0);
|
||||
|
||||
// Save key in memory pool.
|
||||
key = stringStorage_.save();
|
||||
auto savedKey = stringStorage_.save();
|
||||
|
||||
VariantSlot* slot = pool_->allocVariant();
|
||||
if (!slot)
|
||||
return DeserializationError::NoMemory;
|
||||
|
||||
slot->setKey(key);
|
||||
slot->setKey(savedKey);
|
||||
object->add(slot);
|
||||
|
||||
member = slot->data();
|
||||
|
||||
@@ -25,7 +25,7 @@ class StringCopier {
|
||||
node_ = pool_->allocString(initialCapacity);
|
||||
}
|
||||
|
||||
JsonString save() {
|
||||
StringNode* save() {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
node_->data[size_] = 0;
|
||||
StringNode* node = pool_->findString(adaptString(node_->data, size_));
|
||||
@@ -36,7 +36,7 @@ class StringCopier {
|
||||
} else {
|
||||
node->references++;
|
||||
}
|
||||
return JsonString(node->data, node->length, JsonString::Copied);
|
||||
return node;
|
||||
}
|
||||
|
||||
void append(const char* s) {
|
||||
|
||||
@@ -17,10 +17,9 @@ class StringMover {
|
||||
startPtr_ = writePtr_;
|
||||
}
|
||||
|
||||
FORCE_INLINE JsonString save() {
|
||||
JsonString s = str();
|
||||
writePtr_++;
|
||||
return s;
|
||||
FORCE_INLINE const char* save() {
|
||||
*writePtr_++ = 0; // terminator
|
||||
return startPtr_;
|
||||
}
|
||||
|
||||
void append(char c) {
|
||||
|
||||
@@ -188,7 +188,7 @@ class MemoryPoolPrint : public Print {
|
||||
copier_.startString();
|
||||
}
|
||||
|
||||
JsonString str() {
|
||||
StringNode* save() {
|
||||
ARDUINOJSON_ASSERT(!overflowed());
|
||||
return copier_.save();
|
||||
}
|
||||
@@ -227,7 +227,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) {
|
||||
data->setNull();
|
||||
return;
|
||||
}
|
||||
data->setString(print.str());
|
||||
data->setString(print.save());
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -157,10 +157,11 @@ class VariantData {
|
||||
content_.asFloat = value;
|
||||
}
|
||||
|
||||
void setRawString(const char* data, size_t n) {
|
||||
void setRawString(StringNode* s) {
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
setType(VALUE_IS_RAW_STRING);
|
||||
content_.asString.data = data;
|
||||
content_.asString.size = n;
|
||||
content_.asString.data = s->data;
|
||||
content_.asString.size = s->length;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
@@ -179,14 +180,18 @@ class VariantData {
|
||||
setType(VALUE_IS_NULL);
|
||||
}
|
||||
|
||||
void setString(JsonString s) {
|
||||
void setString(StringNode* s) {
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
if (s.isLinked())
|
||||
setType(VALUE_IS_LINKED_STRING);
|
||||
else
|
||||
setType(VALUE_IS_OWNED_STRING);
|
||||
content_.asString.data = s.c_str();
|
||||
content_.asString.size = s.size();
|
||||
setType(VALUE_IS_OWNED_STRING);
|
||||
content_.asString.data = s->data;
|
||||
content_.asString.size = s->length;
|
||||
}
|
||||
|
||||
void setString(const char* s) {
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
setType(VALUE_IS_LINKED_STRING);
|
||||
content_.asString.data = s;
|
||||
content_.asString.size = strlen(s);
|
||||
}
|
||||
|
||||
CollectionData& toArray() {
|
||||
|
||||
@@ -61,7 +61,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src,
|
||||
auto dup = pool->saveString(str);
|
||||
if (!dup)
|
||||
return false;
|
||||
dst->setString(JsonString(dup, str.size(), JsonString::Copied));
|
||||
dst->setString(dup);
|
||||
return true;
|
||||
}
|
||||
case VALUE_IS_RAW_STRING: {
|
||||
@@ -69,7 +69,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src,
|
||||
auto dup = pool->saveString(str);
|
||||
if (!dup)
|
||||
return false;
|
||||
dst->setRawString(dup, str.size());
|
||||
dst->setRawString(dup);
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
@@ -121,13 +121,13 @@ inline void variantSetString(VariantData* var, TAdaptedString value,
|
||||
}
|
||||
|
||||
if (value.isLinked()) {
|
||||
var->setString(JsonString(value.data(), value.size(), JsonString::Linked));
|
||||
var->setString(value.data());
|
||||
return;
|
||||
}
|
||||
|
||||
auto dup = pool->saveString(value);
|
||||
if (dup)
|
||||
var->setString(JsonString(dup, value.size(), JsonString::Copied));
|
||||
var->setString(dup);
|
||||
else
|
||||
var->setNull();
|
||||
}
|
||||
@@ -138,9 +138,9 @@ inline void variantSetRawString(VariantData* var, SerializedValue<T> value,
|
||||
if (!var)
|
||||
return;
|
||||
variantRelease(var, pool);
|
||||
const char* dup = pool->saveString(adaptString(value.data(), value.size()));
|
||||
auto dup = pool->saveString(adaptString(value.data(), value.size()));
|
||||
if (dup)
|
||||
var->setRawString(dup, value.size());
|
||||
var->setRawString(dup);
|
||||
else
|
||||
var->setNull();
|
||||
}
|
||||
|
||||
@@ -137,4 +137,10 @@ inline void convertToJson(const VariantRefBase<TDerived>& src,
|
||||
dst.set(src.template as<JsonVariantConst>());
|
||||
}
|
||||
|
||||
inline void VariantSlot::setKey(StringNode* k) {
|
||||
ARDUINOJSON_ASSERT(k);
|
||||
flags_ |= OWNED_KEY_BIT;
|
||||
key_ = k->data;
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
|
||||
struct StringNode;
|
||||
|
||||
typedef int_t<ARDUINOJSON_SLOT_OFFSET_SIZE * 8>::type VariantSlotDiff;
|
||||
|
||||
class VariantSlot {
|
||||
@@ -76,15 +78,14 @@ class VariantSlot {
|
||||
next_ = VariantSlotDiff(slot - this);
|
||||
}
|
||||
|
||||
void setKey(JsonString k) {
|
||||
void setKey(const char* k) {
|
||||
ARDUINOJSON_ASSERT(k);
|
||||
if (k.isLinked())
|
||||
flags_ &= VALUE_MASK;
|
||||
else
|
||||
flags_ |= OWNED_KEY_BIT;
|
||||
key_ = k.c_str();
|
||||
flags_ &= VALUE_MASK;
|
||||
key_ = k;
|
||||
}
|
||||
|
||||
void setKey(StringNode* k);
|
||||
|
||||
const char* key() const {
|
||||
return key_;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user