Skip to content

Commit 81f7e93

Browse files
committed
Move public facing SFINAEs to template declarations
1 parent e33e78d commit 81f7e93

File tree

11 files changed

+257
-260
lines changed

11 files changed

+257
-260
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ HEAD
1010
* `JsonString` is now stored by copy, unless specified otherwise
1111
* Replace undocumented `JsonString::Ownership` with `bool`
1212
* Rename undocumented `JsonString::isLinked()` to `isStatic()`
13+
* Move public facing SFINAEs to template declarations
1314

1415
> ### BREAKING CHANGES
1516
>

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,18 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
4343
// Appends a new (empty) element to the array.
4444
// Returns a reference to the new element.
4545
// https://arduinojson.org/v7/api/jsonarray/add/
46-
template <typename T>
47-
detail::enable_if_t<!detail::is_same<T, JsonVariant>::value, T> add() const {
46+
template <typename T, detail::enable_if_t<
47+
!detail::is_same<T, JsonVariant>::value, int> = 0>
48+
T add() const {
4849
return add<JsonVariant>().to<T>();
4950
}
5051

5152
// Appends a new (null) element to the array.
5253
// Returns a reference to the new element.
5354
// https://arduinojson.org/v7/api/jsonarray/add/
54-
template <typename T>
55-
detail::enable_if_t<detail::is_same<T, JsonVariant>::value, T> add() const {
55+
template <typename T, detail::enable_if_t<
56+
detail::is_same<T, JsonVariant>::value, short> = 0>
57+
JsonVariant add() const {
5658
return JsonVariant(detail::ArrayData::addElement(data_, resources_),
5759
resources_);
5860
}
@@ -115,9 +117,9 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
115117

116118
// Removes the element at the specified index.
117119
// https://arduinojson.org/v7/api/jsonarray/remove/
118-
template <typename TVariant>
119-
detail::enable_if_t<detail::IsVariant<TVariant>::value> remove(
120-
const TVariant& variant) const {
120+
template <typename TVariant,
121+
detail::enable_if_t<detail::IsVariant<TVariant>::value, int> = 0>
122+
void remove(const TVariant& variant) const {
121123
if (variant.template is<size_t>())
122124
remove(variant.template as<size_t>());
123125
}
@@ -130,19 +132,17 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
130132

131133
// Gets or sets the element at the specified index.
132134
// https://arduinojson.org/v7/api/jsonarray/subscript/
133-
template <typename T>
134-
detail::enable_if_t<detail::is_integral<T>::value,
135-
detail::ElementProxy<JsonArray>>
136-
operator[](T index) const {
135+
template <typename T,
136+
detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
137+
detail::ElementProxy<JsonArray> operator[](T index) const {
137138
return {*this, size_t(index)};
138139
}
139140

140141
// Gets or sets the element at the specified index.
141142
// https://arduinojson.org/v7/api/jsonarray/subscript/
142-
template <typename TVariant>
143-
detail::enable_if_t<detail::IsVariant<TVariant>::value,
144-
detail::ElementProxy<JsonArray>>
145-
operator[](const TVariant& variant) const {
143+
template <typename TVariant,
144+
detail::enable_if_t<detail::IsVariant<TVariant>::value, short> = 0>
145+
detail::ElementProxy<JsonArray> operator[](const TVariant& variant) const {
146146
if (variant.template is<size_t>())
147147
return {*this, variant.template as<size_t>()};
148148
else

src/ArduinoJson/Array/JsonArrayConst.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
4545

4646
// Returns the element at the specified index.
4747
// https://arduinojson.org/v7/api/jsonarrayconst/subscript/
48-
template <typename T>
49-
detail::enable_if_t<detail::is_integral<T>::value, JsonVariantConst>
50-
operator[](T index) const {
48+
template <typename T,
49+
detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
50+
JsonVariantConst operator[](T index) const {
5151
return JsonVariantConst(
5252
detail::ArrayData::getElement(data_, size_t(index), resources_),
5353
resources_);
5454
}
5555

5656
// Returns the element at the specified index.
5757
// https://arduinojson.org/v7/api/jsonarrayconst/subscript/
58-
template <typename TVariant>
59-
detail::enable_if_t<detail::IsVariant<TVariant>::value, JsonVariantConst>
60-
operator[](const TVariant& variant) const {
58+
template <typename TVariant,
59+
detail::enable_if_t<detail::IsVariant<TVariant>::value, short> = 0>
60+
JsonVariantConst operator[](const TVariant& variant) const {
6161
if (variant.template is<size_t>())
6262
return operator[](variant.template as<size_t>());
6363
else

src/ArduinoJson/Array/Utilities.hpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,27 @@ ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
1111

1212
// Copies a value to a JsonVariant.
1313
// This is a degenerated form of copyArray() to stop the recursion.
14-
template <typename T>
15-
inline detail::enable_if_t<!detail::is_array<T>::value, bool> copyArray(
16-
const T& src, JsonVariant dst) {
14+
template <typename T,
15+
typename = detail::enable_if_t<!detail::is_array<T>::value>>
16+
inline bool copyArray(const T& src, JsonVariant dst) {
1717
return dst.set(src);
1818
}
1919

2020
// Copies values from an array to a JsonArray or a JsonVariant.
2121
// https://arduinojson.org/v7/api/misc/copyarray/
22-
template <typename T, size_t N, typename TDestination>
23-
inline detail::enable_if_t<
24-
!detail::is_base_of<JsonDocument, TDestination>::value, bool>
25-
copyArray(T (&src)[N], const TDestination& dst) {
22+
template <typename T, size_t N, typename TDestination,
23+
typename = detail::enable_if_t<
24+
!detail::is_base_of<JsonDocument, TDestination>::value>>
25+
inline bool copyArray(T (&src)[N], const TDestination& dst) {
2626
return copyArray(src, N, dst);
2727
}
2828

2929
// Copies values from an array to a JsonArray or a JsonVariant.
3030
// https://arduinojson.org/v7/api/misc/copyarray/
31-
template <typename T, typename TDestination>
32-
inline detail::enable_if_t<
33-
!detail::is_base_of<JsonDocument, TDestination>::value, bool>
34-
copyArray(const T* src, size_t len, const TDestination& dst) {
31+
template <typename T, typename TDestination,
32+
typename = detail::enable_if_t<
33+
!detail::is_base_of<JsonDocument, TDestination>::value>>
34+
inline bool copyArray(const T* src, size_t len, const TDestination& dst) {
3535
bool ok = true;
3636
for (size_t i = 0; i < len; i++) {
3737
ok &= copyArray(src[i], dst.template add<JsonVariant>());
@@ -62,9 +62,9 @@ inline bool copyArray(const T* src, size_t len, JsonDocument& dst) {
6262

6363
// Copies a value from a JsonVariant.
6464
// This is a degenerated form of copyArray() to stop the recursion.
65-
template <typename T>
66-
inline detail::enable_if_t<!detail::is_array<T>::value, size_t> copyArray(
67-
JsonVariantConst src, T& dst) {
65+
template <typename T,
66+
typename = detail::enable_if_t<!detail::is_array<T>::value>>
67+
inline size_t copyArray(JsonVariantConst src, T& dst) {
6868
dst = src.as<T>();
6969
return 1;
7070
}
@@ -102,11 +102,11 @@ inline size_t copyArray(JsonVariantConst src, char (&dst)[N]) {
102102

103103
// Copies values from a JsonDocument to an array.
104104
// https://arduinojson.org/v7/api/misc/copyarray/
105-
template <typename TSource, typename T>
106-
inline detail::enable_if_t<detail::is_array<T>::value &&
107-
detail::is_base_of<JsonDocument, TSource>::value,
108-
size_t>
109-
copyArray(const TSource& src, T& dst) {
105+
template <typename TSource, typename T,
106+
typename = detail::enable_if_t<
107+
detail::is_array<T>::value &&
108+
detail::is_base_of<JsonDocument, TSource>::value>>
109+
inline size_t copyArray(const TSource& src, T& dst) {
110110
return copyArray(src.template as<JsonArrayConst>(), dst);
111111
}
112112

src/ArduinoJson/Document/JsonDocument.hpp

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
3636
}
3737

3838
// Construct from variant, array, or object
39-
template <typename T>
40-
JsonDocument(
41-
const T& src, Allocator* alloc = detail::DefaultAllocator::instance(),
42-
detail::enable_if_t<detail::IsVariant<T>::value ||
43-
detail::is_same<T, JsonArray>::value ||
44-
detail::is_same<T, JsonArrayConst>::value ||
45-
detail::is_same<T, JsonObject>::value ||
46-
detail::is_same<T, JsonObjectConst>::value>* = 0)
39+
template <typename T, typename = detail::enable_if_t<
40+
detail::IsVariant<T>::value ||
41+
detail::is_same<T, JsonArray>::value ||
42+
detail::is_same<T, JsonArrayConst>::value ||
43+
detail::is_same<T, JsonObject>::value ||
44+
detail::is_same<T, JsonObjectConst>::value>>
45+
JsonDocument(const T& src,
46+
Allocator* alloc = detail::DefaultAllocator::instance())
4747
: JsonDocument(alloc) {
4848
set(src);
4949
}
@@ -136,9 +136,9 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
136136

137137
// Replaces the root with the specified value.
138138
// https://arduinojson.org/v7/api/jsondocument/set/
139-
template <typename T>
140-
detail::enable_if_t<!detail::is_base_of<JsonDocument, T>::value, bool> set(
141-
const T& src) {
139+
template <typename T, typename = detail::enable_if_t<
140+
!detail::is_base_of<JsonDocument, T>::value>>
141+
bool set(const T& src) {
142142
return to<JsonVariant>().set(src);
143143
}
144144

@@ -168,68 +168,65 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
168168

169169
// DEPRECATED: use obj[key].is<T>() instead
170170
// https://arduinojson.org/v7/api/jsondocument/containskey/
171-
template <typename TString>
171+
template <typename TString,
172+
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
172173
ARDUINOJSON_DEPRECATED("use doc[key].is<T>() instead")
173-
detail::enable_if_t<detail::IsString<TString>::value, bool> containsKey(
174-
const TString& key) const {
174+
bool containsKey(const TString& key) const {
175175
return data_.getMember(detail::adaptString(key), &resources_) != 0;
176176
}
177177

178178
// DEPRECATED: use obj[key].is<T>() instead
179179
// https://arduinojson.org/v7/api/jsondocument/containskey/
180-
template <typename TVariant>
180+
template <typename TVariant,
181+
detail::enable_if_t<detail::IsVariant<TVariant>::value, short> = 0>
181182
ARDUINOJSON_DEPRECATED("use doc[key].is<T>() instead")
182-
detail::enable_if_t<detail::IsVariant<TVariant>::value, bool> containsKey(
183-
const TVariant& key) const {
183+
bool containsKey(const TVariant& key) const {
184184
return containsKey(key.template as<const char*>());
185185
}
186186

187187
// Gets or sets a root object's member.
188188
// https://arduinojson.org/v7/api/jsondocument/subscript/
189-
template <typename TString>
190-
detail::enable_if_t<
191-
detail::IsString<TString>::value,
192-
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TString>>>
193-
operator[](const TString& key) {
189+
template <typename TString,
190+
typename = detail::enable_if_t<detail::IsString<TString>::value>>
191+
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TString>> operator[](
192+
const TString& key) {
194193
return {*this, detail::adaptString(key)};
195194
}
196195

197196
// Gets or sets a root object's member.
198197
// https://arduinojson.org/v7/api/jsondocument/subscript/
199-
template <typename TChar>
200-
detail::enable_if_t<
201-
detail::IsString<TChar*>::value && !detail::is_const<TChar>::value,
202-
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TChar*>>>
203-
operator[](TChar* key) {
198+
template <typename TChar,
199+
typename = detail::enable_if_t<detail::IsString<TChar*>::value &&
200+
!detail::is_const<TChar>::value>>
201+
detail::MemberProxy<JsonDocument&, detail::AdaptedString<TChar*>> operator[](
202+
TChar* key) {
204203
return {*this, detail::adaptString(key)};
205204
}
206205

207206
// Gets a root object's member.
208207
// https://arduinojson.org/v7/api/jsondocument/subscript/
209-
template <typename TString>
210-
detail::enable_if_t<detail::IsString<TString>::value, JsonVariantConst>
211-
operator[](const TString& key) const {
208+
template <typename TString,
209+
typename = detail::enable_if_t<detail::IsString<TString>::value>>
210+
JsonVariantConst operator[](const TString& key) const {
212211
return JsonVariantConst(
213212
data_.getMember(detail::adaptString(key), &resources_), &resources_);
214213
}
215214

216215
// Gets a root object's member.
217216
// https://arduinojson.org/v7/api/jsondocument/subscript/
218-
template <typename TChar>
219-
detail::enable_if_t<detail::IsString<TChar*>::value &&
220-
!detail::is_const<TChar>::value,
221-
JsonVariantConst>
222-
operator[](TChar* key) const {
217+
template <typename TChar,
218+
typename = detail::enable_if_t<detail::IsString<TChar*>::value &&
219+
!detail::is_const<TChar>::value>>
220+
JsonVariantConst operator[](TChar* key) const {
223221
return JsonVariantConst(
224222
data_.getMember(detail::adaptString(key), &resources_), &resources_);
225223
}
226224

227225
// Gets or sets a root array's element.
228226
// https://arduinojson.org/v7/api/jsondocument/subscript/
229-
template <typename T>
230-
detail::enable_if_t<detail::is_integral<T>::value,
231-
detail::ElementProxy<JsonDocument&>>
232-
operator[](T index) {
227+
template <typename T,
228+
detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
229+
detail::ElementProxy<JsonDocument&> operator[](T index) {
233230
return {*this, size_t(index)};
234231
}
235232

@@ -241,9 +238,9 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
241238

242239
// Gets or sets a root object's member.
243240
// https://arduinojson.org/v7/api/jsondocument/subscript/
244-
template <typename TVariant>
245-
detail::enable_if_t<detail::IsVariant<TVariant>::value, JsonVariantConst>
246-
operator[](const TVariant& key) const {
241+
template <typename TVariant,
242+
detail::enable_if_t<detail::IsVariant<TVariant>::value, short> = 0>
243+
JsonVariantConst operator[](const TVariant& key) const {
247244
if (key.template is<JsonString>())
248245
return operator[](key.template as<JsonString>());
249246
if (key.template is<size_t>())
@@ -254,16 +251,18 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
254251
// Appends a new (empty) element to the root array.
255252
// Returns a reference to the new element.
256253
// https://arduinojson.org/v7/api/jsondocument/add/
257-
template <typename T>
258-
detail::enable_if_t<!detail::is_same<T, JsonVariant>::value, T> add() {
254+
template <typename T, detail::enable_if_t<
255+
!detail::is_same<T, JsonVariant>::value, int> = 0>
256+
T add() {
259257
return add<JsonVariant>().to<T>();
260258
}
261259

262260
// Appends a new (null) element to the root array.
263261
// Returns a reference to the new element.
264262
// https://arduinojson.org/v7/api/jsondocument/add/
265-
template <typename T>
266-
detail::enable_if_t<detail::is_same<T, JsonVariant>::value, T> add() {
263+
template <typename T, detail::enable_if_t<
264+
detail::is_same<T, JsonVariant>::value, short> = 0>
265+
JsonVariant add() {
267266
return JsonVariant(data_.addElement(&resources_), &resources_);
268267
}
269268

@@ -284,36 +283,37 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
284283

285284
// Removes an element of the root array.
286285
// https://arduinojson.org/v7/api/jsondocument/remove/
287-
template <typename T>
288-
detail::enable_if_t<detail::is_integral<T>::value> remove(T index) {
286+
template <typename T,
287+
typename = detail::enable_if_t<detail::is_integral<T>::value>>
288+
void remove(T index) {
289289
detail::VariantData::removeElement(getData(), size_t(index),
290290
getResourceManager());
291291
}
292292

293293
// Removes a member of the root object.
294294
// https://arduinojson.org/v7/api/jsondocument/remove/
295-
template <typename TChar>
296-
detail::enable_if_t<detail::IsString<TChar*>::value &&
297-
!detail::is_const<TChar>::value>
298-
remove(TChar* key) {
295+
template <typename TChar,
296+
typename = detail::enable_if_t<detail::IsString<TChar*>::value &&
297+
!detail::is_const<TChar>::value>>
298+
void remove(TChar* key) {
299299
detail::VariantData::removeMember(getData(), detail::adaptString(key),
300300
getResourceManager());
301301
}
302302

303303
// Removes a member of the root object.
304304
// https://arduinojson.org/v7/api/jsondocument/remove/
305-
template <typename TString>
306-
detail::enable_if_t<detail::IsString<TString>::value> remove(
307-
const TString& key) {
305+
template <typename TString,
306+
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
307+
void remove(const TString& key) {
308308
detail::VariantData::removeMember(getData(), detail::adaptString(key),
309309
getResourceManager());
310310
}
311311

312312
// Removes a member of the root object or an element of the root array.
313313
// https://arduinojson.org/v7/api/jsondocument/remove/
314-
template <typename TVariant>
315-
detail::enable_if_t<detail::IsVariant<TVariant>::value> remove(
316-
const TVariant& key) {
314+
template <typename TVariant,
315+
detail::enable_if_t<detail::IsVariant<TVariant>::value, short> = 0>
316+
void remove(const TVariant& key) {
317317
if (key.template is<const char*>())
318318
remove(key.template as<const char*>());
319319
if (key.template is<size_t>())

0 commit comments

Comments
 (0)