Fix is<object>() and getMember()

This commit is contained in:
Benoit Blanchon
2022-03-10 18:26:37 +01:00
parent 781928a588
commit 9d427982cc
4 changed files with 31 additions and 13 deletions

View File

@@ -60,16 +60,16 @@ TEST_CASE("Linked document") {
// TODO: move in size.cpp
SECTION("size()") {
CHECK(doc1.size() == 1);
CHECK(variant.size() == 1);
}
SECTION("is<T>()") {
CHECK(doc1.is<JsonArrayConst>() == false);
CHECK(doc1.is<JsonObjectConst>() == true);
CHECK(doc1.is<JsonObject>() == false);
CHECK(variant.is<JsonArrayConst>() == false);
CHECK(variant.is<JsonObjectConst>() == true);
CHECK(variant.is<JsonObject>() == false);
}
SECTION("get member") {
CHECK(doc1["hello"].as<std::string>() == "world");
CHECK(variant["hello"].as<std::string>() == "world");
}
}

View File

@@ -276,7 +276,7 @@ struct Converter<ObjectRef> {
static bool checkJson(VariantRef src) {
VariantData* data = getData(src);
return data && data->isObject();
return data && data->isObjectStrict();
}
};
} // namespace ARDUINOJSON_NAMESPACE

View File

@@ -100,6 +100,8 @@ class VariantData {
}
const CollectionData *asObject() const {
if (isPointer())
return _content.asPointer->asObject();
return const_cast<VariantData *>(this)->asObject();
}
@@ -144,6 +146,12 @@ class VariantData {
}
bool isObject() const {
if (isPointer())
return _content.asPointer->isObject();
return isObjectStrict();
}
bool isObjectStrict() const {
return (_flags & VALUE_IS_OBJECT) != 0;
}
@@ -166,6 +174,13 @@ class VariantData {
_content.asCollection.removeMember(key);
}
const VariantData *resolve() const {
if (isPointer())
return _content.asPointer->resolve();
else
return this;
}
void setBoolean(bool value) {
setType(VALUE_IS_BOOLEAN);
_content.asBoolean = value;
@@ -290,7 +305,8 @@ class VariantData {
template <typename TAdaptedString>
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>

View File

@@ -52,13 +52,15 @@ class VariantRefBase : public VariantTag {
VariantRefBase(TData *data) : _data(data) {}
TData *_data;
// const TData *getData() const {
// const TData *data = _data;
// if (!_data)
// return 0;
// return _data->resolve();
// }
friend TData *getData(const VariantRefBase &variant) {
TData *data = variant._data;
if (!data)
return 0;
while (data->isPointer())
data = data->asPointer; // TODO: test multiple levels
return data;
return variant._data;
}
};