Przeglądaj źródła

Added getElement() and getMember() to JsonVariantConst

Benoit Blanchon 6 lat temu
rodzic
commit
94b1c75fd2

+ 2 - 0
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)
 -------

+ 16 - 0
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<JsonVariant>();
+
+  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);
+  }
+}

+ 1 - 1
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];
 }
 

+ 23 - 4
src/ArduinoJson/Variant/VariantRef.hpp

@@ -369,7 +369,27 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
     return variantAs<typename VariantConstAs<T>::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 <typename TString>
+  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 <typename TChar>
+  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<const VariantData>,
   FORCE_INLINE
       typename enable_if<IsString<TString>::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<const VariantData>,
   FORCE_INLINE
       typename enable_if<IsString<TChar *>::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 {