forked from bblanchon/ArduinoJson
Add a ResourceManager*
member to JsonArrayConst
, JsonObjectConst
, and JsonVariantConst
This commit is contained in:
@ -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.
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user