From 4780174ee1963f7ef313d87bc7bbaa3058c6f5e1 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Tue, 4 May 2021 14:48:51 +0200 Subject: [PATCH] Added a deprecation warning for as() and set(char) --- CHANGELOG.md | 1 + extras/tests/Misc/deprecated.cpp | 42 ++++++++++++++++++++++++++ src/ArduinoJson/Variant/VariantRef.hpp | 38 +++++++++++++++++++---- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4106cbcb..4b8a6d8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ HEAD > int8_t age; > 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()` always returns `T` > diff --git a/extras/tests/Misc/deprecated.cpp b/extras/tests/Misc/deprecated.cpp index 1d1eb422..8df4284f 100644 --- a/extras/tests/Misc/deprecated.cpp +++ b/extras/tests/Misc/deprecated.cpp @@ -11,23 +11,65 @@ TEST_CASE("Deprecated features") { StaticJsonDocument<256> doc; const char* s = "hello"; doc["s"] = s; + doc["c"] = 42; doc["a"].add(s); + doc["a"].add(42); + + SECTION("JsonVariant::add(char)") { + JsonVariant v = doc.to(); + v.add('*'); + REQUIRE(v[0] == 42); + } SECTION("JsonVariant::as()") { JsonVariant v = doc["s"]; REQUIRE(v.as() == s); } + SECTION("JsonVariant::as()") { + JsonVariant v = doc["c"]; + REQUIRE(v.as() == '*'); + } + + SECTION("JsonVariant::set(char)") { + JsonVariant v = doc.to(); + v.set('*'); + REQUIRE(v.as() == 42); + } + SECTION("JsonVariantConst::as()") { JsonVariantConst v = doc["s"]; REQUIRE(v.as() == s); } + SECTION("JsonVariantConst::as()") { + JsonVariantConst v = doc["c"]; + REQUIRE(v.as() == '*'); + } + SECTION("MemberProxy::as()") { REQUIRE(doc["s"].as() == s); } + SECTION("MemberProxy::as()") { + REQUIRE(doc["c"].as() == '*'); + } + + SECTION("MemberProxy::as()") { + doc["x"].set('*'); + REQUIRE(doc["x"] == 42); + } + SECTION("ElementProxy::as()") { REQUIRE(doc["a"][0].as() == s); } + + SECTION("ElementProxy::as()") { + REQUIRE(doc["a"][1].as() == '*'); + } + + SECTION("ElementProxy::as()") { + doc["a"][0].set('*'); + REQUIRE(doc["a"][0] == 42); + } } diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index 65913ae7..01e57316 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -88,14 +88,22 @@ class VariantRef : public VariantRefBase, return Converter::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(value); + } + template FORCE_INLINE bool set(T *value) const { return Converter::toJson(value, *this); } template - FORCE_INLINE typename enable_if::value, T>::type as() - const { + FORCE_INLINE + typename enable_if::value && !is_same::value, + T>::type + as() const { return Converter::fromJson(*this); } @@ -106,6 +114,14 @@ class VariantRef : public VariantRefBase, return as(); } + template + FORCE_INLINE typename enable_if::value, char>::type + ARDUINOJSON_DEPRECATED( + "Support for char is deprecated, use int8_t or uint8_t instead") + as() const { + return as(); + } + template FORCE_INLINE bool is() const { return Converter::checkJson(*this); @@ -113,7 +129,7 @@ class VariantRef : public VariantRefBase, template FORCE_INLINE operator T() const { - return Converter::fromJson(*this); + return as(); } template @@ -212,8 +228,10 @@ class VariantConstRef : public VariantRefBase, } template - FORCE_INLINE typename enable_if::value, T>::type as() - const { + FORCE_INLINE + typename enable_if::value && !is_same::value, + T>::type + as() const { return Converter::fromJson(*this); } @@ -224,6 +242,14 @@ class VariantConstRef : public VariantRefBase, return as(); } + template + FORCE_INLINE typename enable_if::value, char>::type + ARDUINOJSON_DEPRECATED( + "Support for char is deprecated, use int8_t or uint8_t instead") + as() const { + return as(); + } + template FORCE_INLINE bool is() const { return Converter::checkJson(*this); @@ -231,7 +257,7 @@ class VariantConstRef : public VariantRefBase, template FORCE_INLINE operator T() const { - return Converter::fromJson(*this); + return as(); } FORCE_INLINE VariantConstRef getElement(size_t) const;