diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-04-07 14:37:42 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-04-08 06:07:14 +0000 |
commit | 66fd48fd66aa4eb23139fdb79a2ebe1824964d49 (patch) | |
tree | 5a627a3cacd26394cc517fdbd83c60a35ea76c2d | |
parent | e7bfb244c23134807b11e99ceba8ed97f6067613 (diff) | |
download | qtconnectivity-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.cpp | 8 |
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); } |