From c40408b3371599035814b1e01ae19485793d4bde Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Sun, 23 Jan 2022 18:44:59 +0300 Subject: [PATCH] Make Digest32 implicitly shared class --- src/base/bittorrent/infohash.h | 3 +++ src/base/digest32.h | 31 +++++++++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/base/bittorrent/infohash.h b/src/base/bittorrent/infohash.h index d7848a151..ee7ef7676 100644 --- a/src/base/bittorrent/infohash.h +++ b/src/base/bittorrent/infohash.h @@ -85,3 +85,6 @@ namespace BitTorrent } Q_DECLARE_METATYPE(BitTorrent::TorrentID) +// We can declare it as Q_MOVABLE_TYPE to improve performance +// since base type uses QSharedDataPointer as the only member +Q_DECLARE_TYPEINFO(BitTorrent::TorrentID, Q_MOVABLE_TYPE); diff --git a/src/base/digest32.h b/src/base/digest32.h index 2241ef691..1c100d1ee 100644 --- a/src/base/digest32.h +++ b/src/base/digest32.h @@ -32,6 +32,8 @@ #include #include +#include +#include #include template @@ -43,11 +45,11 @@ public: Digest32() = default; Digest32(const UnderlyingType &nativeDigest) - : m_valid {true} - , m_nativeDigest {nativeDigest} { + m_dataPtr->valid = true; + m_dataPtr->nativeDigest = nativeDigest; const QByteArray raw = QByteArray::fromRawData(nativeDigest.data(), length()); - m_hashString = QString::fromLatin1(raw.toHex()); + m_dataPtr->hashString = QString::fromLatin1(raw.toHex()); } static constexpr int length() @@ -57,12 +59,12 @@ public: bool isValid() const { - return m_valid; + return m_dataPtr->valid; } operator UnderlyingType() const { - return m_nativeDigest; + return m_dataPtr->nativeDigest; } static Digest32 fromString(const QString &digestString) @@ -75,22 +77,27 @@ public: return {}; Digest32 result; - result.m_valid = true; - result.m_hashString = digestString; - result.m_nativeDigest.assign(raw.constData()); + result.m_dataPtr->valid = true; + result.m_dataPtr->hashString = digestString; + result.m_dataPtr->nativeDigest.assign(raw.constData()); return result; } QString toString() const { - return m_hashString; + return m_dataPtr->hashString; } private: - bool m_valid = false; - UnderlyingType m_nativeDigest; - QString m_hashString; + struct Data : public QSharedData + { + bool valid = false; + UnderlyingType nativeDigest; + QString hashString; + }; + + QSharedDataPointer m_dataPtr {new Data}; }; template