From 2e4d5fd40e5fb90ccdd0f07316940cefc078da3d Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 24 May 2016 00:08:33 +0200 Subject: [PATCH] Added operator for QFlags --- src/blackmisc/json.h | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/blackmisc/json.h b/src/blackmisc/json.h index 87404c848..fb1c7e1a0 100644 --- a/src/blackmisc/json.h +++ b/src/blackmisc/json.h @@ -77,6 +77,15 @@ std::enable_if_t::value, QJsonObject> return json; } +//! \brief Specialized JSON serialization for QFlags generated enum +//! \ingroup JSON +template +QJsonObject &operator<<(QJsonObject &json, std::pair &> value) +{ + json.insert(value.first, QJsonValue(static_cast(value.second))); + return json; +} + //! \brief Specialized JSON deserialization for enum //! \ingroup JSON template @@ -87,6 +96,15 @@ const &operator>>(const QJsonValue &json, ENUM &value) return json; } +//! \brief Specialized JSON deserialization for QFlags enum +//! \ingroup JSON +template +const QJsonValue &operator>>(const QJsonValue &json, QFlags &value) +{ + value = static_cast>(json.toInt()); + return json; +} + //! \brief Specialized JSON deserialization for enum //! \ingroup JSON template @@ -97,6 +115,15 @@ const &operator>>(const QJsonValueRef &json, ENUM &value) return json; } +//! \brief Specialized JSON deserialization for QFlags enum +//! \ingroup JSON +template +const QJsonValueRef &operator>>(const QJsonValueRef &json, QFlags &value) +{ + value = static_cast>(json.toInt()); + return json; +} + //! \brief Specialized JSON deserialization for pair //! \ingroup JSON template @@ -257,7 +284,7 @@ namespace BlackMisc { QJsonObject json; auto meta = introspect().without(MetaFlags()); - meta.forEachMemberName(*derived(), [ & ](const auto &member, const QString &name) + meta.forEachMemberName(*derived(), [ & ](const auto & member, const QString & name) { json << std::pair &>(name, member); // std::make_pair causes an ambiguous operator<< }); @@ -276,7 +303,7 @@ namespace BlackMisc { baseConvertFromJson(static_cast *>(derived()), json); auto meta = introspect().without(MetaFlags()); - meta.forEachMemberName(*derived(), [ & ](auto &member, const QString &name) { json.value(name) >> member; }); + meta.forEachMemberName(*derived(), [ & ](auto & member, const QString & name) { json.value(name) >> member; }); } //! Assign from JSON object string @@ -302,8 +329,8 @@ namespace BlackMisc * the derived class uses this macro to disambiguate the inherited members. */ # define BLACKMISC_DECLARE_USING_MIXIN_JSON(DERIVED) \ - using ::BlackMisc::Mixin::JsonByMetaClass::toJson; \ - using ::BlackMisc::Mixin::JsonByMetaClass::convertFromJson; + using ::BlackMisc::Mixin::JsonByMetaClass::toJson; \ + using ::BlackMisc::Mixin::JsonByMetaClass::convertFromJson; } // Mixin } // BlackMisc