Browse Source

JsonObject: replace `ObjectData*` member with `VariantData*`

Benoit Blanchon 7 tháng trước cách đây
mục cha
commit
d9c6a70595

+ 23 - 21
src/ArduinoJson/Object/JsonObject.hpp

@@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   JsonObject() : data_(0), resources_(0) {}
 
   // INTERNAL USE ONLY
-  JsonObject(detail::ObjectData* data, detail::ResourceManager* resource)
+  JsonObject(detail::VariantData* data, detail::ResourceManager* resource)
       : data_(data), resources_(resource) {}
 
   operator JsonVariant() const {
@@ -33,29 +33,29 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   }
 
   operator JsonObjectConst() const {
-    return JsonObjectConst(collectionToVariant(data_), resources_);
+    return JsonObjectConst(data_, resources_);
   }
 
   operator JsonVariantConst() const {
-    return JsonVariantConst(collectionToVariant(data_), resources_);
+    return JsonVariantConst(data_, resources_);
   }
 
   // Returns true if the reference is unbound.
   // https://arduinojson.org/v7/api/jsonobject/isnull/
   bool isNull() const {
-    return data_ == 0;
+    return !data_ || !data_->isObject();
   }
 
   // Returns true if the reference is bound.
   // https://arduinojson.org/v7/api/jsonobject/isnull/
   operator bool() const {
-    return data_ != 0;
+    return !isNull();
   }
 
   // Returns the depth (nesting level) of the object.
   // https://arduinojson.org/v7/api/jsonobject/nesting/
   size_t nesting() const {
-    return detail::VariantData::nesting(collectionToVariant(data_), resources_);
+    return detail::VariantData::nesting(data_, resources_);
   }
 
   // Returns the number of members in the object.
@@ -67,9 +67,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   // Returns an iterator to the first key-value pair of the object.
   // https://arduinojson.org/v7/api/jsonobject/begin/
   iterator begin() const {
-    if (!data_)
+    auto obj = detail::VariantData::asObject(data_);
+    if (!obj)
       return iterator();
-    return iterator(data_->createIterator(resources_), resources_);
+    return iterator(obj->createIterator(resources_), resources_);
   }
 
   // Returns an iterator following the last key-value pair of the object.
@@ -81,7 +82,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   // Removes all the members of the object.
   // https://arduinojson.org/v7/api/jsonobject/clear/
   void clear() const {
-    detail::ObjectData::clear(data_, resources_);
+    detail::ObjectData::clear(detail::VariantData::asObject(data_), resources_);
   }
 
   // Copies an object.
@@ -131,7 +132,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   // Removes the member at the specified iterator.
   // https://arduinojson.org/v7/api/jsonobject/remove/
   FORCE_INLINE void remove(iterator it) const {
-    detail::ObjectData::remove(data_, it.iterator_, resources_);
+    detail::ObjectData::remove(detail::VariantData::asObject(data_),
+                               it.iterator_, resources_);
   }
 
   // Removes the member with the specified key.
@@ -139,8 +141,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   template <typename TString,
             detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
   void remove(const TString& key) const {
-    detail::ObjectData::removeMember(data_, detail::adaptString(key),
-                                     resources_);
+    detail::VariantData::removeMember(data_, detail::adaptString(key),
+                                      resources_);
   }
 
   // Removes the member with the specified key.
@@ -156,8 +158,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   // https://arduinojson.org/v7/api/jsonobject/remove/
   template <typename TChar>
   FORCE_INLINE void remove(TChar* key) const {
-    detail::ObjectData::removeMember(data_, detail::adaptString(key),
-                                     resources_);
+    detail::VariantData::removeMember(data_, detail::adaptString(key),
+                                      resources_);
   }
 
   // DEPRECATED: use obj[key].is<T>() instead
@@ -166,8 +168,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
             detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
   ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
   bool containsKey(const TString& key) const {
-    return detail::ObjectData::getMember(data_, detail::adaptString(key),
-                                         resources_) != 0;
+    return detail::VariantData::getMember(data_, detail::adaptString(key),
+                                          resources_) != 0;
   }
 
   // DEPRECATED: use obj["key"].is<T>() instead
@@ -178,8 +180,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
                                 int> = 0>
   ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead")
   bool containsKey(TChar* key) const {
-    return detail::ObjectData::getMember(data_, detail::adaptString(key),
-                                         resources_) != 0;
+    return detail::VariantData::getMember(data_, detail::adaptString(key),
+                                          resources_) != 0;
   }
 
   // DEPRECATED: use obj[key].is<T>() instead
@@ -231,14 +233,14 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   }
 
   detail::VariantData* getData() const {
-    return detail::collectionToVariant(data_);
+    return data_;
   }
 
   detail::VariantData* getOrCreateData() const {
-    return detail::collectionToVariant(data_);
+    return data_;
   }
 
-  detail::ObjectData* data_;
+  detail::VariantData* data_;
   detail::ResourceManager* resources_;
 };
 

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

@@ -386,9 +386,7 @@ struct Converter<JsonObject> : private detail::VariantAttorney {
   }
 
   static JsonObject fromJson(JsonVariant src) {
-    auto data = getData(src);
-    auto resources = getResourceManager(src);
-    return JsonObject(data != 0 ? data->asObject() : 0, resources);
+    return JsonObject(getData(src), getResourceManager(src));
   }
 
   static bool checkJson(JsonVariant src) {

+ 7 - 2
src/ArduinoJson/Variant/VariantData.hpp

@@ -296,6 +296,10 @@ class VariantData {
     return const_cast<VariantData*>(this)->asObject();
   }
 
+  static ObjectData* asObject(VariantData* var) {
+    return var ? var->asObject() : 0;
+  }
+
   static const ObjectData* asObject(const VariantData* var) {
     return var ? var->asObject() : 0;
   }
@@ -595,11 +599,12 @@ class VariantData {
     return content_.asObject;
   }
 
-  static ObjectData* toObject(VariantData* var, ResourceManager* resources) {
+  static VariantData* toObject(VariantData* var, ResourceManager* resources) {
     if (!var)
       return 0;
     var->clear(resources);
-    return &var->toObject();
+    var->toObject();
+    return var;
   }
 
   VariantType type() const {