1
0
mirror of https://github.com/d47081/qBittorrent.git synced 2025-02-04 10:54:35 +00:00

Avoid unnecessary lookups

Fix up 30319e51e55ed7740b7bdc4b75563f441f9ccb71.
PR #16629.
This commit is contained in:
Chocobo1 2022-03-15 12:33:12 +08:00 committed by GitHub
parent 67b35b76ac
commit 02869d7428
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 62 deletions

View File

@ -231,42 +231,36 @@ void StatusFilterWidget::populate()
const QVector<BitTorrent::Torrent *> torrents = BitTorrent::Session::instance()->torrents(); const QVector<BitTorrent::Torrent *> torrents = BitTorrent::Session::instance()->torrents();
for (const BitTorrent::Torrent *torrent : torrents) for (const BitTorrent::Torrent *torrent : torrents)
{
updateTorrentStatus(torrent); updateTorrentStatus(torrent);
}
updateTexts(); updateTexts();
} }
void StatusFilterWidget::updateTorrentStatus(const BitTorrent::Torrent *torrent) void StatusFilterWidget::updateTorrentStatus(const BitTorrent::Torrent *torrent)
{ {
const auto update = [this, torrent](const TorrentFilter::Type status, const bool insert, int &count) TorrentFilterBitset &torrentStatus = m_torrentsStatus[torrent];
const auto update = [this, &torrentStatus](const TorrentFilter::Type status, const bool needStatus, int &counter)
{ {
const bool contains = m_torrentsStatus.contains(torrent, status); const bool hasStatus = torrentStatus[status];
if (insert && !contains) if (needStatus && !hasStatus)
{ {
++count; ++counter;
m_torrentsStatus.insert(torrent, status); torrentStatus.set(status);
} }
else if (!insert && contains) else if (!needStatus && hasStatus)
{ {
--count; --counter;
m_torrentsStatus.remove(torrent, status); torrentStatus.reset(status);
} }
}; };
update(TorrentFilter::Downloading, torrent->isDownloading(), m_nbDownloading); update(TorrentFilter::Downloading, torrent->isDownloading(), m_nbDownloading);
update(TorrentFilter::Seeding, torrent->isUploading(), m_nbSeeding); update(TorrentFilter::Seeding, torrent->isUploading(), m_nbSeeding);
update(TorrentFilter::Completed, torrent->isCompleted(), m_nbCompleted); update(TorrentFilter::Completed, torrent->isCompleted(), m_nbCompleted);
update(TorrentFilter::Resumed, torrent->isResumed(), m_nbResumed); update(TorrentFilter::Resumed, torrent->isResumed(), m_nbResumed);
update(TorrentFilter::Paused, torrent->isPaused(), m_nbPaused); update(TorrentFilter::Paused, torrent->isPaused(), m_nbPaused);
update(TorrentFilter::Active, torrent->isActive(), m_nbActive); update(TorrentFilter::Active, torrent->isActive(), m_nbActive);
update(TorrentFilter::Inactive, torrent->isInactive(), m_nbInactive); update(TorrentFilter::Inactive, torrent->isInactive(), m_nbInactive);
const bool isStalledUploading = (torrent->state() == BitTorrent::TorrentState::StalledUploading); const bool isStalledUploading = (torrent->state() == BitTorrent::TorrentState::StalledUploading);
@ -276,7 +270,6 @@ void StatusFilterWidget::updateTorrentStatus(const BitTorrent::Torrent *torrent)
update(TorrentFilter::StalledDownloading, isStalledDownloading, m_nbStalledDownloading); update(TorrentFilter::StalledDownloading, isStalledDownloading, m_nbStalledDownloading);
update(TorrentFilter::Checking, torrent->isChecking(), m_nbChecking); update(TorrentFilter::Checking, torrent->isChecking(), m_nbChecking);
update(TorrentFilter::Errored, torrent->isErrored(), m_nbErrored); update(TorrentFilter::Errored, torrent->isErrored(), m_nbErrored);
m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading; m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading;
@ -336,54 +329,33 @@ void StatusFilterWidget::handleNewTorrent(BitTorrent::Torrent *const torrent)
void StatusFilterWidget::torrentAboutToBeDeleted(BitTorrent::Torrent *const torrent) void StatusFilterWidget::torrentAboutToBeDeleted(BitTorrent::Torrent *const torrent)
{ {
for (const TorrentFilter::Type status : m_torrentsStatus.values(torrent)) const TorrentFilterBitset status = m_torrentsStatus.take(torrent);
{
switch (status)
{
case TorrentFilter::Downloading:
--m_nbDownloading;
break;
case TorrentFilter::Seeding:
--m_nbSeeding;
break;
case TorrentFilter::Completed:
--m_nbCompleted;
break;
case TorrentFilter::Resumed:
--m_nbResumed;
break;
case TorrentFilter::Paused:
--m_nbPaused;
break;
case TorrentFilter::Active:
--m_nbActive;
break;
case TorrentFilter::Inactive:
--m_nbInactive;
break;
case TorrentFilter::StalledUploading:
--m_nbStalledUploading;
break;
case TorrentFilter::StalledDownloading:
--m_nbStalledDownloading;
break;
case TorrentFilter::Checking:
--m_nbChecking;
break;
case TorrentFilter::Errored:
--m_nbErrored;
break;
default: if (status[TorrentFilter::Downloading])
Q_ASSERT(false); --m_nbDownloading;
break; if (status[TorrentFilter::Seeding])
} --m_nbSeeding;
} if (status[TorrentFilter::Completed])
--m_nbCompleted;
if (status[TorrentFilter::Resumed])
--m_nbResumed;
if (status[TorrentFilter::Paused])
--m_nbPaused;
if (status[TorrentFilter::Active])
--m_nbActive;
if (status[TorrentFilter::Inactive])
--m_nbInactive;
if (status[TorrentFilter::StalledUploading])
--m_nbStalledUploading;
if (status[TorrentFilter::StalledDownloading])
--m_nbStalledDownloading;
if (status[TorrentFilter::Checking])
--m_nbChecking;
if (status[TorrentFilter::Errored])
--m_nbErrored;
m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading; m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading;
m_torrentsStatus.remove(torrent);
updateTexts(); updateTexts();
} }

View File

@ -28,7 +28,10 @@
#pragma once #pragma once
#include <bitset>
#include <QFrame> #include <QFrame>
#include <QHash>
#include <QListWidget> #include <QListWidget>
#include <QtContainerFwd> #include <QtContainerFwd>
@ -96,7 +99,8 @@ private:
void updateTorrentStatus(const BitTorrent::Torrent *torrent); void updateTorrentStatus(const BitTorrent::Torrent *torrent);
void updateTexts(); void updateTexts();
QMultiHash<const BitTorrent::Torrent *, TorrentFilter::Type> m_torrentsStatus; using TorrentFilterBitset = std::bitset<32>; // approximated size, this should be the number of TorrentFilter::Type elements
QHash<const BitTorrent::Torrent *, TorrentFilterBitset> m_torrentsStatus;
int m_nbDownloading = 0; int m_nbDownloading = 0;
int m_nbSeeding = 0; int m_nbSeeding = 0;
int m_nbCompleted = 0; int m_nbCompleted = 0;