mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-08-02 20:24:42 +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 {
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user