From 94b1c75fd23e1e32bfb9fc4c33921eea9cf485ca Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 27 Jan 2020 12:35:32 +0100 Subject: [PATCH] Added getElement() and getMember() to JsonVariantConst --- CHANGELOG.md | 2 ++ extras/tests/JsonVariant/containsKey.cpp | 16 ++++++++++++++ src/ArduinoJson/Variant/VariantImpl.hpp | 2 +- src/ArduinoJson/Variant/VariantRef.hpp | 27 ++++++++++++++++++++---- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cab7edc..525a18f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ HEAD ---- * Fixed regression in UTF16 decoding (issue #1173) +* Fixed `containsKey()` on `JsonVariantConst` +* Added `getElement()` and `getMember()` to `JsonVariantConst` v6.14.0 (2020-01-16) ------- diff --git a/extras/tests/JsonVariant/containsKey.cpp b/extras/tests/JsonVariant/containsKey.cpp index e0cc72a9..9314cd16 100644 --- a/extras/tests/JsonVariant/containsKey.cpp +++ b/extras/tests/JsonVariant/containsKey.cpp @@ -26,3 +26,19 @@ TEST_CASE("JsonVariant::containsKey()") { REQUIRE(var.containsKey(std::string("world")) == false); } } + +TEST_CASE("JsonVariantConst::containsKey()") { + DynamicJsonDocument doc(4096); + doc["hello"] = "world"; + JsonVariantConst cvar = doc.as(); + + SECTION("containsKey(const char*) returns true") { + REQUIRE(cvar.containsKey("hello") == true); + REQUIRE(cvar.containsKey("world") == false); + } + + SECTION("containsKey(std::string) returns true") { + REQUIRE(cvar.containsKey(std::string("hello")) == true); + REQUIRE(cvar.containsKey(std::string("world")) == false); + } +} diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 81b8d720..8c26266d 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -114,7 +114,7 @@ VariantRef::to() const { return *this; } -inline VariantConstRef VariantConstRef::operator[](size_t index) const { +inline VariantConstRef VariantConstRef::getElement(size_t index) const { return ArrayConstRef(_data != 0 ? _data->asArray() : 0)[index]; } diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index 7ded4d39..1bef610a 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -369,7 +369,27 @@ class VariantConstRef : public VariantRefBase, return variantAs::type>(_data); } - FORCE_INLINE VariantConstRef operator[](size_t index) const; + FORCE_INLINE VariantConstRef getElement(size_t) const; + + FORCE_INLINE VariantConstRef operator[](size_t index) const { + return getElement(index); + } + + // getMember(const std::string&) const + // getMember(const String&) const + template + FORCE_INLINE VariantConstRef getMember(const TString &key) const { + return VariantConstRef(objectGet(variantAsObject(_data), adaptString(key))); + } + + // getMember(char*) const + // getMember(const char*) const + // getMember(const __FlashStringHelper*) const + template + FORCE_INLINE VariantConstRef getMember(TChar *key) const { + const CollectionData *obj = variantAsObject(_data); + return VariantConstRef(obj ? obj->get(adaptString(key)) : 0); + } // operator[](const std::string&) const // operator[](const String&) const @@ -377,7 +397,7 @@ class VariantConstRef : public VariantRefBase, FORCE_INLINE typename enable_if::value, VariantConstRef>::type operator[](const TString &key) const { - return VariantConstRef(objectGet(variantAsObject(_data), adaptString(key))); + return getMember(key); } // operator[](char*) const @@ -387,8 +407,7 @@ class VariantConstRef : public VariantRefBase, FORCE_INLINE typename enable_if::value, VariantConstRef>::type operator[](TChar *key) const { - const CollectionData *obj = variantAsObject(_data); - return VariantConstRef(obj ? obj->get(adaptString(key)) : 0); + return getMember(key); } FORCE_INLINE bool operator==(VariantConstRef lhs) const {