Prechádzať zdrojové kódy

VariantImpl: add `toArrayIfNull()` and `toObjectIfNull()`

Benoit Blanchon 7 mesiacov pred
rodič
commit
589bbbfcca

+ 1 - 3
src/ArduinoJson/Array/ElementProxy.hpp

@@ -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();
-    if (data)
-      data->getOrCreateArray();
+    impl.toArrayIfNull();
     return VariantImpl(impl.getOrAddElement(index_), impl.resources());
     return VariantImpl(impl.getOrAddElement(index_), impl.resources());
   }
   }
 
 

+ 0 - 4
src/ArduinoJson/Array/JsonArray.hpp

@@ -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() {

+ 3 - 1
src/ArduinoJson/Document/JsonDocument.hpp

@@ -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() {

+ 1 - 3
src/ArduinoJson/Object/MemberProxy.hpp

@@ -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();
-    if (data)
-      data->getOrCreateObject();
+    impl.toObjectIfNull();
     return VariantImpl(impl.getOrAddMember(key_), impl.resources());
     return VariantImpl(impl.getOrAddMember(key_), impl.resources());
   }
   }
 
 

+ 0 - 22
src/ArduinoJson/Variant/VariantData.hpp

@@ -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

+ 10 - 0
src/ArduinoJson/Variant/VariantImpl.hpp

@@ -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();
 
 

+ 1 - 3
src/ArduinoJson/Variant/VariantRefBaseImpl.hpp

@@ -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();
-  if (data)
-    data->getOrCreateArray();
+  impl.toArrayIfNull();
   return JsonArray(impl);
   return JsonArray(impl);
 }
 }