refs #784 CVariant can detect whether a value object supports memoized JSON and pick the appropriate methods to call.

This commit is contained in:
Mathew Sutcliffe
2016-10-25 22:43:35 +01:00
committed by Klaus Basan
parent 5d7289adb3
commit 72a5a0e670
5 changed files with 121 additions and 0 deletions

View File

@@ -46,6 +46,8 @@ namespace BlackMisc
virtual QString toQString(const void *object, bool i18n) const = 0;
virtual QJsonObject toJson(const void *object) const = 0;
virtual void convertFromJson(const QJsonObject &json, void *object) const = 0;
virtual QJsonObject toMemoizedJson(const void *object) const = 0;
virtual void convertFromMemoizedJson(const QJsonObject &json, void *object) const = 0;
virtual void unmarshall(const QDBusArgument &arg, void *object) const = 0;
virtual uint getValueHash(const void *object) const = 0;
virtual int getMetaTypeId() const = 0;
@@ -93,6 +95,16 @@ namespace BlackMisc
template <typename T>
static void convertFromJson(const QJsonObject &, T &object, ...) { throw CVariantException(object, "convertFromJson"); }
template <typename T>
static QJsonObject toMemoizedJson(const T &object, decltype(static_cast<void>(object.toMemoizedJson()), 0)) { return object.toMemoizedJson(); }
template <typename T>
static QJsonObject toMemoizedJson(const T &object, ...) { return toJson(object, 0); }
template <typename T>
static void convertFromMemoizedJson(const QJsonObject &json, T &object, decltype(static_cast<void>(object.convertFromMemoizedJson(json)), 0)) { object.convertFromMemoizedJson(json); }
template <typename T>
static void convertFromMemoizedJson(const QJsonObject &json, T &object, ...) { convertFromJson(json, object, 0); }
template <typename T>
static uint getValueHash(const T &object, decltype(static_cast<void>(qHash(object)), 0)) { return qHash(object); }
template <typename T>
@@ -145,6 +157,14 @@ namespace BlackMisc
{
CValueObjectMetaInfoHelper::convertFromJson(json, cast(object), 0);
}
virtual QJsonObject toMemoizedJson(const void *object) const override
{
return CValueObjectMetaInfoHelper::toMemoizedJson(cast(object), 0);
}
virtual void convertFromMemoizedJson(const QJsonObject &json, void *object) const override
{
CValueObjectMetaInfoHelper::convertFromMemoizedJson(json, cast(object), 0);
}
virtual void unmarshall(const QDBusArgument &arg, void *object) const override
{
arg >> cast(object);