summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-04-07 14:37:42 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-04-08 06:07:14 +0000
commit66fd48fd66aa4eb23139fdb79a2ebe1824964d49 (patch)
tree5a627a3cacd26394cc517fdbd83c60a35ea76c2d
parente7bfb244c23134807b11e99ceba8ed97f6067613 (diff)
downloadqtconnectivity-66fd48fd66aa4eb23139fdb79a2ebe1824964d49.tar.gz
QBluetoothServiceDiscoveryAgentPrivate: fix broken remove loop
There were two problems with the loop: First, it's quadratic, because it's calling the linear-complexity removeAt() function in a loop. Second, it was broken in that it was failing to check items that were immediately following matches, because it unconditionally increased the index variable, even if it has removedAt() an element. Fix by using erase_if() + named lambda. Change-Id: I75d68e43995bea95ffcbd2eb2683d4636a250c1d Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> (cherry picked from commit f90c82488a57079fe7568f4eaba23a631686f30f) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp
index b34feabc..a7d1a5a0 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp
@@ -516,10 +516,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryFinished()
void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscovered(const QBluetoothDeviceInfo &info)
{
// look for duplicates, and cached entries
- for (int i = 0; i < discoveredDevices.count(); i++) {
- if (discoveredDevices.at(i).address() == info.address())
- discoveredDevices.removeAt(i);
- }
+ const auto addressEquals = [](const auto &a) {
+ return [a](const auto &info) { return info.address() == a; };
+ };
+ erase_if(discoveredDevices, addressEquals(info.address()));
discoveredDevices.prepend(info);
}