mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-29 10:17:39 +02:00
VariantImpl: move out-of-class definitions back in the class
This commit is contained in:
@ -441,14 +441,68 @@ class VariantImpl {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void setRawString(SerializedValue<T> value);
|
||||
void setRawString(SerializedValue<T> value) {
|
||||
if (!data_)
|
||||
return;
|
||||
auto dup = resources_->saveString(adaptString(value.data(), value.size()));
|
||||
if (dup)
|
||||
data_->setRawString(dup);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
bool setString(TAdaptedString value);
|
||||
bool setString(TAdaptedString value) {
|
||||
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
|
||||
|
||||
bool setLinkedString(const char* s);
|
||||
if (!data_)
|
||||
return false;
|
||||
|
||||
void empty();
|
||||
if (value.isNull())
|
||||
return false;
|
||||
|
||||
if (value.isStatic())
|
||||
return setLinkedString(value.data());
|
||||
|
||||
if (isTinyString(value, value.size())) {
|
||||
data_->setTinyString(value);
|
||||
return true;
|
||||
}
|
||||
|
||||
auto dup = resources_->saveString(value);
|
||||
if (dup) {
|
||||
data_->setOwnedString(dup);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool setLinkedString(const char* s) {
|
||||
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
|
||||
auto slotId = resources_->saveStaticString(s);
|
||||
if (slotId == NULL_SLOT)
|
||||
return false;
|
||||
|
||||
data_->type = VariantType::LinkedString;
|
||||
data_->content.asSlotId = slotId;
|
||||
return true;
|
||||
}
|
||||
|
||||
void empty() {
|
||||
auto coll = getCollectionData();
|
||||
|
||||
auto next = coll->head;
|
||||
while (next != NULL_SLOT) {
|
||||
auto currId = next;
|
||||
auto slot = getVariant(next);
|
||||
next = slot->next;
|
||||
freeVariant({slot, currId});
|
||||
}
|
||||
|
||||
coll->head = NULL_SLOT;
|
||||
coll->tail = NULL_SLOT;
|
||||
}
|
||||
|
||||
size_t size() const;
|
||||
|
||||
@ -457,7 +511,23 @@ class VariantImpl {
|
||||
}
|
||||
|
||||
// Release the resources used by this variant and set it to null.
|
||||
void clear();
|
||||
void clear() {
|
||||
if (!data_)
|
||||
return;
|
||||
|
||||
if (data_->type & VariantTypeBits::OwnedStringBit)
|
||||
resources_->dereferenceString(data_->content.asOwnedString->data);
|
||||
|
||||
#if ARDUINOJSON_USE_8_BYTE_POOL
|
||||
if (data_->type & VariantTypeBits::EightByteBit)
|
||||
resources_->freeEightByte(data_->content.asSlotId);
|
||||
#endif
|
||||
|
||||
if (data_->type & VariantTypeBits::CollectionMask)
|
||||
empty();
|
||||
|
||||
data_->type = VariantType::Null;
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename TAdaptedString>
|
||||
@ -495,86 +565,4 @@ class VariantImpl {
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
inline void VariantImpl::setRawString(SerializedValue<T> value) {
|
||||
if (!data_)
|
||||
return;
|
||||
auto dup = resources_->saveString(adaptString(value.data(), value.size()));
|
||||
if (dup)
|
||||
data_->setRawString(dup);
|
||||
}
|
||||
|
||||
inline bool VariantImpl::setLinkedString(const char* s) {
|
||||
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
|
||||
auto slotId = resources_->saveStaticString(s);
|
||||
if (slotId == NULL_SLOT)
|
||||
return false;
|
||||
|
||||
data_->type = VariantType::LinkedString;
|
||||
data_->content.asSlotId = slotId;
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
inline bool VariantImpl::setString(TAdaptedString value) {
|
||||
ARDUINOJSON_ASSERT(isNull()); // must call clear() first
|
||||
|
||||
if (!data_)
|
||||
return false;
|
||||
|
||||
if (value.isNull())
|
||||
return false;
|
||||
|
||||
if (value.isStatic())
|
||||
return setLinkedString(value.data());
|
||||
|
||||
if (isTinyString(value, value.size())) {
|
||||
data_->setTinyString(value);
|
||||
return true;
|
||||
}
|
||||
|
||||
auto dup = resources_->saveString(value);
|
||||
if (dup) {
|
||||
data_->setOwnedString(dup);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline void VariantImpl::clear() {
|
||||
if (!data_)
|
||||
return;
|
||||
|
||||
if (data_->type & VariantTypeBits::OwnedStringBit)
|
||||
resources_->dereferenceString(data_->content.asOwnedString->data);
|
||||
|
||||
#if ARDUINOJSON_USE_8_BYTE_POOL
|
||||
if (data_->type & VariantTypeBits::EightByteBit)
|
||||
resources_->freeEightByte(data_->content.asSlotId);
|
||||
#endif
|
||||
|
||||
if (data_->type & VariantTypeBits::CollectionMask)
|
||||
empty();
|
||||
|
||||
data_->type = VariantType::Null;
|
||||
}
|
||||
|
||||
inline void VariantImpl::empty() {
|
||||
auto coll = getCollectionData();
|
||||
|
||||
auto next = coll->head;
|
||||
while (next != NULL_SLOT) {
|
||||
auto currId = next;
|
||||
auto slot = getVariant(next);
|
||||
next = slot->next;
|
||||
freeVariant({slot, currId});
|
||||
}
|
||||
|
||||
coll->head = NULL_SLOT;
|
||||
coll->tail = NULL_SLOT;
|
||||
}
|
||||
|
||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||
|
Reference in New Issue
Block a user