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

Added a deprecation warning for as<char>() and set(char)

Benoit Blanchon 4 лет назад
Родитель
Сommit
4780174ee1
3 измененных файлов с 75 добавлено и 6 удалено
  1. 1 0
      CHANGELOG.md
  2. 42 0
      extras/tests/Misc/deprecated.cpp
  3. 32 6
      src/ArduinoJson/Variant/VariantRef.hpp

+ 1 - 0
CHANGELOG.md

@@ -43,6 +43,7 @@ HEAD
 > int8_t age;
 > int8_t age;
 > doc["age"] = age;  // OK
 > doc["age"] = age;  // OK
 > ```
 > ```
+> A deprecation warning with the message "Support for `char` is deprecated, use `int8_t` or `uint8_t` instead" was added to allow a smooth transition.
 >
 >
 > #### `as<T>()` always returns `T`
 > #### `as<T>()` always returns `T`
 >
 >

+ 42 - 0
extras/tests/Misc/deprecated.cpp

@@ -11,23 +11,65 @@ TEST_CASE("Deprecated features") {
   StaticJsonDocument<256> doc;
   StaticJsonDocument<256> doc;
   const char* s = "hello";
   const char* s = "hello";
   doc["s"] = s;
   doc["s"] = s;
+  doc["c"] = 42;
   doc["a"].add(s);
   doc["a"].add(s);
+  doc["a"].add(42);
+
+  SECTION("JsonVariant::add(char)") {
+    JsonVariant v = doc.to<JsonVariant>();
+    v.add('*');
+    REQUIRE(v[0] == 42);
+  }
 
 
   SECTION("JsonVariant::as<char*>()") {
   SECTION("JsonVariant::as<char*>()") {
     JsonVariant v = doc["s"];
     JsonVariant v = doc["s"];
     REQUIRE(v.as<char*>() == s);
     REQUIRE(v.as<char*>() == s);
   }
   }
 
 
+  SECTION("JsonVariant::as<char>()") {
+    JsonVariant v = doc["c"];
+    REQUIRE(v.as<char>() == '*');
+  }
+
+  SECTION("JsonVariant::set(char)") {
+    JsonVariant v = doc.to<JsonVariant>();
+    v.set('*');
+    REQUIRE(v.as<unsigned char>() == 42);
+  }
+
   SECTION("JsonVariantConst::as<char*>()") {
   SECTION("JsonVariantConst::as<char*>()") {
     JsonVariantConst v = doc["s"];
     JsonVariantConst v = doc["s"];
     REQUIRE(v.as<char*>() == s);
     REQUIRE(v.as<char*>() == s);
   }
   }
 
 
+  SECTION("JsonVariantConst::as<char>()") {
+    JsonVariantConst v = doc["c"];
+    REQUIRE(v.as<char>() == '*');
+  }
+
   SECTION("MemberProxy::as<char*>()") {
   SECTION("MemberProxy::as<char*>()") {
     REQUIRE(doc["s"].as<char*>() == s);
     REQUIRE(doc["s"].as<char*>() == s);
   }
   }
 
 
+  SECTION("MemberProxy::as<char>()") {
+    REQUIRE(doc["c"].as<char>() == '*');
+  }
+
+  SECTION("MemberProxy::as<char>()") {
+    doc["x"].set('*');
+    REQUIRE(doc["x"] == 42);
+  }
+
   SECTION("ElementProxy::as<char*>()") {
   SECTION("ElementProxy::as<char*>()") {
     REQUIRE(doc["a"][0].as<char*>() == s);
     REQUIRE(doc["a"][0].as<char*>() == s);
   }
   }
+
+  SECTION("ElementProxy::as<char>()") {
+    REQUIRE(doc["a"][1].as<char>() == '*');
+  }
+
+  SECTION("ElementProxy::as<char>()") {
+    doc["a"][0].set('*');
+    REQUIRE(doc["a"][0] == 42);
+  }
 }
 }

+ 32 - 6
src/ArduinoJson/Variant/VariantRef.hpp

@@ -88,14 +88,22 @@ class VariantRef : public VariantRefBase<VariantData>,
     return Converter<T>::toJson(value, *this);
     return Converter<T>::toJson(value, *this);
   }
   }
 
 
+  FORCE_INLINE bool ARDUINOJSON_DEPRECATED(
+      "Support for char is deprecated, use int8_t or uint8_t instead")
+      set(char value) const {
+    return set<signed char>(value);
+  }
+
   template <typename T>
   template <typename T>
   FORCE_INLINE bool set(T *value) const {
   FORCE_INLINE bool set(T *value) const {
     return Converter<T *>::toJson(value, *this);
     return Converter<T *>::toJson(value, *this);
   }
   }
 
 
   template <typename T>
   template <typename T>
-  FORCE_INLINE typename enable_if<!is_same<T, char *>::value, T>::type as()
-      const {
+  FORCE_INLINE
+      typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
+                         T>::type
+      as() const {
     return Converter<T>::fromJson(*this);
     return Converter<T>::fromJson(*this);
   }
   }
 
 
@@ -106,6 +114,14 @@ class VariantRef : public VariantRefBase<VariantData>,
     return as<const char *>();
     return as<const char *>();
   }
   }
 
 
+  template <typename T>
+  FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
+  ARDUINOJSON_DEPRECATED(
+      "Support for char is deprecated, use int8_t or uint8_t instead")
+      as() const {
+    return as<signed char>();
+  }
+
   template <typename T>
   template <typename T>
   FORCE_INLINE bool is() const {
   FORCE_INLINE bool is() const {
     return Converter<T>::checkJson(*this);
     return Converter<T>::checkJson(*this);
@@ -113,7 +129,7 @@ class VariantRef : public VariantRefBase<VariantData>,
 
 
   template <typename T>
   template <typename T>
   FORCE_INLINE operator T() const {
   FORCE_INLINE operator T() const {
-    return Converter<T>::fromJson(*this);
+    return as<T>();
   }
   }
 
 
   template <typename TVisitor>
   template <typename TVisitor>
@@ -212,8 +228,10 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
   }
   }
 
 
   template <typename T>
   template <typename T>
-  FORCE_INLINE typename enable_if<!is_same<T, char *>::value, T>::type as()
-      const {
+  FORCE_INLINE
+      typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
+                         T>::type
+      as() const {
     return Converter<T>::fromJson(*this);
     return Converter<T>::fromJson(*this);
   }
   }
 
 
@@ -224,6 +242,14 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
     return as<const char *>();
     return as<const char *>();
   }
   }
 
 
+  template <typename T>
+  FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
+  ARDUINOJSON_DEPRECATED(
+      "Support for char is deprecated, use int8_t or uint8_t instead")
+      as() const {
+    return as<signed char>();
+  }
+
   template <typename T>
   template <typename T>
   FORCE_INLINE bool is() const {
   FORCE_INLINE bool is() const {
     return Converter<T>::checkJson(*this);
     return Converter<T>::checkJson(*this);
@@ -231,7 +257,7 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
 
 
   template <typename T>
   template <typename T>
   FORCE_INLINE operator T() const {
   FORCE_INLINE operator T() const {
-    return Converter<T>::fromJson(*this);
+    return as<T>();
   }
   }
 
 
   FORCE_INLINE VariantConstRef getElement(size_t) const;
   FORCE_INLINE VariantConstRef getElement(size_t) const;