Просмотр исходного кода

Fixed error when the key of a `JsonObject` is a `char[]` and reduced code size when using const references (issue #423)

Benoit Blanchon 9 лет назад
Родитель
Сommit
a096098c1f

+ 2 - 0
CHANGELOG.md

@@ -7,6 +7,8 @@ HEAD
 * Fixed parsing of comments (issue #421)
 * Fixed ignored `Stream` timeout (issue #422)
 * Made sure we don't read more that necessary (issue #422)
+* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423)
+* Reduced code size when using `const` references
 
 v5.8.1
 ------

+ 1 - 3
include/ArduinoJson/JsonArray.hpp

@@ -49,9 +49,7 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
       : Internals::List<JsonVariant>(buffer) {}
 
   // Gets the value at the specified index
-  JsonVariant operator[](size_t index) const {
-    return get<JsonVariant>(index);
-  }
+  const JsonArraySubscript operator[](size_t index) const;
 
   // Gets or sets the value at specified index
   JsonArraySubscript operator[](size_t index);

+ 4 - 0
include/ArduinoJson/JsonArraySubscript.hpp

@@ -101,6 +101,10 @@ inline JsonArraySubscript JsonArray::operator[](size_t index) {
   return JsonArraySubscript(*this, index);
 }
 
+inline const JsonArraySubscript JsonArray::operator[](size_t index) const {
+  return JsonArraySubscript(*const_cast<JsonArray*>(this), index);
+}
+
 template <typename TImplem>
 inline JsonArraySubscript JsonVariantBase<TImplem>::operator[](int index) {
   return asArray()[index];

+ 12 - 6
include/ArduinoJson/JsonObject.hpp

@@ -66,18 +66,24 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
 
   // Gets the value associated with the specified key.
   //
-  // JsonVariant operator[](TKey) const;
+  // const JsonObjectSubscript operator[](TKey) const;
   // TKey = const std::string&, const String&
   template <typename TString>
-  const JsonVariant operator[](const TString& key) const {
-    return get_impl<const TString&, JsonVariant>(key);
+  typename TypeTraits::EnableIf<
+      !TypeTraits::IsArray<TString>::value,
+      const JsonObjectSubscript<const TString&> >::type
+  operator[](const TString& key) const {
+    return JsonObjectSubscript<const TString&>(*const_cast<JsonObject*>(this),
+                                               key);
   }
   //
-  // JsonVariant operator[](TKey) const;
+  // const JsonObjectSubscript operator[](TKey) const;
   // TKey = const char*, const char[N], const FlashStringHelper*
   template <typename TString>
-  const JsonVariant operator[](const TString* key) const {
-    return get_impl<const TString*, JsonVariant>(key);
+  const JsonObjectSubscript<const TString*> operator[](
+      const TString* key) const {
+    return JsonObjectSubscript<const TString*>(*const_cast<JsonObject*>(this),
+                                               key);
   }
 
   // Sets the specified key with the specified value.

+ 6 - 0
test/JsonObject_Subscript_Tests.cpp

@@ -131,3 +131,9 @@ TEST_(StoreObjectSubscript) {
 
   EXPECT_EQ(42, _object["a"]);
 }
+
+TEST_(KeyAsCharArray) {  // issue #423
+  char key[] = "hello";
+  _object[key] = 42;
+  EXPECT_EQ(42, _object[key]);
+}