mirror of
https://github.com/eledio-devices/thirdparty-ArduinoJson.git
synced 2025-11-01 16:14:05 +01:00
Fix is<object>() and getMember()
This commit is contained in:
@@ -60,16 +60,16 @@ TEST_CASE("Linked document") {
|
|||||||
|
|
||||||
// TODO: move in size.cpp
|
// TODO: move in size.cpp
|
||||||
SECTION("size()") {
|
SECTION("size()") {
|
||||||
CHECK(doc1.size() == 1);
|
CHECK(variant.size() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("is<T>()") {
|
SECTION("is<T>()") {
|
||||||
CHECK(doc1.is<JsonArrayConst>() == false);
|
CHECK(variant.is<JsonArrayConst>() == false);
|
||||||
CHECK(doc1.is<JsonObjectConst>() == true);
|
CHECK(variant.is<JsonObjectConst>() == true);
|
||||||
CHECK(doc1.is<JsonObject>() == false);
|
CHECK(variant.is<JsonObject>() == false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("get member") {
|
SECTION("get member") {
|
||||||
CHECK(doc1["hello"].as<std::string>() == "world");
|
CHECK(variant["hello"].as<std::string>() == "world");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ struct Converter<ObjectRef> {
|
|||||||
|
|
||||||
static bool checkJson(VariantRef src) {
|
static bool checkJson(VariantRef src) {
|
||||||
VariantData* data = getData(src);
|
VariantData* data = getData(src);
|
||||||
return data && data->isObject();
|
return data && data->isObjectStrict();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ class VariantData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const CollectionData *asObject() const {
|
const CollectionData *asObject() const {
|
||||||
|
if (isPointer())
|
||||||
|
return _content.asPointer->asObject();
|
||||||
return const_cast<VariantData *>(this)->asObject();
|
return const_cast<VariantData *>(this)->asObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +146,12 @@ class VariantData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool isObject() const {
|
bool isObject() const {
|
||||||
|
if (isPointer())
|
||||||
|
return _content.asPointer->isObject();
|
||||||
|
return isObjectStrict();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isObjectStrict() const {
|
||||||
return (_flags & VALUE_IS_OBJECT) != 0;
|
return (_flags & VALUE_IS_OBJECT) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +174,13 @@ class VariantData {
|
|||||||
_content.asCollection.removeMember(key);
|
_content.asCollection.removeMember(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const VariantData *resolve() const {
|
||||||
|
if (isPointer())
|
||||||
|
return _content.asPointer->resolve();
|
||||||
|
else
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
void setBoolean(bool value) {
|
void setBoolean(bool value) {
|
||||||
setType(VALUE_IS_BOOLEAN);
|
setType(VALUE_IS_BOOLEAN);
|
||||||
_content.asBoolean = value;
|
_content.asBoolean = value;
|
||||||
@@ -290,7 +305,8 @@ class VariantData {
|
|||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
VariantData *getMember(TAdaptedString key) const {
|
VariantData *getMember(TAdaptedString key) const {
|
||||||
return isObject() ? _content.asCollection.getMember(key) : 0;
|
const CollectionData *col = asObject();
|
||||||
|
return col ? col->getMember(key) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TAdaptedString, typename TStoragePolicy>
|
template <typename TAdaptedString, typename TStoragePolicy>
|
||||||
|
|||||||
@@ -52,13 +52,15 @@ class VariantRefBase : public VariantTag {
|
|||||||
VariantRefBase(TData *data) : _data(data) {}
|
VariantRefBase(TData *data) : _data(data) {}
|
||||||
TData *_data;
|
TData *_data;
|
||||||
|
|
||||||
|
// const TData *getData() const {
|
||||||
|
// const TData *data = _data;
|
||||||
|
// if (!_data)
|
||||||
|
// return 0;
|
||||||
|
// return _data->resolve();
|
||||||
|
// }
|
||||||
|
|
||||||
friend TData *getData(const VariantRefBase &variant) {
|
friend TData *getData(const VariantRefBase &variant) {
|
||||||
TData *data = variant._data;
|
return variant._data;
|
||||||
if (!data)
|
|
||||||
return 0;
|
|
||||||
while (data->isPointer())
|
|
||||||
data = data->asPointer; // TODO: test multiple levels
|
|
||||||
return data;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user