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 // 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");
} }
} }

View File

@@ -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

View File

@@ -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>

View File

@@ -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;
} }
}; };