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