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

This commit is contained in:
Benoit Blanchon
2023-07-03 09:20:54 +02:00
parent f6b014582f
commit 1d96826371
14 changed files with 65 additions and 36 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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