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:
parent
67b35b76ac
commit
02869d7428
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user