qt6-bb10/tests/auto/corelib/tools
Marc Mutz 9f31f579ec Sequential erase/_if: don't apply predicate twice to element
The code was trying to avoid a detach in the case no element needed to
be removed, by first running find_if() on const_iterators, and then,
after converting its result to (mutable) iterators, start the
remove_if() algorithm where find_if() left off.

But this applies the predicate to the element found by find_if() (if
any) _twice_: first just before we exit the first find_if() and then
just as we enter remove_if(), which will start by running find_if()
again, with the result of the initial find_if as 'first'.

Apart from being needlessly inefficient, this violates the
specification of Uniform Erasure, which defines sequential erase_if()
as being equivalent to remove_if() + container erase(), with the
former being specified to apply the predicate exactly once per
element.

Fix by writing the remove_if() part by hand.

Instead of doing the dance with the loop invariant documentation
twice, simply implement erase() via erase_if() (complicated a bit by
the weird passing of predicates by lvalue reference instead of by
value, as would be idiomatic). This exposes users to:

[ChangeLog][QtCore][Potentially Source-Incompatible Changes] A fix in
the implementation of the erase-like algorithms of sequential Qt
container may re-enable signed/unsigned comparison warnings previously
suppressed by having occurred in std library code. To fix, cast the
value to look for such that it has the same signedness as the
container's elements.

... but the issue would be the same had we inlined std::remove()
instead of passing a lambda to sequential_erase_if(), so it's nothing
we can, nor should, work around.

[ChangeLog][QtCore][Containers] Fixed a bug in the implementation of
most sequential Qt container's erase-like algorithms (member
removeAll()/removeIf() and free erase()/erase_if()) where the equality
operator or the predicate, respectively, was applied to the first
matching element twice. Each element is now tested exactly once.

Pick-to: 6.3 6.2
Change-Id: Ib6d24b01b40866c125406f1cd6042d4cd083ea0d
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
2022-02-02 04:16:59 +00:00
..
collections Restore missing Qt definitions 2022-01-31 17:40:43 +01:00
containerapisymmetry Sequential erase/_if: don't apply predicate twice to element 2022-02-02 04:16:59 +00:00
qalgorithms Remove the qmake project files 2021-01-07 15:32:28 +01:00
qarraydata Fix signed/unsigned comparison warnings in tst_QArrayData 2021-10-29 14:11:46 +02:00
qbitarray Remove the qmake project files 2021-01-07 15:32:28 +01:00
qcache Fix gcc warning in tests 2022-01-24 12:59:37 +00:00
qcommandlineparser Compile autotests for Integrity 2021-09-20 17:29:04 +03:00
qcontiguouscache Remove the qmake project files 2021-01-07 15:32:28 +01:00
qcryptographichash Remove unused .qrc files 2022-01-17 23:17:01 +01:00
qduplicatetracker QDuplicateTracker: add clear() 2021-11-11 13:26:14 -08:00
qeasingcurve Remove the qmake project files 2021-01-07 15:32:28 +01:00
qexplicitlyshareddatapointer Remove the qmake project files 2021-01-07 15:32:28 +01:00
qflatmap QFlatMap: fix is_transparent detection 2022-01-30 10:11:46 +01:00
qfreelist CMake: Remove the usage of QT_SOURCE_TREE from tests 2021-07-12 18:56:14 +02:00
qhash Restore missing Qt definitions 2022-01-31 17:40:43 +01:00
qhashfunctions QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH: use unqualified qHash() lookup 2021-11-29 18:55:10 +00:00
qhashseed tst_QHashSeed: improve quality of the quality() test 2021-11-23 20:48:08 -08:00
qline Remove the qmake project files 2021-01-07 15:32:28 +01:00
qlist QList: avoid a iterator->pointer conversion in the test 2021-10-14 02:26:41 +02:00
qmacautoreleasepool Remove the qmake project files 2021-01-07 15:32:28 +01:00
qmakearray Remove the qmake project files 2021-01-07 15:32:28 +01:00
qmap Restore missing Qt definitions 2022-01-31 17:40:43 +01:00
qmargins Remove the qmake project files 2021-01-07 15:32:28 +01:00
qmessageauthenticationcode Remove the qmake project files 2021-01-07 15:32:28 +01:00
qoffsetstringarray qlibraryinfo.cpp: use qOffsetStringArray for qtConfEntries 2021-11-03 14:54:37 -07:00
qpair Remove the qmake project files 2021-01-07 15:32:28 +01:00
qpoint Remove the qmake project files 2021-01-07 15:32:28 +01:00
qpointf Remove the qmake project files 2021-01-07 15:32:28 +01:00
qqueue Remove the qmake project files 2021-01-07 15:32:28 +01:00
qrect Remove the qmake project files 2021-01-07 15:32:28 +01:00
qringbuffer Make QRingBuffer a move-only type 2021-12-16 00:01:41 +01:00
qscopedpointer Disable warnings from using deprecated QScopedPointer::take 2021-02-13 06:44:52 +01:00
qscopedvaluerollback Remove the qmake project files 2021-01-07 15:32:28 +01:00
qscopeguard Remove checks for features available in C++17 2021-10-02 17:54:39 +02:00
qset Restore missing Qt definitions 2022-01-31 17:40:43 +01:00
qsharedpointer Long live QVERIFY_THROWS_EXCEPTION! 2021-11-26 04:44:26 +01:00
qsize Add more support for structured bindings 2021-02-25 16:08:44 +01:00
qsizef Add more support for structured bindings 2021-02-25 16:08:44 +01:00
qstl Remove the qmake project files 2021-01-07 15:32:28 +01:00
qtaggedpointer Remove the qmake project files 2021-01-07 15:32:28 +01:00
qtimeline Port of QTimeLine to new property system 2021-04-26 16:44:54 +02:00
qvarlengtharray QVarLengthArray: don't allow syncqt to export base classes 2021-12-15 00:04:45 +01:00
qversionnumber QVersionNumber: port fromString() to QAnyStringView 2022-01-18 01:31:33 +01:00
CMakeLists.txt Compile autotests for Integrity 2021-09-20 17:29:04 +03:00