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 { VariantImpl getOrCreateImpl() const {
auto impl = VariantAttorney::getOrCreateImpl(upstream_); auto impl = VariantAttorney::getOrCreateImpl(upstream_);
auto data = impl.data(); impl.toArrayIfNull();
if (data)
data->getOrCreateArray();
return VariantImpl(impl.getOrAddElement(index_), impl.resources()); return VariantImpl(impl.getOrAddElement(index_), impl.resources());
} }

View File

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

View File

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

View File

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

View File

@@ -99,28 +99,6 @@ struct VariantData {
VariantData* toObject() { VariantData* toObject() {
return toCollection(VariantType::Object); 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 ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

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

View File

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