diff --git a/src/base/bittorrent/peerinfo.cpp b/src/base/bittorrent/peerinfo.cpp index 8d8c05f2a..291459434 100644 --- a/src/base/bittorrent/peerinfo.cpp +++ b/src/base/bittorrent/peerinfo.cpp @@ -39,8 +39,8 @@ using namespace BitTorrent; PeerInfo::PeerInfo(const Torrent *torrent, const lt::peer_info &nativeInfo) : m_nativeInfo(nativeInfo) + , m_relevance(calcRelevance(torrent)) { - calcRelevance(torrent); determineFlags(); } @@ -226,28 +226,16 @@ QString PeerInfo::connectionType() const : QLatin1String {"Web"}; } -void PeerInfo::calcRelevance(const Torrent *torrent) +qreal PeerInfo::calcRelevance(const Torrent *torrent) const { const QBitArray allPieces = torrent->pieces(); + const int localMissing = allPieces.count(false); + if (localMissing <= 0) + return 0; + const QBitArray peerPieces = pieces(); - - int localMissing = 0; - int remoteHaves = 0; - - for (int i = 0; i < allPieces.size(); ++i) - { - if (!allPieces[i]) - { - ++localMissing; - if (peerPieces[i]) - ++remoteHaves; - } - } - - if (localMissing == 0) - m_relevance = 0.0; - else - m_relevance = static_cast(remoteHaves) / localMissing; + const int remoteHaves = (peerPieces & (~allPieces)).count(true); + return static_cast(remoteHaves) / localMissing; } qreal PeerInfo::relevance() const diff --git a/src/base/bittorrent/peerinfo.h b/src/base/bittorrent/peerinfo.h index bfa5f9b2e..f7f51d177 100644 --- a/src/base/bittorrent/peerinfo.h +++ b/src/base/bittorrent/peerinfo.h @@ -92,7 +92,7 @@ namespace BitTorrent int downloadingPieceIndex() const; private: - void calcRelevance(const Torrent *torrent); + qreal calcRelevance(const Torrent *torrent) const; void determineFlags(); lt::peer_info m_nativeInfo = {};