Deserialize enums as well

This commit is contained in:
Martchus 2017-12-22 20:29:38 +01:00
parent 7b6fe57aac
commit 9a2c2cfef6
2 changed files with 20 additions and 1 deletions

View File

@ -32,7 +32,8 @@ The following table shows the mapping of supported C++ types to supported JSON t
* Raw pointer are not supported. This prevents * Raw pointer are not supported. This prevents
forgetting to free memoery which would have to be allocated when deserializing. forgetting to free memoery which would have to be allocated when deserializing.
* For the same reason `const char *` strings are only supported for serialization. * For the same reason `const char *` strings are only supported for serialization.
* Enums are only supported for serialization. * Enums are (de)serialized as their underlying integer value. When deserializing, it is currently *not* checked
whether the present integer value is a valid enumeration item.
* For deserialization, iteratables must provide an `emplace_back` method. So deserialization of eg. `std::forward_list` * For deserialization, iteratables must provide an `emplace_back` method. So deserialization of eg. `std::forward_list`
is currently not supported. is currently not supported.
* The JSON type for smart pointer depends on the type the pointer refers to. It can also be `null`. * The JSON type for smart pointer depends on the type the pointer refers to. It can also be `null`.

View File

@ -359,6 +359,24 @@ inline void pull(
reflectable = value.Get<Type>(); reflectable = value.Get<Type>();
} }
/*!
* \brief Pulls the specified enumeration item from the specified value which is supposed and checked to be compatible with the underlying type.
* \remarks It is *not* checked, whether \a value is actually a valid enum item.
*/
template <typename Type, Traits::EnableIfAny<std::is_enum<Type>>...>
inline void pull(
Type &reflectable, const RAPIDJSON_NAMESPACE::GenericValue<RAPIDJSON_NAMESPACE::UTF8<char>> &value, JsonDeserializationErrors *errors)
{
using ExpectedType = Traits::Conditional<std::is_unsigned<typename std::underlying_type<Type>::type>, uint64, int64>;
if (!value.Is<ExpectedType>()) {
if (errors) {
errors->reportTypeMismatch<ExpectedType>(value.GetType());
}
return;
}
reflectable = static_cast<Type>(value.Get<ExpectedType>());
}
/*! /*!
* \brief Pulls the std::string from the specified value which is supposed and checked to contain a string. * \brief Pulls the std::string from the specified value which is supposed and checked to contain a string.
*/ */