Avoid heavy weight function object

Also, by switching to template we can avoid the cost of converting to some specific type and
perfectly forward the parameter to the final function.

PR #21572.
This commit is contained in:
Chocobo1 2024-10-12 15:15:39 +08:00 committed by GitHub
parent ac646f47a2
commit 21b0367629
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 10 additions and 11 deletions

View file

@ -35,8 +35,6 @@
#include <QMutexLocker> #include <QMutexLocker>
#include <QThread> #include <QThread>
#include "base/global.h"
const int TORRENTIDLIST_TYPEID = qRegisterMetaType<QList<BitTorrent::TorrentID>>(); const int TORRENTIDLIST_TYPEID = qRegisterMetaType<QList<BitTorrent::TorrentID>>();
BitTorrent::ResumeDataStorage::ResumeDataStorage(const Path &path, QObject *parent) BitTorrent::ResumeDataStorage::ResumeDataStorage(const Path &path, QObject *parent)

View file

@ -71,7 +71,6 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
#include <QThread> #include <QThread>
#include <QThreadPool>
#include <QTimer> #include <QTimer>
#include <QUuid> #include <QUuid>
@ -3013,11 +3012,6 @@ void SessionImpl::removeMappedPorts(const QSet<quint16> &ports)
}); });
} }
void SessionImpl::invokeAsync(std::function<void ()> func)
{
m_asyncWorker->start(std::move(func));
}
// Add a torrent to libtorrent session in hidden mode // Add a torrent to libtorrent session in hidden mode
// and force it to download its metadata // and force it to download its metadata
bool SessionImpl::downloadMetadata(const TorrentDescriptor &torrentDescr) bool SessionImpl::downloadMetadata(const TorrentDescriptor &torrentDescr)

View file

@ -44,6 +44,7 @@
#include <QMap> #include <QMap>
#include <QPointer> #include <QPointer>
#include <QSet> #include <QSet>
#include <QThreadPool>
#include "base/path.h" #include "base/path.h"
#include "base/settingvalue.h" #include "base/settingvalue.h"
@ -57,7 +58,6 @@
#include "trackerentrystatus.h" #include "trackerentrystatus.h"
class QString; class QString;
class QThreadPool;
class QTimer; class QTimer;
class QUrl; class QUrl;
@ -482,7 +482,11 @@ namespace BitTorrent
QMetaObject::invokeMethod(this, std::forward<Func>(func), Qt::QueuedConnection); QMetaObject::invokeMethod(this, std::forward<Func>(func), Qt::QueuedConnection);
} }
void invokeAsync(std::function<void ()> func); template <typename Func>
void invokeAsync(Func &&func)
{
m_asyncWorker->start(std::forward<Func>(func));
}
signals: signals:
void addTorrentAlertsReceived(qsizetype count); void addTorrentAlertsReceived(qsizetype count);

View file

@ -28,6 +28,7 @@
#include "torrentscontroller.h" #include "torrentscontroller.h"
#include <concepts>
#include <functional> #include <functional>
#include <QBitArray> #include <QBitArray>
@ -135,7 +136,9 @@ namespace
const QSet<QString> SUPPORTED_WEB_SEED_SCHEMES {u"http"_s, u"https"_s, u"ftp"_s}; const QSet<QString> SUPPORTED_WEB_SEED_SCHEMES {u"http"_s, u"https"_s, u"ftp"_s};
void applyToTorrents(const QStringList &idList, const std::function<void (BitTorrent::Torrent *torrent)> &func) template <typename Func>
void applyToTorrents(const QStringList &idList, Func func)
requires std::invocable<Func, BitTorrent::Torrent *>
{ {
if ((idList.size() == 1) && (idList[0] == u"all")) if ((idList.size() == 1) && (idList[0] == u"all"))
{ {