Browse Source

Avoid unnecessary lookups

Fix up 30319e51e5.
PR #16629.
adaptive-webui-19844
Chocobo1 3 years ago committed by GitHub
parent
commit
02869d7428
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 96
      src/gui/transferlistfilterswidget.cpp
  2. 6
      src/gui/transferlistfilterswidget.h

96
src/gui/transferlistfilterswidget.cpp

@ -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) if (status[TorrentFilter::Downloading])
{ --m_nbDownloading;
case TorrentFilter::Downloading: if (status[TorrentFilter::Seeding])
--m_nbDownloading; --m_nbSeeding;
break; if (status[TorrentFilter::Completed])
case TorrentFilter::Seeding: --m_nbCompleted;
--m_nbSeeding; if (status[TorrentFilter::Resumed])
break; --m_nbResumed;
case TorrentFilter::Completed: if (status[TorrentFilter::Paused])
--m_nbCompleted; --m_nbPaused;
break; if (status[TorrentFilter::Active])
case TorrentFilter::Resumed: --m_nbActive;
--m_nbResumed; if (status[TorrentFilter::Inactive])
break; --m_nbInactive;
case TorrentFilter::Paused: if (status[TorrentFilter::StalledUploading])
--m_nbPaused; --m_nbStalledUploading;
break; if (status[TorrentFilter::StalledDownloading])
case TorrentFilter::Active: --m_nbStalledDownloading;
--m_nbActive; if (status[TorrentFilter::Checking])
break; --m_nbChecking;
case TorrentFilter::Inactive: if (status[TorrentFilter::Errored])
--m_nbInactive; --m_nbErrored;
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:
Q_ASSERT(false);
break;
}
}
m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading; m_nbStalled = m_nbStalledUploading + m_nbStalledDownloading;
m_torrentsStatus.remove(torrent);
updateTexts(); updateTexts();
} }

6
src/gui/transferlistfilterswidget.h

@ -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…
Cancel
Save