VariantImpl: add toArrayIfNull() and toObjectIfNull()

This commit is contained in:
Benoit Blanchon
2025-07-24 18:40:38 +02:00
parent 03da4aad99
commit 589bbbfcca
7 changed files with 16 additions and 36 deletions

View File

@ -57,9 +57,7 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
VariantImpl getOrCreateImpl() const {
auto impl = VariantAttorney::getOrCreateImpl(upstream_);
auto data = impl.data();
if (data)
data->getOrCreateArray();
impl.toArrayIfNull();
return VariantImpl(impl.getOrAddElement(index_), impl.resources());
}

View File

@ -25,10 +25,6 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// INTERNAL USE ONLY
JsonArray(detail::VariantImpl impl) : impl_(impl) {}
// INTERNAL USE ONLY
JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
: impl_(data, resources) {}
// Returns a JsonVariant pointing to the array.
// https://arduinojson.org/v7/api/jsonvariant/
operator JsonVariant() {

View File

@ -397,7 +397,9 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
}
JsonArray getOrCreateArray() {
return JsonArray(data_.getOrCreateArray(), &resources_);
auto impl = getImpl();
impl.toArrayIfNull();
return JsonArray(impl);
}
JsonVariant getVariant() {

View File

@ -58,9 +58,7 @@ class MemberProxy
VariantImpl getOrCreateImpl() const {
auto impl = VariantAttorney::getOrCreateImpl(upstream_);
auto data = impl.data();
if (data)
data->getOrCreateObject();
impl.toObjectIfNull();
return VariantImpl(impl.getOrAddMember(key_), impl.resources());
}

View File

@ -99,28 +99,6 @@ struct VariantData {
VariantData* toObject() {
return toCollection(VariantType::Object);
}
VariantData* getOrCreateArray() {
switch (type) {
case VariantType::Null:
return toArray();
case VariantType::Array:
return this;
default:
return nullptr;
}
}
VariantData* getOrCreateObject() {
switch (type) {
case VariantType::Null:
return toObject();
case VariantType::Object:
return this;
default:
return nullptr;
}
}
};
ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -528,6 +528,16 @@ class VariantImpl {
return true;
}
void toArrayIfNull() {
if (data_ && data_->type == VariantType::Null)
data_->toArray();
}
void toObjectIfNull() {
if (data_ && data_->type == VariantType::Null)
data_->toObject();
}
void empty() {
auto coll = getCollectionData();

View File

@ -143,9 +143,7 @@ inline bool VariantRefBase<TDerived>::doSet(const T& value, true_type) const {
template <typename TDerived>
inline JsonArray VariantRefBase<TDerived>::getOrCreateArray() const {
auto impl = getOrCreateImpl();
auto data = impl.data();
if (data)
data->getOrCreateArray();
impl.toArrayIfNull();
return JsonArray(impl);
}