forked from bblanchon/ArduinoJson
Added JsonVariant::containsKey()
This commit is contained in:
@ -10,6 +10,7 @@ HEAD
|
|||||||
- `is<T>()` returns `false` if the integer `T` overflows
|
- `is<T>()` returns `false` if the integer `T` overflows
|
||||||
* Added `BasicJsonDocument` to support custom allocator (issue #876)
|
* Added `BasicJsonDocument` to support custom allocator (issue #876)
|
||||||
* Added `JsonDocument::containsKey()` (issue #938)
|
* Added `JsonDocument::containsKey()` (issue #938)
|
||||||
|
* Added `JsonVariant::containsKey()`
|
||||||
|
|
||||||
v6.9.1 (2019-03-01)
|
v6.9.1 (2019-03-01)
|
||||||
------
|
------
|
||||||
|
@ -78,6 +78,10 @@ class ArrayConstRef : public ArrayRefBase<const CollectionData>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantConstRef operator[](size_t index) const {
|
FORCE_INLINE VariantConstRef operator[](size_t index) const {
|
||||||
|
return getElement(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE VariantConstRef getElement(size_t index) const {
|
||||||
return VariantConstRef(_data ? _data->get(index) : 0);
|
return VariantConstRef(_data ? _data->get(index) : 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -129,14 +129,14 @@ class JsonDocument : public Visitable {
|
|||||||
// containsKey(const __FlashStringHelper*) const
|
// containsKey(const __FlashStringHelper*) const
|
||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
bool containsKey(TChar* key) const {
|
bool containsKey(TChar* key) const {
|
||||||
return as<ObjectRef>().containsKey(key);
|
return !getMember(key).isUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
// containsKey(const std::string&) const
|
// containsKey(const std::string&) const
|
||||||
// containsKey(const String&) const
|
// containsKey(const String&) const
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
bool containsKey(const TString& key) const {
|
bool containsKey(const TString& key) const {
|
||||||
return as<ObjectRef>().containsKey(key);
|
return !getMember(key).isUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
// operator[](const std::string&)
|
// operator[](const std::string&)
|
||||||
@ -165,7 +165,7 @@ class JsonDocument : public Visitable {
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename enable_if<IsString<TString>::value, VariantConstRef>::type
|
typename enable_if<IsString<TString>::value, VariantConstRef>::type
|
||||||
operator[](const TString& key) const {
|
operator[](const TString& key) const {
|
||||||
return getVariant()[key];
|
return getMember(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// operator[](char*) const
|
// operator[](char*) const
|
||||||
@ -175,7 +175,7 @@ class JsonDocument : public Visitable {
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename enable_if<IsString<TChar*>::value, VariantConstRef>::type
|
typename enable_if<IsString<TChar*>::value, VariantConstRef>::type
|
||||||
operator[](TChar* key) const {
|
operator[](TChar* key) const {
|
||||||
return getVariant()[key];
|
return getMember(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {
|
FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {
|
||||||
@ -183,23 +183,44 @@ class JsonDocument : public Visitable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantConstRef operator[](size_t index) const {
|
FORCE_INLINE VariantConstRef operator[](size_t index) const {
|
||||||
return VariantConstRef(_data.getElement(index));
|
return getElement(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantRef getElement(size_t index) {
|
FORCE_INLINE VariantRef getElement(size_t index) {
|
||||||
return VariantRef(&_pool, _data.getElement(index));
|
return VariantRef(&_pool, _data.getElement(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
// getMember(char*) const
|
FORCE_INLINE VariantConstRef getElement(size_t index) const {
|
||||||
// getMember(const char*) const
|
return VariantConstRef(_data.getElement(index));
|
||||||
// getMember(const __FlashStringHelper*) const
|
}
|
||||||
|
|
||||||
|
// JsonVariantConst getMember(char*) const
|
||||||
|
// JsonVariantConst getMember(const char*) const
|
||||||
|
// JsonVariantConst getMember(const __FlashStringHelper*) const
|
||||||
|
template <typename TChar>
|
||||||
|
FORCE_INLINE VariantConstRef getMember(TChar* key) const {
|
||||||
|
return VariantConstRef(_data.getMember(adaptString(key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// JsonVariantConst getMember(const std::string&) const
|
||||||
|
// JsonVariantConst getMember(const String&) const
|
||||||
|
template <typename TString>
|
||||||
|
FORCE_INLINE
|
||||||
|
typename enable_if<IsString<TString>::value, VariantConstRef>::type
|
||||||
|
getMember(const TString& key) const {
|
||||||
|
return VariantConstRef(_data.getMember(adaptString(key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// JsonVariant getMember(char*)
|
||||||
|
// JsonVariant getMember(const char*)
|
||||||
|
// JsonVariant getMember(const __FlashStringHelper*)
|
||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
FORCE_INLINE VariantRef getMember(TChar* key) {
|
FORCE_INLINE VariantRef getMember(TChar* key) {
|
||||||
return VariantRef(&_pool, _data.getMember(adaptString(key)));
|
return VariantRef(&_pool, _data.getMember(adaptString(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// getMember(const std::string&) const
|
// JsonVariant getMember(const std::string&)
|
||||||
// getMember(const String&) const
|
// JsonVariant getMember(const String&)
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
|
FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
|
||||||
getMember(const TString& key) {
|
getMember(const TString& key) {
|
||||||
|
@ -40,9 +40,9 @@ class MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// operator=(char*) const
|
// operator=(char*)
|
||||||
// operator=(const char*) const
|
// operator=(const char*)
|
||||||
// operator=(const __FlashStringHelper*) const
|
// operator=(const __FlashStringHelper*)
|
||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
FORCE_INLINE this_type &operator=(TChar *src) {
|
FORCE_INLINE this_type &operator=(TChar *src) {
|
||||||
getOrAddUpstreamMember().set(src);
|
getOrAddUpstreamMember().set(src);
|
||||||
|
@ -16,11 +16,6 @@ void objectAccept(const CollectionData *obj, Visitor &visitor) {
|
|||||||
visitor.visitNull();
|
visitor.visitNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
|
||||||
inline bool objectContainsKey(const CollectionData *obj, TAdaptedString key) {
|
|
||||||
return obj && obj->containsKey(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool objectEquals(const CollectionData *lhs, const CollectionData *rhs) {
|
inline bool objectEquals(const CollectionData *lhs, const CollectionData *rhs) {
|
||||||
if (lhs == rhs) return true;
|
if (lhs == rhs) return true;
|
||||||
if (!lhs || !rhs) return false;
|
if (!lhs || !rhs) return false;
|
||||||
|
@ -35,4 +35,18 @@ inline ObjectRef ObjectShortcuts<TObject>::createNestedObject(
|
|||||||
TChar* key) const {
|
TChar* key) const {
|
||||||
return impl()->getOrAddMember(key).template to<ObjectRef>();
|
return impl()->getOrAddMember(key).template to<ObjectRef>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TObject>
|
||||||
|
template <typename TString>
|
||||||
|
inline typename enable_if<IsString<TString>::value, bool>::type
|
||||||
|
ObjectShortcuts<TObject>::containsKey(const TString& key) const {
|
||||||
|
return !impl()->getMember(key).isUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TObject>
|
||||||
|
template <typename TChar>
|
||||||
|
inline typename enable_if<IsString<TChar*>::value, bool>::type
|
||||||
|
ObjectShortcuts<TObject>::containsKey(TChar* key) const {
|
||||||
|
return !impl()->getMember(key).isUndefined();
|
||||||
|
}
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
@ -27,21 +27,6 @@ class ObjectRefBase {
|
|||||||
objectAccept(_data, visitor);
|
objectAccept(_data, visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// containsKey(const std::string&) const
|
|
||||||
// containsKey(const String&) const
|
|
||||||
template <typename TString>
|
|
||||||
FORCE_INLINE bool containsKey(const TString& key) const {
|
|
||||||
return objectContainsKey(_data, adaptString(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
// containsKey(char*) const
|
|
||||||
// containsKey(const char*) const
|
|
||||||
// containsKey(const __FlashStringHelper*) const
|
|
||||||
template <typename TChar>
|
|
||||||
FORCE_INLINE bool containsKey(TChar* key) const {
|
|
||||||
return objectContainsKey(_data, adaptString(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE bool isNull() const {
|
FORCE_INLINE bool isNull() const {
|
||||||
return _data == 0;
|
return _data == 0;
|
||||||
}
|
}
|
||||||
@ -83,6 +68,21 @@ class ObjectConstRef : public ObjectRefBase<const CollectionData>,
|
|||||||
return iterator();
|
return iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// containsKey(const std::string&) const
|
||||||
|
// containsKey(const String&) const
|
||||||
|
template <typename TString>
|
||||||
|
FORCE_INLINE bool containsKey(const TString& key) const {
|
||||||
|
return !getMember(key).isUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
// containsKey(char*) const
|
||||||
|
// containsKey(const char*) const
|
||||||
|
// containsKey(const __FlashStringHelper*) const
|
||||||
|
template <typename TChar>
|
||||||
|
FORCE_INLINE bool containsKey(TChar* key) const {
|
||||||
|
return !getMember(key).isUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
// getMember(const std::string&) const
|
// getMember(const std::string&) const
|
||||||
// getMember(const String&) const
|
// getMember(const String&) const
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
|
@ -15,6 +15,19 @@ class MemberProxy;
|
|||||||
template <typename TObject>
|
template <typename TObject>
|
||||||
class ObjectShortcuts {
|
class ObjectShortcuts {
|
||||||
public:
|
public:
|
||||||
|
// containsKey(const std::string&) const
|
||||||
|
// containsKey(const String&) const
|
||||||
|
template <typename TString>
|
||||||
|
FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type
|
||||||
|
containsKey(const TString &key) const;
|
||||||
|
|
||||||
|
// containsKey(char*) const
|
||||||
|
// containsKey(const char*) const
|
||||||
|
// containsKey(const __FlashStringHelper*) const
|
||||||
|
template <typename TChar>
|
||||||
|
FORCE_INLINE typename enable_if<IsString<TChar *>::value, bool>::type
|
||||||
|
containsKey(TChar *key) const;
|
||||||
|
|
||||||
// operator[](const std::string&) const
|
// operator[](const std::string&) const
|
||||||
// operator[](const String&) const
|
// operator[](const String&) const
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
|
@ -96,6 +96,10 @@ class VariantRefBase {
|
|||||||
return variantIsNull(_data);
|
return variantIsNull(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE bool isUndefined() const {
|
||||||
|
return !_data;
|
||||||
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t memoryUsage() const {
|
FORCE_INLINE size_t memoryUsage() const {
|
||||||
return _data ? _data->memoryUsage() : 0;
|
return _data ? _data->memoryUsage() : 0;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ add_executable(JsonVariantTests
|
|||||||
as.cpp
|
as.cpp
|
||||||
clear.cpp
|
clear.cpp
|
||||||
compare.cpp
|
compare.cpp
|
||||||
|
containsKey.cpp
|
||||||
copy.cpp
|
copy.cpp
|
||||||
createNested.cpp
|
createNested.cpp
|
||||||
is.cpp
|
is.cpp
|
||||||
|
28
test/JsonVariant/containsKey.cpp
Normal file
28
test/JsonVariant/containsKey.cpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// ArduinoJson - arduinojson.org
|
||||||
|
// Copyright Benoit Blanchon 2014-2019
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
static const char* null = 0;
|
||||||
|
|
||||||
|
TEST_CASE("JsonVariant::containsKey()") {
|
||||||
|
DynamicJsonDocument doc(4096);
|
||||||
|
JsonVariant var = doc.to<JsonVariant>();
|
||||||
|
|
||||||
|
SECTION("containsKey(const char*) returns true") {
|
||||||
|
var["hello"] = "world";
|
||||||
|
|
||||||
|
REQUIRE(var.containsKey("hello") == true);
|
||||||
|
REQUIRE(var.containsKey("world") == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("containsKey(std::string) returns true") {
|
||||||
|
var["hello"] = "world";
|
||||||
|
|
||||||
|
REQUIRE(var.containsKey(std::string("hello")) == true);
|
||||||
|
REQUIRE(var.containsKey(std::string("world")) == false);
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@
|
|||||||
add_executable(MemberProxyTests
|
add_executable(MemberProxyTests
|
||||||
add.cpp
|
add.cpp
|
||||||
clear.cpp
|
clear.cpp
|
||||||
|
containsKey.cpp
|
||||||
remove.cpp
|
remove.cpp
|
||||||
set.cpp
|
set.cpp
|
||||||
size.cpp
|
size.cpp
|
||||||
|
27
test/MemberProxy/containsKey.cpp
Normal file
27
test/MemberProxy/containsKey.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// ArduinoJson - arduinojson.org
|
||||||
|
// Copyright Benoit Blanchon 2014-2019
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
using namespace ARDUINOJSON_NAMESPACE;
|
||||||
|
|
||||||
|
TEST_CASE("MemberProxy::containsKey()") {
|
||||||
|
DynamicJsonDocument doc(4096);
|
||||||
|
MemberProxy<JsonDocument&, const char*> mp = doc["hello"];
|
||||||
|
|
||||||
|
SECTION("containsKey(const char*)") {
|
||||||
|
mp["key"] = "value";
|
||||||
|
|
||||||
|
REQUIRE(mp.containsKey("key") == true);
|
||||||
|
REQUIRE(mp.containsKey("key") == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("containsKey(std::string)") {
|
||||||
|
mp["key"] = "value";
|
||||||
|
|
||||||
|
REQUIRE(mp.containsKey(std::string("key")) == true);
|
||||||
|
REQUIRE(mp.containsKey(std::string("key")) == true);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user