Simplified JsonVariant::as<T>() to always return T

This commit is contained in:
Benoit Blanchon
2021-03-08 09:58:09 +01:00
parent 9094179856
commit e4ce75e20c
16 changed files with 78 additions and 81 deletions

View File

@ -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>();
}

View File

@ -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>

View File

@ -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>();
}

View File

@ -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;
}

View File

@ -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

View File

@ -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>