فهرست منبع

Add a `ResourceManager*` member to `JsonArrayConst`, `JsonObjectConst`, and `JsonVariantConst`

Benoit Blanchon 2 سال پیش
والد
کامیت
1d96826371

+ 2 - 2
src/ArduinoJson/Array/JsonArray.hpp

@@ -38,7 +38,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
   // Returns a read-only reference to the array.
   // https://arduinojson.org/v6/api/jsonarrayconst/
   operator JsonArrayConst() const {
-    return JsonArrayConst(data_);
+    return JsonArrayConst(data_, resources_);
   }
 
   // Appends a new (null) element to the array.
@@ -121,7 +121,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
   }
 
   operator JsonVariantConst() const {
-    return JsonVariantConst(collectionToVariant(data_));
+    return JsonVariantConst(collectionToVariant(data_), resources_);
   }
 
   // Returns true if the reference is unbound.

+ 10 - 5
src/ArduinoJson/Array/JsonArrayConst.hpp

@@ -26,7 +26,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   FORCE_INLINE iterator begin() const {
     if (!data_)
       return iterator();
-    return iterator(data_->begin());
+    return iterator(data_->begin(), resources_);
   }
 
   // Returns an iterator to the element following the last element of the array.
@@ -39,16 +39,19 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   FORCE_INLINE JsonArrayConst() : data_(0) {}
 
   // INTERNAL USE ONLY
-  FORCE_INLINE JsonArrayConst(const detail::ArrayData* data) : data_(data) {}
+  FORCE_INLINE JsonArrayConst(const detail::ArrayData* data,
+                              const detail::ResourceManager* resources)
+      : data_(data), resources_(resources) {}
 
   // Returns the element at the specified index.
   // https://arduinojson.org/v6/api/jsonarrayconst/subscript/
   FORCE_INLINE JsonVariantConst operator[](size_t index) const {
-    return JsonVariantConst(detail::ArrayData::getElement(data_, index));
+    return JsonVariantConst(detail::ArrayData::getElement(data_, index),
+                            resources_);
   }
 
   operator JsonVariantConst() const {
-    return JsonVariantConst(collectionToVariant(data_));
+    return JsonVariantConst(collectionToVariant(data_), resources_);
   }
 
   // Returns true if the reference is unbound.
@@ -87,6 +90,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   }
 
   const detail::ArrayData* data_;
+  const detail::ResourceManager* resources_;
 };
 
 template <>
@@ -98,7 +102,8 @@ struct Converter<JsonArrayConst> : private detail::VariantAttorney {
 
   static JsonArrayConst fromJson(JsonVariantConst src) {
     auto data = getData(src);
-    return data ? data->asArray() : 0;
+    auto array = data ? data->asArray() : nullptr;
+    return JsonArrayConst(array, getResourceManager(src));
   }
 
   static bool checkJson(JsonVariantConst src) {

+ 4 - 3
src/ArduinoJson/Array/JsonArrayIterator.hpp

@@ -65,11 +65,11 @@ class JsonArrayConstIterator {
 
  public:
   JsonArrayConstIterator() {}
-  explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator)
-      : iterator_(iterator) {}
+  explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator, const detail::ResourceManager* resources)
+      : iterator_(iterator), resources_(resources) {}
 
   JsonVariantConst operator*() const {
-    return JsonVariantConst(iterator_.data());
+    return JsonVariantConst(iterator_.data(), resources_);
   }
   Ptr<JsonVariantConst> operator->() {
     return operator*();
@@ -90,6 +90,7 @@ class JsonArrayConstIterator {
 
  private:
   detail::ArrayData::iterator iterator_;
+  const detail::ResourceManager* resources_;
 };
 
 ARDUINOJSON_END_PUBLIC_NAMESPACE

+ 6 - 4
src/ArduinoJson/Document/JsonDocument.hpp

@@ -269,7 +269,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
   FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value,
                                           JsonVariantConst>::type
   operator[](const TString& key) const {
-    return JsonVariantConst(data_.getMember(detail::adaptString(key)));
+    return JsonVariantConst(data_.getMember(detail::adaptString(key)),
+                            &resources_);
   }
 
   // Gets a root object's member.
@@ -278,7 +279,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
   FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value,
                                           JsonVariantConst>::type
   operator[](TChar* key) const {
-    return JsonVariantConst(data_.getMember(detail::adaptString(key)));
+    return JsonVariantConst(data_.getMember(detail::adaptString(key)),
+                            &resources_);
   }
 
   // Gets or sets a root array's element.
@@ -290,7 +292,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
   // Gets a root array's member.
   // https://arduinojson.org/v6/api/jsondocument/subscript/
   FORCE_INLINE JsonVariantConst operator[](size_t index) const {
-    return JsonVariantConst(data_.getElement(index));
+    return JsonVariantConst(data_.getElement(index), &resources_);
   }
 
   // Appends a new (null) element to the root array.
@@ -356,7 +358,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
   }
 
   JsonVariantConst getVariant() const {
-    return JsonVariantConst(&data_);
+    return JsonVariantConst(&data_, &resources_);
   }
 
   void copyAssignFrom(const JsonDocument& src) {

+ 1 - 1
src/ArduinoJson/Numbers/parseNumber.hpp

@@ -147,6 +147,6 @@ template <typename T>
 inline T parseNumber(const char* s) {
   VariantData value;
   parseNumber(s, value);
-  return Converter<T>::fromJson(JsonVariantConst(&value));
+  return Converter<T>::fromJson(JsonVariantConst(&value, nullptr));
 }
 ARDUINOJSON_END_PRIVATE_NAMESPACE

+ 2 - 2
src/ArduinoJson/Object/JsonObject.hpp

@@ -34,11 +34,11 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
   }
 
   operator JsonObjectConst() const {
-    return JsonObjectConst(data_);
+    return JsonObjectConst(data_, resources_);
   }
 
   operator JsonVariantConst() const {
-    return JsonVariantConst(collectionToVariant(data_));
+    return JsonVariantConst(collectionToVariant(data_), resources_);
   }
 
   // Returns true if the reference is unbound.

+ 10 - 5
src/ArduinoJson/Object/JsonObjectConst.hpp

@@ -22,10 +22,12 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
   JsonObjectConst() : data_(0) {}
 
   // INTERNAL USE ONLY
-  JsonObjectConst(const detail::ObjectData* data) : data_(data) {}
+  JsonObjectConst(const detail::ObjectData* data,
+                  const detail::ResourceManager* resources)
+      : data_(data), resources_(resources) {}
 
   operator JsonVariantConst() const {
-    return JsonVariantConst(collectionToVariant(data_));
+    return JsonVariantConst(collectionToVariant(data_), resources_);
   }
 
   // Returns true if the reference is unbound.
@@ -63,7 +65,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
   FORCE_INLINE iterator begin() const {
     if (!data_)
       return iterator();
-    return iterator(data_->begin());
+    return iterator(data_->begin(), resources_);
   }
 
   // Returns an iterator following the last key-value pair of the object.
@@ -93,7 +95,8 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
                                           JsonVariantConst>::type
   operator[](const TString& key) const {
     return JsonVariantConst(
-        detail::ObjectData::getMember(data_, detail::adaptString(key)));
+        detail::ObjectData::getMember(data_, detail::adaptString(key)),
+        resources_);
   }
 
   // Gets the member with specified key.
@@ -112,6 +115,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
   }
 
   const detail::ObjectData* data_;
+  const detail::ResourceManager* resources_;
 };
 
 template <>
@@ -123,7 +127,8 @@ struct Converter<JsonObjectConst> : private detail::VariantAttorney {
 
   static JsonObjectConst fromJson(JsonVariantConst src) {
     auto data = getData(src);
-    return data != 0 ? data->asObject() : 0;
+    auto object = data != 0 ? data->asObject() : nullptr;
+    return JsonObjectConst(object, getResourceManager(src));
   }
 
   static bool checkJson(JsonVariantConst src) {

+ 5 - 3
src/ArduinoJson/Object/JsonObjectIterator.hpp

@@ -50,11 +50,12 @@ class JsonObjectConstIterator {
  public:
   JsonObjectConstIterator() {}
 
-  explicit JsonObjectConstIterator(detail::ObjectData::iterator iterator)
-      : iterator_(iterator) {}
+  explicit JsonObjectConstIterator(detail::ObjectData::iterator iterator,
+                                   const detail::ResourceManager* resources)
+      : iterator_(iterator), resources_(resources) {}
 
   JsonPairConst operator*() const {
-    return JsonPairConst(iterator_);
+    return JsonPairConst(iterator_, resources_);
   }
   Ptr<JsonPairConst> operator->() {
     return operator*();
@@ -75,6 +76,7 @@ class JsonObjectConstIterator {
 
  private:
   detail::ObjectData::iterator iterator_;
+  const detail::ResourceManager* resources_;
 };
 
 ARDUINOJSON_END_PUBLIC_NAMESPACE

+ 5 - 2
src/ArduinoJson/Object/JsonPair.hpp

@@ -43,7 +43,9 @@ class JsonPair {
 // https://arduinojson.org/v6/api/jsonobjectconst/begin_end/
 class JsonPairConst {
  public:
-  JsonPairConst(detail::ObjectData::iterator iterator) : iterator_(iterator) {}
+  JsonPairConst(detail::ObjectData::iterator iterator,
+                const detail::ResourceManager* resources)
+      : iterator_(iterator), resources_(resources) {}
 
   // Returns the key.
   JsonString key() const {
@@ -57,11 +59,12 @@ class JsonPairConst {
 
   // Returns the value.
   JsonVariantConst value() const {
-    return JsonVariantConst(iterator_.data());
+    return JsonVariantConst(iterator_.data(), resources_);
   }
 
  private:
   detail::ObjectData::iterator iterator_;
+  const detail::ResourceManager* resources_;
 };
 
 ARDUINOJSON_END_PUBLIC_NAMESPACE

+ 1 - 1
src/ArduinoJson/Variant/JsonVariant.hpp

@@ -71,7 +71,7 @@ struct Converter<JsonVariantConst> : private detail::VariantAttorney {
   }
 
   static JsonVariantConst fromJson(JsonVariantConst src) {
-    return JsonVariantConst(getData(src));
+    return JsonVariantConst(getData(src), getResourceManager(src));
   }
 
   static bool checkJson(JsonVariantConst src) {

+ 14 - 4
src/ArduinoJson/Variant/JsonVariantConst.hpp

@@ -32,7 +32,9 @@ class JsonVariantConst : public detail::VariantTag,
   JsonVariantConst() : data_(0) {}
 
   // INTERNAL USE ONLY
-  explicit JsonVariantConst(const detail::VariantData* data) : data_(data) {}
+  explicit JsonVariantConst(const detail::VariantData* data,
+                            const detail::ResourceManager* resources)
+      : data_(data), resources_(resources) {}
 
   // Returns true if the value is null or the reference is unbound.
   // https://arduinojson.org/v6/api/jsonvariantconst/isnull/
@@ -91,7 +93,8 @@ class JsonVariantConst : public detail::VariantTag,
   // Gets array's element at specified index.
   // https://arduinojson.org/v6/api/jsonvariantconst/subscript/
   FORCE_INLINE JsonVariantConst operator[](size_t index) const {
-    return JsonVariantConst(detail::VariantData::getElement(data_, index));
+    return JsonVariantConst(detail::VariantData::getElement(data_, index),
+                            resources_);
   }
 
   // Gets object's member with specified key.
@@ -101,7 +104,8 @@ class JsonVariantConst : public detail::VariantTag,
                                           JsonVariantConst>::type
   operator[](const TString& key) const {
     return JsonVariantConst(
-        detail::VariantData::getMember(data_, detail::adaptString(key)));
+        detail::VariantData::getMember(data_, detail::adaptString(key)),
+        resources_);
   }
 
   // Gets object's member with specified key.
@@ -111,7 +115,8 @@ class JsonVariantConst : public detail::VariantTag,
                                           JsonVariantConst>::type
   operator[](TChar* key) const {
     return JsonVariantConst(
-        detail::VariantData::getMember(data_, detail::adaptString(key)));
+        detail::VariantData::getMember(data_, detail::adaptString(key)),
+        resources_);
   }
 
   // Returns true if tge object contains the specified key.
@@ -139,8 +144,13 @@ class JsonVariantConst : public detail::VariantTag,
     return data_;
   }
 
+  const detail::ResourceManager* getResourceManager() const {
+    return resources_;
+  }
+
  private:
   const detail::VariantData* data_;
+  const detail::ResourceManager* resources_;
 };
 
 ARDUINOJSON_END_PUBLIC_NAMESPACE

+ 2 - 1
src/ArduinoJson/Variant/VariantAttorney.hpp

@@ -16,7 +16,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
 class VariantAttorney {
  public:
   template <typename TClient>
-  FORCE_INLINE static ResourceManager* getResourceManager(TClient& client) {
+  FORCE_INLINE static auto getResourceManager(TClient& client)
+      -> decltype(client.getResourceManager()) {
     return client.getResourceManager();
   }
 

+ 2 - 2
src/ArduinoJson/Variant/VariantCompare.hpp

@@ -84,7 +84,7 @@ struct ArrayComparer : ComparerBase {
   explicit ArrayComparer(const ArrayData& rhs) : rhs_(&rhs) {}
 
   CompareResult visitArray(const ArrayData& lhs) {
-    if (JsonArrayConst(&lhs) == JsonArrayConst(rhs_))
+    if (JsonArrayConst(&lhs, nullptr) == JsonArrayConst(rhs_, nullptr))
       return COMPARE_RESULT_EQUAL;
     else
       return COMPARE_RESULT_DIFFER;
@@ -97,7 +97,7 @@ struct ObjectComparer : ComparerBase {
   explicit ObjectComparer(const ObjectData& rhs) : rhs_(&rhs) {}
 
   CompareResult visitObject(const ObjectData& lhs) {
-    if (JsonObjectConst(&lhs) == JsonObjectConst(rhs_))
+    if (JsonObjectConst(&lhs, nullptr) == JsonObjectConst(rhs_, nullptr))
       return COMPARE_RESULT_EQUAL;
     else
       return COMPARE_RESULT_DIFFER;

+ 1 - 1
src/ArduinoJson/Variant/VariantRefBase.hpp

@@ -284,7 +284,7 @@ class VariantRefBase : public VariantTag {
   FORCE_INLINE ArduinoJson::JsonVariant getVariant() const;
 
   FORCE_INLINE ArduinoJson::JsonVariantConst getVariantConst() const {
-    return ArduinoJson::JsonVariantConst(getData());
+    return ArduinoJson::JsonVariantConst(getData(), getResourceManager());
   }
 
   FORCE_INLINE ArduinoJson::JsonVariant getOrCreateVariant() const;