forked from bblanchon/ArduinoJson
Simplified JsonVariant::as<T>()
to always return T
This commit is contained in:
@ -65,7 +65,7 @@ class ElementProxy : public VariantOperators<ElementProxy<TArray> >,
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename VariantAs<T>::type as() const {
|
||||
FORCE_INLINE T as() const {
|
||||
return getUpstreamElement().template as<T>();
|
||||
}
|
||||
|
||||
|
@ -21,12 +21,12 @@ class JsonDocument : public Visitable {
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
typename VariantAs<T>::type as() {
|
||||
T as() {
|
||||
return getVariant().template as<T>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
typename VariantConstAs<T>::type as() const {
|
||||
T as() const {
|
||||
return getVariant().template as<T>();
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ class JsonDocument : public Visitable {
|
||||
}
|
||||
|
||||
bool set(const JsonDocument& src) {
|
||||
return to<VariantRef>().set(src.as<VariantRef>());
|
||||
return to<VariantRef>().set(src.as<VariantConstRef>());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -82,7 +82,7 @@ class MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,
|
||||
}
|
||||
|
||||
template <typename TValue>
|
||||
FORCE_INLINE typename VariantAs<TValue>::type as() const {
|
||||
FORCE_INLINE TValue as() const {
|
||||
return getUpstreamMember().template as<TValue>();
|
||||
}
|
||||
|
||||
|
@ -16,42 +16,6 @@ class ObjectConstRef;
|
||||
class VariantRef;
|
||||
class VariantConstRef;
|
||||
|
||||
// A metafunction that returns the type of the value returned by
|
||||
// VariantRef::as<T>()
|
||||
template <typename T>
|
||||
struct VariantAs {
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct VariantAs<char*> {
|
||||
typedef const char* type;
|
||||
};
|
||||
|
||||
// A metafunction that returns the type of the value returned by
|
||||
// VariantRef::as<T>()
|
||||
template <typename T>
|
||||
struct VariantConstAs {
|
||||
typedef typename VariantAs<T>::type type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct VariantConstAs<VariantRef> {
|
||||
typedef VariantConstRef type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct VariantConstAs<ObjectRef> {
|
||||
typedef ObjectConstRef type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct VariantConstAs<ArrayRef> {
|
||||
typedef ArrayConstRef type;
|
||||
};
|
||||
|
||||
// ---
|
||||
|
||||
template <typename T>
|
||||
inline typename enable_if<is_integral<T>::value && !is_same<bool, T>::value &&
|
||||
!is_same<char, T>::value,
|
||||
@ -80,10 +44,8 @@ inline typename enable_if<is_floating_point<T>::value, T>::type variantAs(
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline typename enable_if<is_same<T, const char*>::value ||
|
||||
is_same<T, char*>::value,
|
||||
const char*>::type
|
||||
variantAs(const VariantData* data) {
|
||||
inline typename enable_if<is_same<T, const char*>::value, T>::type variantAs(
|
||||
const VariantData* data) {
|
||||
return data != 0 ? data->asString() : 0;
|
||||
}
|
||||
|
||||
|
@ -23,18 +23,25 @@ struct VariantOperators {
|
||||
// int operator|(JsonVariant, int)
|
||||
// float operator|(JsonVariant, float)
|
||||
// bool operator|(JsonVariant, bool)
|
||||
// const char* operator|(JsonVariant, const char*)
|
||||
// char* operator|(JsonVariant, const char*)
|
||||
template <typename T>
|
||||
friend typename enable_if<!IsVariant<T>::value,
|
||||
typename VariantAs<T>::type>::type
|
||||
operator|(const TVariant &variant, T defaultValue) {
|
||||
friend
|
||||
typename enable_if<!IsVariant<T>::value && !is_array<T>::value, T>::type
|
||||
operator|(const TVariant &variant, const T &defaultValue) {
|
||||
if (variant.template is<T>())
|
||||
return variant.template as<T>();
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
//
|
||||
// const char* operator|(JsonVariant, const char*)
|
||||
friend const char *operator|(const TVariant &variant,
|
||||
const char *defaultValue) {
|
||||
if (variant.template is<const char *>())
|
||||
return variant.template as<const char *>();
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
//
|
||||
// JsonVariant operator|(JsonVariant, JsonVariant)
|
||||
template <typename T>
|
||||
friend typename enable_if<IsVariant<T>::value, typename T::variant_type>::type
|
||||
|
@ -176,7 +176,7 @@ class VariantRef : public VariantRefBase<VariantData>,
|
||||
#endif
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename VariantAs<T>::type as() const {
|
||||
FORCE_INLINE T as() const {
|
||||
/********************************************************************
|
||||
** THIS IS NOT A BUG IN THE LIBRARY **
|
||||
** -------------------------------- **
|
||||
@ -187,11 +187,13 @@ class VariantRef : public VariantRefBase<VariantData>,
|
||||
** For example: **
|
||||
** char* name = doc["name"]; **
|
||||
** char age = doc["age"]; **
|
||||
** auto city = doc["city"].as<char*>() **
|
||||
** Instead, use: **
|
||||
** const char* name = doc["name"]; **
|
||||
** int8_t age = doc["age"]; **
|
||||
** auto city = doc["city"].as<const char*>() **
|
||||
********************************************************************/
|
||||
return variantAs<typename VariantAs<T>::type>(_data, _pool);
|
||||
return variantAs<T>(_data, _pool);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
@ -291,8 +293,8 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename VariantConstAs<T>::type as() const {
|
||||
return variantAs<typename VariantConstAs<T>::type>(_data);
|
||||
FORCE_INLINE T as() const {
|
||||
return variantAs<T>(_data);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
Reference in New Issue
Block a user