From bc08637eaaf25fb83b685e48e86553d3edacc09a Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Sun, 4 Mar 2018 18:00:05 +0900 Subject: converters.h: pass QJsonValue by reference; add support of QHash --- converters.h | 56 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 17 deletions(-) (limited to 'converters.h') diff --git a/converters.h b/converters.h index 00d1d339..96efe5f8 100644 --- a/converters.h +++ b/converters.h @@ -46,17 +46,22 @@ namespace QMatrixClient inline QJsonValue toJson(const QByteArray& bytes) { -#if QT_VERSION < QT_VERSION_CHECK(5, 3, 0) - return QJsonValue(QLatin1String(bytes.constData())); -#else return QJsonValue(bytes.constData()); -#endif + } + + template + inline QJsonValue toJson(const QHash& hashMap) + { + QJsonObject json; + for (auto it = hashMap.begin(); it != hashMap.end(); ++it) + json.insert(it.key(), toJson(it.value())); + return json; } template struct FromJson { - T operator()(QJsonValue jv) const { return static_cast(jv); } + T operator()(const QJsonValue& jv) const { return static_cast(jv); } }; template @@ -67,32 +72,32 @@ namespace QMatrixClient template <> struct FromJson { - bool operator()(QJsonValue jv) const { return jv.toBool(); } + bool operator()(const QJsonValue& jv) const { return jv.toBool(); } }; template <> struct FromJson { - int operator()(QJsonValue jv) const { return jv.toInt(); } + int operator()(const QJsonValue& jv) const { return jv.toInt(); } }; template <> struct FromJson { - double operator()(QJsonValue jv) const { return jv.toDouble(); } + double operator()(const QJsonValue& jv) const { return jv.toDouble(); } }; template <> struct FromJson { - qint64 operator()(QJsonValue jv) const { return qint64(jv.toDouble()); } + qint64 operator()(const QJsonValue& jv) const { return qint64(jv.toDouble()); } }; template <> struct FromJson { - QString operator()(QJsonValue jv) const { return jv.toString(); } + QString operator()(const QJsonValue& jv) const { return jv.toString(); } }; template <> struct FromJson { - QDateTime operator()(QJsonValue jv) const + QDateTime operator()(const QJsonValue& jv) const { return QDateTime::fromMSecsSinceEpoch(fromJson(jv), Qt::UTC); } @@ -100,7 +105,7 @@ namespace QMatrixClient template <> struct FromJson { - QDate operator()(QJsonValue jv) const + QDate operator()(const QJsonValue& jv) const { return fromJson(jv).date(); } @@ -108,17 +113,23 @@ namespace QMatrixClient template <> struct FromJson { - QJsonObject operator()(QJsonValue jv) const { return jv.toObject(); } + QJsonObject operator()(const QJsonValue& jv) const + { + return jv.toObject(); + } }; template <> struct FromJson { - QJsonArray operator()(QJsonValue jv) const { return jv.toArray(); } + QJsonArray operator()(const QJsonValue& jv) const + { + return jv.toArray(); + } }; template struct FromJson> { - QVector operator()(QJsonValue jv) const + QVector operator()(const QJsonValue& jv) const { const auto jsonArray = jv.toArray(); QVector vect; vect.resize(jsonArray.size()); @@ -130,7 +141,7 @@ namespace QMatrixClient template struct FromJson> { - QList operator()(QJsonValue jv) const + QList operator()(const QJsonValue& jv) const { const auto jsonArray = jv.toArray(); QList sl; sl.reserve(jsonArray.size()); @@ -144,10 +155,21 @@ namespace QMatrixClient template <> struct FromJson { - QByteArray operator()(QJsonValue jv) const + inline QByteArray operator()(const QJsonValue& jv) const { return fromJson(jv).toLatin1(); } }; + template struct FromJson> + { + QHash operator()(const QJsonValue& jv) const + { + const auto json = jv.toObject(); + QHash h; h.reserve(json.size()); + for (auto it = json.begin(); it != json.end(); ++it) + h.insert(it.key(), fromJson(it.value())); + return h; + } + }; } // namespace QMatrixClient -- cgit v1.2.3 From 08fb435749f33ee5d266bbc2ea63c7c42169be97 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 23 Mar 2018 23:15:24 +0900 Subject: converters.h: Make the default toJson() less greedy template toJson(T&&) grabbed even things that it cannot convert, leading to unpleasant effects in a situation when all that was needed was one implicit conversion (e.g. from QList to QStringList). So now it's three trivial toJson() overloads instead of a template. --- converters.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'converters.h') diff --git a/converters.h b/converters.h index 96efe5f8..f7d99f48 100644 --- a/converters.h +++ b/converters.h @@ -24,14 +24,13 @@ namespace QMatrixClient { - template - inline QJsonValue toJson(T&& val) - { - return QJsonValue(std::forward(val)); - } + // This catches anything implicitly convertible to QJsonValue/Object/Array + inline QJsonValue toJson(const QJsonValue& val) { return val; } + inline QJsonObject toJson(const QJsonObject& o) { return o; } + inline QJsonArray toJson(const QJsonArray& arr) { return arr; } template - inline QJsonValue toJson(const QVector& vals) + inline QJsonArray toJson(const QVector& vals) { QJsonArray ar; for (const auto& v: vals) @@ -39,7 +38,7 @@ namespace QMatrixClient return ar; } - inline QJsonValue toJson(const QStringList& strings) + inline QJsonArray toJson(const QStringList& strings) { return QJsonArray::fromStringList(strings); } @@ -50,7 +49,7 @@ namespace QMatrixClient } template - inline QJsonValue toJson(const QHash& hashMap) + inline QJsonObject toJson(const QHash& hashMap) { QJsonObject json; for (auto it = hashMap.begin(); it != hashMap.end(); ++it) -- cgit v1.2.3 From 47cb949973a05cea6fb3a13ffd19b6e07e7720ae Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Sat, 24 Mar 2018 15:25:40 +0900 Subject: Work around a bug in MSVC leading to "ambiguous call" compilation error --- converters.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'converters.h') diff --git a/converters.h b/converters.h index f7d99f48..bba298e0 100644 --- a/converters.h +++ b/converters.h @@ -28,6 +28,9 @@ namespace QMatrixClient inline QJsonValue toJson(const QJsonValue& val) { return val; } inline QJsonObject toJson(const QJsonObject& o) { return o; } inline QJsonArray toJson(const QJsonArray& arr) { return arr; } +#ifdef _MSC_VER // MSVC gets lost and doesn't know which overload to use + inline QJsonValue toJson(const QString& s) { return s; } +#endif template inline QJsonArray toJson(const QVector& vals) -- cgit v1.2.3