Skip to content

Commit 4780174

Browse files
committed
Added a deprecation warning for as<char>() and set(char)
1 parent ab23625 commit 4780174

File tree

3 files changed

+75
-6
lines changed

3 files changed

+75
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ HEAD
4343
> int8_t age;
4444
> doc["age"] = age; // OK
4545
> ```
46+
> 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.
4647
>
4748
> #### `as<T>()` always returns `T`
4849
>

extras/tests/Misc/deprecated.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,65 @@ TEST_CASE("Deprecated features") {
1111
StaticJsonDocument<256> doc;
1212
const char* s = "hello";
1313
doc["s"] = s;
14+
doc["c"] = 42;
1415
doc["a"].add(s);
16+
doc["a"].add(42);
17+
18+
SECTION("JsonVariant::add(char)") {
19+
JsonVariant v = doc.to<JsonVariant>();
20+
v.add('*');
21+
REQUIRE(v[0] == 42);
22+
}
1523

1624
SECTION("JsonVariant::as<char*>()") {
1725
JsonVariant v = doc["s"];
1826
REQUIRE(v.as<char*>() == s);
1927
}
2028

29+
SECTION("JsonVariant::as<char>()") {
30+
JsonVariant v = doc["c"];
31+
REQUIRE(v.as<char>() == '*');
32+
}
33+
34+
SECTION("JsonVariant::set(char)") {
35+
JsonVariant v = doc.to<JsonVariant>();
36+
v.set('*');
37+
REQUIRE(v.as<unsigned char>() == 42);
38+
}
39+
2140
SECTION("JsonVariantConst::as<char*>()") {
2241
JsonVariantConst v = doc["s"];
2342
REQUIRE(v.as<char*>() == s);
2443
}
2544

45+
SECTION("JsonVariantConst::as<char>()") {
46+
JsonVariantConst v = doc["c"];
47+
REQUIRE(v.as<char>() == '*');
48+
}
49+
2650
SECTION("MemberProxy::as<char*>()") {
2751
REQUIRE(doc["s"].as<char*>() == s);
2852
}
2953

54+
SECTION("MemberProxy::as<char>()") {
55+
REQUIRE(doc["c"].as<char>() == '*');
56+
}
57+
58+
SECTION("MemberProxy::as<char>()") {
59+
doc["x"].set('*');
60+
REQUIRE(doc["x"] == 42);
61+
}
62+
3063
SECTION("ElementProxy::as<char*>()") {
3164
REQUIRE(doc["a"][0].as<char*>() == s);
3265
}
66+
67+
SECTION("ElementProxy::as<char>()") {
68+
REQUIRE(doc["a"][1].as<char>() == '*');
69+
}
70+
71+
SECTION("ElementProxy::as<char>()") {
72+
doc["a"][0].set('*');
73+
REQUIRE(doc["a"][0] == 42);
74+
}
3375
}

src/ArduinoJson/Variant/VariantRef.hpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,22 @@ class VariantRef : public VariantRefBase<VariantData>,
8888
return Converter<T>::toJson(value, *this);
8989
}
9090

91+
FORCE_INLINE bool ARDUINOJSON_DEPRECATED(
92+
"Support for char is deprecated, use int8_t or uint8_t instead")
93+
set(char value) const {
94+
return set<signed char>(value);
95+
}
96+
9197
template <typename T>
9298
FORCE_INLINE bool set(T *value) const {
9399
return Converter<T *>::toJson(value, *this);
94100
}
95101

96102
template <typename T>
97-
FORCE_INLINE typename enable_if<!is_same<T, char *>::value, T>::type as()
98-
const {
103+
FORCE_INLINE
104+
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
105+
T>::type
106+
as() const {
99107
return Converter<T>::fromJson(*this);
100108
}
101109

@@ -106,14 +114,22 @@ class VariantRef : public VariantRefBase<VariantData>,
106114
return as<const char *>();
107115
}
108116

117+
template <typename T>
118+
FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
119+
ARDUINOJSON_DEPRECATED(
120+
"Support for char is deprecated, use int8_t or uint8_t instead")
121+
as() const {
122+
return as<signed char>();
123+
}
124+
109125
template <typename T>
110126
FORCE_INLINE bool is() const {
111127
return Converter<T>::checkJson(*this);
112128
}
113129

114130
template <typename T>
115131
FORCE_INLINE operator T() const {
116-
return Converter<T>::fromJson(*this);
132+
return as<T>();
117133
}
118134

119135
template <typename TVisitor>
@@ -212,8 +228,10 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
212228
}
213229

214230
template <typename T>
215-
FORCE_INLINE typename enable_if<!is_same<T, char *>::value, T>::type as()
216-
const {
231+
FORCE_INLINE
232+
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
233+
T>::type
234+
as() const {
217235
return Converter<T>::fromJson(*this);
218236
}
219237

@@ -224,14 +242,22 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
224242
return as<const char *>();
225243
}
226244

245+
template <typename T>
246+
FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
247+
ARDUINOJSON_DEPRECATED(
248+
"Support for char is deprecated, use int8_t or uint8_t instead")
249+
as() const {
250+
return as<signed char>();
251+
}
252+
227253
template <typename T>
228254
FORCE_INLINE bool is() const {
229255
return Converter<T>::checkJson(*this);
230256
}
231257

232258
template <typename T>
233259
FORCE_INLINE operator T() const {
234-
return Converter<T>::fromJson(*this);
260+
return as<T>();
235261
}
236262

237263
FORCE_INLINE VariantConstRef getElement(size_t) const;

0 commit comments

Comments
 (0)