Browse Source

Speed up lookup time

By adding another variable we can get O(1) lookup time instead of O(n).
Fix up 5f415c292d.
adaptive-webui-19844
Chocobo1 5 years ago
parent
commit
ff31bb86bc
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
  1. 20
      src/gui/properties/peerlistwidget.cpp
  2. 2
      src/gui/properties/peerlistwidget.h

20
src/gui/properties/peerlistwidget.cpp

@ -328,6 +328,7 @@ void PeerListWidget::copySelectedPeers() @@ -328,6 +328,7 @@ void PeerListWidget::copySelectedPeers()
void PeerListWidget::clear()
{
m_peerItems.clear();
m_itemsByIP.clear();
const int nbrows = m_listModel->rowCount();
if (nbrows > 0)
m_listModel->removeRows(0, nbrows);
@ -365,7 +366,13 @@ void PeerListWidget::loadPeers(const BitTorrent::TorrentHandle *torrent) @@ -365,7 +366,13 @@ void PeerListWidget::loadPeers(const BitTorrent::TorrentHandle *torrent)
// Remove peers that are gone
for (const PeerEndpoint &peerEndpoint : asConst(existingPeers)) {
const QStandardItem *item = m_peerItems.take(peerEndpoint);
QStandardItem *item = m_peerItems.take(peerEndpoint);
QSet<QStandardItem *> &items = m_itemsByIP[peerEndpoint.address.ip];
items.remove(item);
if (items.isEmpty())
m_itemsByIP.remove(peerEndpoint.address.ip);
m_listModel->removeRow(item->row());
}
}
@ -387,6 +394,7 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const @@ -387,6 +394,7 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const
m_listModel->setData(m_listModel->index(row, PeerListDelegate::IP_HIDDEN), peerIp);
itemIter = m_peerItems.insert(peerEndpoint, m_listModel->item(row, PeerListDelegate::IP));
m_itemsByIP[peerEndpoint.address.ip].insert(itemIter.value());
}
const int row = (*itemIter)->row();
@ -420,13 +428,9 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const @@ -420,13 +428,9 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const
void PeerListWidget::handleResolved(const QHostAddress &ip, const QString &hostname) const
{
for (auto iter = m_peerItems.cbegin(); iter != m_peerItems.cend(); ++iter) {
if (iter.key().address.ip == ip) {
QStandardItem *item {iter.value()};
item->setData(hostname, Qt::DisplayRole);
break;
}
}
const QSet<QStandardItem *> items = m_itemsByIP.value(ip);
for (QStandardItem *item : items)
item->setData(hostname, Qt::DisplayRole);
}
void PeerListWidget::handleSortColumnChanged(const int col)

2
src/gui/properties/peerlistwidget.h

@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
#define PEERLISTWIDGET_H
#include <QHash>
#include <QSet>
#include <QTreeView>
class QHostAddress;
@ -85,6 +86,7 @@ private: @@ -85,6 +86,7 @@ private:
PropertiesWidget *m_properties = nullptr;
Net::ReverseResolution *m_resolver = nullptr;
QHash<PeerEndpoint, QStandardItem *> m_peerItems;
QHash<QHostAddress, QSet<QStandardItem *>> m_itemsByIP; // must be kept in sync with `m_peerItems`
bool m_resolveCountries;
};

Loading…
Cancel
Save