diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 16f359cd..dbc4b039 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -38,7 +38,7 @@ class JsonArray : public detail::VariantOperators { // 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 { } operator JsonVariantConst() const { - return JsonVariantConst(collectionToVariant(data_)); + return JsonVariantConst(collectionToVariant(data_), resources_); } // Returns true if the reference is unbound. diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index a8a77d51..c8e78e7a 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -26,7 +26,7 @@ class JsonArrayConst : public detail::VariantOperators { 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 { 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 { } const detail::ArrayData* data_; + const detail::ResourceManager* resources_; }; template <> @@ -98,7 +102,8 @@ struct Converter : 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) { diff --git a/src/ArduinoJson/Array/JsonArrayIterator.hpp b/src/ArduinoJson/Array/JsonArrayIterator.hpp index 74d5bed7..81622b47 100644 --- a/src/ArduinoJson/Array/JsonArrayIterator.hpp +++ b/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 operator->() { return operator*(); @@ -90,6 +90,7 @@ class JsonArrayConstIterator { private: detail::ArrayData::iterator iterator_; + const detail::ResourceManager* resources_; }; ARDUINOJSON_END_PUBLIC_NAMESPACE diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 555da34a..f8286b94 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -269,7 +269,8 @@ class JsonDocument : public detail::VariantOperators { FORCE_INLINE typename detail::enable_if::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 { FORCE_INLINE typename detail::enable_if::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 { // 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 { } JsonVariantConst getVariant() const { - return JsonVariantConst(&data_); + return JsonVariantConst(&data_, &resources_); } void copyAssignFrom(const JsonDocument& src) { diff --git a/src/ArduinoJson/Numbers/parseNumber.hpp b/src/ArduinoJson/Numbers/parseNumber.hpp index 4cec1a69..40c94c81 100644 --- a/src/ArduinoJson/Numbers/parseNumber.hpp +++ b/src/ArduinoJson/Numbers/parseNumber.hpp @@ -147,6 +147,6 @@ template inline T parseNumber(const char* s) { VariantData value; parseNumber(s, value); - return Converter::fromJson(JsonVariantConst(&value)); + return Converter::fromJson(JsonVariantConst(&value, nullptr)); } ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 0b790501..3b334583 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -34,11 +34,11 @@ class JsonObject : public detail::VariantOperators { } 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. diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 099aee78..451bedcb 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -22,10 +22,12 @@ class JsonObjectConst : public detail::VariantOperators { 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 { 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 { 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 { } const detail::ObjectData* data_; + const detail::ResourceManager* resources_; }; template <> @@ -123,7 +127,8 @@ struct Converter : 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) { diff --git a/src/ArduinoJson/Object/JsonObjectIterator.hpp b/src/ArduinoJson/Object/JsonObjectIterator.hpp index 4bbd9ef8..57566f02 100644 --- a/src/ArduinoJson/Object/JsonObjectIterator.hpp +++ b/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 operator->() { return operator*(); @@ -75,6 +76,7 @@ class JsonObjectConstIterator { private: detail::ObjectData::iterator iterator_; + const detail::ResourceManager* resources_; }; ARDUINOJSON_END_PUBLIC_NAMESPACE diff --git a/src/ArduinoJson/Object/JsonPair.hpp b/src/ArduinoJson/Object/JsonPair.hpp index 19548eb7..f2dd83ba 100644 --- a/src/ArduinoJson/Object/JsonPair.hpp +++ b/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 diff --git a/src/ArduinoJson/Variant/JsonVariant.hpp b/src/ArduinoJson/Variant/JsonVariant.hpp index ed6635a0..4991b5da 100644 --- a/src/ArduinoJson/Variant/JsonVariant.hpp +++ b/src/ArduinoJson/Variant/JsonVariant.hpp @@ -71,7 +71,7 @@ struct Converter : private detail::VariantAttorney { } static JsonVariantConst fromJson(JsonVariantConst src) { - return JsonVariantConst(getData(src)); + return JsonVariantConst(getData(src), getResourceManager(src)); } static bool checkJson(JsonVariantConst src) { diff --git a/src/ArduinoJson/Variant/JsonVariantConst.hpp b/src/ArduinoJson/Variant/JsonVariantConst.hpp index 1816b97a..21a8eeab 100644 --- a/src/ArduinoJson/Variant/JsonVariantConst.hpp +++ b/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 diff --git a/src/ArduinoJson/Variant/VariantAttorney.hpp b/src/ArduinoJson/Variant/VariantAttorney.hpp index 977f7162..63921356 100644 --- a/src/ArduinoJson/Variant/VariantAttorney.hpp +++ b/src/ArduinoJson/Variant/VariantAttorney.hpp @@ -16,7 +16,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE class VariantAttorney { public: template - FORCE_INLINE static ResourceManager* getResourceManager(TClient& client) { + FORCE_INLINE static auto getResourceManager(TClient& client) + -> decltype(client.getResourceManager()) { return client.getResourceManager(); } diff --git a/src/ArduinoJson/Variant/VariantCompare.hpp b/src/ArduinoJson/Variant/VariantCompare.hpp index 4c64b577..14e87709 100644 --- a/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/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; diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index 39f3e849..37d76f48 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/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;