mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-30 02:37:35 +02:00
VariantImpl: add toArrayIfNull()
and toObjectIfNull()
This commit is contained in:
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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() {
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user