summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
Commit message (Collapse)AuthorAgeFilesLines
* QHash: rewrite the x86 aeshash function for len >= 16Thiago Macieira2022-01-211-52/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The loop for 32 bytes is left unchanged, but the tail operation for 16 to 31 bytes is replaced with an overlapped load-and-scramble. This should make the operation even faster. Also updated the key creation back to something similar to what Go does. This massively improves performance as well as the bit spread. Histogram for the bits in the hash value for the testcase from QTBUG-91739: || Bit || Before || After || | 0 | 35.0300% | 50.4800% | | 1 | 42.5250% | 50.2400% | | 2 | 46.0100% | 50.0000% | | 3 | 67.5150% | 49.9400% | | 4 | 56.5150% | 50.0000% | | 5 | 51.9950% | 50.0000% | | 6 | 58.9800% | 50.1400% | | 7 | 55.9550% | 50.0000% | | 8 | 41.9850% | 49.9200% | | 9 | 69.9700% | 49.6400% | | 10 | 68.4950% | 50.0000% | | 11 | 37.4950% | 50.3000% | | 12 | 61.9950% | 49.8200% | | 13 | 53.4900% | 50.0000% | | 14 | 63.0200% | 49.9800% | | 15 | 54.9700% | 50.1000% | Task-number: QTBUG-91739 Pick-to: 6.2.3 6.2 6.3 Change-Id: Icad7c1bad46a449c8e8afffd16cb7fe7ffd3584f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
* QHash: fix iteration of x86 AES hash code for len >= 32Thiago Macieira2022-01-211-2/+2
| | | | | | | | | | | | | | [ChangeLog][QtCore][QHash] Fixed a bug in the qHashBits() function, which affected the hashing of QByteArray, QString (and their View classes), QLatin1String and QBitArray, which caused the hash to not include the final 32 bytes of the data source. As a result, QHash containers where the initial string was the same had a serious performance degradation on x86 CPUs with AES support. Fixes: QTBUG-91739 Pick-to: 6.2.3 6.2 6.3 Change-Id: Icad7c1bad46a449c8e8afffd16cb74dd43440f6c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QHash: improve aeshash's page detection codeThiago Macieira2022-01-211-5/+5
| | | | | | | | | | | We don't need to test for actually crossing a page boundary. It suffices to check if we're in the upper half or the lower half of the page. In the upper half, we load ending at the end; in the lower half, we load starting at the current position. This way, it can never crash. Pick-to: 6.2.3 6.2 6.3 Change-Id: Icad7c1bad46a449c8e8afffd16cb743e622b3405 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QArrayDataPointer: don't overload qSwap(), provide ADL-swap()Marc Mutz2022-01-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | qSwap() is our wrapper around using std::swap; swap(lhs, rhs); it needn't and shouldn't be overloaded. ADL swap() should be, though, so qSwap(), std::ranges::swap() and all the other adl_swap()s out there all find the optimized version. Qt 5.15 has it correct, Qt 6 wrong. Fix it. Can't pick to 6.2 because, while backwards-source-compatible, because the generic qSwap() template provides the name for both qualified and unqualified calls, it's not forwards-source-compatible: A new user of ADL swap // compile error w/o `using std::swap`, pessimization otherwise: swap(dp1, dp2); would break or performance-regress when going back to an older version. Pick-to: 6.3 Change-Id: I725949a4aa9ae438a182b4b7552ff2dced767e2f Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Prevent repeated instantiations of some qRegisterNormalizedMetaType<>s [1/N] ↵Marc Mutz2022-01-212-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (QtGui) Create macros that wrap the magic developed in 7d63efc16f65f98c657caa90e0d7e9b72a879ade and apply it to all Q_DECLARE_METATYPE invocations that show up in Clang -ftime-trace for a PCH'ed QtGui build. Effects on compile times: Clang 10 -ftme-trace: $ ClangBuildAnalyzer --analyze qtgui-before.trace | head -n6 Analyzing build trace from 'qtgui-before.trace'... **** Time summary: Compilation (523 times): Parsing (frontend): 628.3 s Codegen & opts (backend): 304.5 s $ ClangBuildAnalyzer --analyze qtgui-after.trace | head -n6 Analyzing build trace from 'qtgui-after.trace'... **** Time summary: Compilation (523 times): Parsing (frontend): 546.0 s Codegen & opts (backend): 304.4 s GCC 11 time (bash builtin): before: $ time for ((i=0; i < 3; ++i)) do touch src/gui/painting/qpolygon.h ; ninja libQt6Gui.so; done real 4m13,539s user 49m24,416s sys 3m18,177s after: $ time for ((i=0; i < 3; ++i)) do touch src/gui/painting/qpolygon.h ; ninja libQt6Gui.so; done real 3m55,697s user 45m19,941s sys 3m7,370s Task-number: QTBUG-97601 Pick-to: 6.3 Change-Id: Ia8e37a58937568a7ed21cfeb4b27274deca4d53b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QtCore: replace qSwap with std::swap/member-swap where possibleMarc Mutz2022-01-2015-26/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | qSwap() is a monster that looks for ADL overloads of swap() and also detects the noexcept of the wrapped swap() function, so it should only be used when the argument type is unknown. In the vast majority of cases, the type is known to be efficiently std::swap()able or to have a member-swap. Call either of these. For the common case of pointer types, circumvent the expensive trait checks on std::swap() by providing a hand-rolled qt_ptr_swap() template, the advantage being that it can be unconditionally noexcept, removing all type traits instantiations. Don't document it, otherwise we'd be unable to pick it to 6.2. Effects on Clang -ftime-trace of a PCH'ed libQt6Gui.so build: before: **** Template sets that took longest to instantiate: [...] 27766 ms: qSwap<$> (9073 times, avg 3 ms) [...] 2806 ms: std::swap<$> (1229 times, avg 2 ms) (30572ms) after: **** Template sets that took longest to instantiate: [...] 5047 ms: qSwap<$> (641 times, avg 7 ms) [...] 3371 ms: std::swap<$> (1376 times, avg 2 ms) [qt_ptr_swap<$> does not appear in the top 400, so < 905ms] (< 9323ms) As a drive-by, remove superfluous inline keywords and template ornaments. Task-number: QTBUG-97601 Pick-to: 6.3 6.2 Change-Id: I88f9b4e3cbece268c4a1238b6d50e5712a1bab5a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QVersionNumber: don't detach() in rvalue QList/QVector ctorMarc Mutz2022-01-191-2/+2
| | | | | | | | | | | | Qt 5 uses begin() so the fix there will be to use cbegin(). Found by Clang -ftime-trace pin-pointing repeated instantiations of QList<int>::data(). Pick-to: 6.3 6.2 5.15 Task-number: QTBUG-97601 Change-Id: I6410e5b303766fdbc7e158a9ac1263adec973099 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QString::toLatin1_helper_inplace: simplify the codeThiago Macieira2022-01-171-0/+22
| | | | | | | | | Hot function, so help the compiler out. In particular, this removes any touch to the ref count, so there are no atomic operations or dead code leading to memory allocations and deallocations. Change-Id: I0e5f6bec596a4a78bd3bfffd16c9a0fbd8dd2c12 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QVersionNumber: don't allocate in fromString() in the common caseMarc Mutz2022-01-182-6/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | Use QVarLengthArray instead of QList to avoid allocations in the case where the result fits into inline storage. Of course, we now perform one allocation more when we need the QList backend, but a) that should be the rarer case and b) we use 32 (more than InlineSegmentsCount) Prealloc for the QVarLengthArray to reliably skip the first few QList non-reserved capacity jumps (measured to be {4, 12, 28} for back-insertion, not all of which is probably available for append()s) to come out ahead either way. Reviewers may object, saying that we could just reserve(32) the QList, too, but while that would skip over the first few QList reallocations alright, it means we'd be carrying the extra capacity around for the duration of the QVersionNumber's lifetime (unless we'd shrink it at the end, bringing back the additional allocation and that solution back to par compared to this one). As a consequence: [ChangeLog][QtCore][QVersionNumber] Can now be also be constructed from QVarLengthArray. Change-Id: I4016367f64f6cefa6ed9147d33b06636f36b02cb Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVersionNumber: port fromString() to QAnyStringViewMarc Mutz2022-01-182-48/+48
| | | | | | | | | | | | | | | | | We can handle the UTF-8 case by reinterpreting it as Latin-1. This way, the suffixIndex stays valid as a return value. As a drive-by, optimize away toLatin1() calls by using a QVLA. We really need a better way of converting UTF-16 -> L1 than qt_to_latin1()... [ChangeLog][QtCore][QVersionNumber] fromString() now takes QAnyStringView (was: QString, QStringView, QLatin1String) and a qsizetype pointer (was: int pointer). Change-Id: I86abaadba2792658fbf93ccd1e0b86e3302c697c Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVersionNumber: change int to qsizetype in fromString()Thiago Macieira2022-01-172-7/+13
| | | | | | | | | This completes the update to qsizetype in this class, adding a couple of methods that need to be removed in Qt 7. They're only required where int is not qsizetype (i.e., 64-bit platforms). Change-Id: I0e5f6bec596a4a78bd3bfffd16c9de29bec4c637 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Doc: Use \inmodule for all classes and headersTopi Reinio2022-01-172-0/+2
| | | | | | | | | | | | | | | QDoc made some assumptions about the module a class/header belongs to, based on the source file path. This feature is rather error-prone and unnecessarily complex and will be removed from QDoc. Define modules explicitly to avoid documentation warnings when this removal happens. Pick-to: 6.2 6.3 Change-Id: I7947d197db5ac36c12e816caa19bb2f74eda8849 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
* QVersionNumber: change int to qsizetype for index and lengthThiago Macieira2022-01-162-30/+34
| | | | | | | | | | | | | | | | | | This class is not exported, so we can change the non-exported methods. None of the exported methods required change; notably, QVersionNumber::Segments::setVector didn't because it's only called with values 1, 2, and 3. [ChangeLog][Potentially source-incompatible changes] Updated the QVersionNumber API to use qsizetype where length and index values were used. This change retains binary compatibility and the vast majority of users will not experience a source compatibility problem. It could occur with ambiguous overloads when passing results from QVersionNumber to other API not using either int or qsizetype. There could also be new warnings from compilers about converting 64-bit types to 32-bit ones. Change-Id: I0e5f6bec596a4a78bd3bfffd16c9984b61c9b55b Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QFlatMap: don't sort already ordered dataMarc Mutz2022-01-141-1/+1
| | | | | | | Pick-to: 6.3 6.2 Change-Id: Id7ab2fe09c01500ca5bd23751ba29ed1394bb9b6 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* Properly detect and declare contiguous iteratorsGiuseppe D'Angelo2022-01-132-16/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | The recommended way to detect a contiguous iterator isn't to check the iterator_category; it's to use the iterator concepts. Similarly, the recommendation set in place by P2259 (for being backwards-compatible) is to declare a iterator_concept member, not to change iterator_category to a C++20 category, (also) because legacy code may be checking for equality against a specific category, rather than for convertibility. This is erroneous, but such code exists, alas. This is enshrined in C++20's stdlib: for instance, iterator_traits<Foo*> has random_access_category_tag as iterator_category, but contiguous_iterator_tag as its iterator_concept. Hence: 1) in QArrayDataOps use the concept, and not the category, to do the check 2) when declaring iterators, keep the category as random access, and introduce the concept alias (if supported). Pick-to: 6.2 6.3 Change-Id: Ib600da7331d687a15082becaa6be06aefc24bb9c Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add a few explicit conversions back from intThiago Macieira2022-01-122-3/+3
| | | | | | | | | | Suppresses GCC's -Wconversion, which is not enabled by default. error: conversion from ‘int’ to ‘quint8’ {aka ‘unsigned char’} may change value [-Werror=conversion] Change-Id: I0e5f6bec596a4a78bd3bfffd16c998102bd51f7c Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QFlatMap: re-implement insert() via insert_or_assign()Marc Mutz2022-01-121-33/+4
| | | | | | | | Avoids code duplication. Pick-to: 6.3 6.2 Change-Id: Ic69e46108baf97a0dc9215866d6c707136ee40b2 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QFlatMap: add insert_or_assignMarc Mutz2022-01-121-0/+18
| | | | | | | | | | | | | | | | This does exactly what insert() on Qt associative containers does, but allows to express the intent of using the STL-incompatible Qt insert() semantics, in an STL-compatible way, instead of leaving the reader of the code wondering what semantics are expected. This is part of a very-long-term goal of fixing Qt associative container's insert() behavior, in which QFlatMap, being an affected, but private-API type, is used for proof-of-concept purposes. Task-number: QTBUG-99651 Pick-to: 6.3 6.2 Change-Id: I69010285438259918aef659d3235180c1b5be696 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QCache: fix potential crash in trim()Mårten Nordheim2022-01-121-5/+3
| | | | | | | | | | | | | | | | | We use raw pointers to the Nodes in the QHash which is inherently fine, but we are then subject to invalidation when nodes are moved around during deletion. In trim() we don't actually need to iterate the linked-list since the node we are interested in is always chain.prev Pick-to: 6.3 6.2 6.2.3 Fixes: QTBUG-99710 Task-number: QTBUG-99224 Task-number: QTBUG-99240 Change-Id: I9c2ed69b29e3cadca013113a3553deb44d7382fc Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
* QFlatMap: add an alias for using QVarLengthArraysMarc Mutz2022-01-121-0/+3
| | | | | | | | | | ... in an attempt to foster the use of this data structure by making it less onerous to spell. Pick-to: 6.3 6.2 Change-Id: Ib9d17029c75278edde6ba90f65f68af179a6d230 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QFlatMap: add try_emplace (w/o hint)Marc Mutz2022-01-121-0/+24
| | | | | | | | | | | | | | | | | | | | | | QFlatMap, like its public brethren, features the broken Qt-style insert() behavior (what the STL calls insert_or_assign()), which makes its insert() unusable for actual STL-style insert() work, with no replacement except the size-check-and-index-operator trick: const auto oldSize = c.size(); auto &e = c[key]; if (c.size() != oldSize) { // inserted } Even though QFlatMap::insert() appears to return the correct info, it's useless, because the old value has been assigned over by the time insert() returns. Pick-to: 6.3 6.2 Change-Id: If4173c42523a128dfd22ab496dde0089ba73f41c Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QFlatMap: optimize construction from existing containersMarc Mutz2022-01-121-14/+7
| | | | | | | | | Use {copy,move} ctors instead of default-ctor, followed by (move|copy)-assignment. Pick-to: 6.3 6.2 Change-Id: Id2fd53050cd353a9374fd065ac25d753d42d1be9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QFlatMap: fix pointless reallocations on repeated range-insert()sMarc Mutz2022-01-121-2/+0
| | | | | | | | | | | | When looping over range-insert(), the repeated shrink_to_fit() calls would cause cause reserved (or geometrically-grown) capacity to be shed, breaking the underlying container's growth strategy. Fix by not shedding excess capacity. Pick-to: 6.3 6.2 Change-Id: I10915a06fc9442039c192486a55e48083da7c839 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QFlatMap: fix const iterator APIMarc Mutz2022-01-071-8/+8
| | | | | | | | Iterators model pointer, so const must be shallow. Pick-to: 6.3 6.2 Change-Id: I90494c98762f1494efcca4965ee739540333f5d7 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QFlatMap: fix mixed rvalue/lvalue insert overloadsMarc Mutz2022-01-071-2/+2
| | | | | | | | They never worked. Pick-to: 6.3 6.2 Change-Id: I9a15c848416419823f28ea580248fbe93a4365dd Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* QScopedValueRollback: explicitly disable move semanticsMarc Mutz2022-01-051-1/+1
| | | | | | | | | For RAII objects, it's natural to have move semantics enabled these days. So if a RAII type does _not_ offer it (and, as in this case, cannot be made to offer it), be explicit and disable moves, too. Change-Id: I5636a0c7ff2fc51982ce9a406f975b07d51af01a Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* QArrayDataOps: remove unused header <algorithm>Marc Mutz2022-01-051-1/+1
| | | | | | | | | | | | The header only uses std::destroy(), which is in <memory>, not <algorithm>. Doesn't change anything, because <algorithm> is still transitively included via qcontainertools_impl.h. Pick-to: 6.3 6.2 Change-Id: Ib6a94ea56d5819f916c80a2e307c99b328f3d61d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QRingBuffer: optimize and simplify QRingChunk::toByteArray() futherMarc Mutz2022-01-031-8/+3
| | | | | | | | | | | | | | | | | | | | | | - use sliced() instead of mid(), since we know we call sliced() in-contract - replace the manual memmove() with calls to QBA::remove(), but first resize() to tailOffset, and only then remove(0, headOffset), so we only move Chunk::size() bytes, as the old code did - don't bother updating the offset members, as we're restricted to rvalues now, and we only need to leave behind a partially-formed object This code shows that we desperately need QBA::slice() and/or an rvalue overload of QBA::sliced(), cf. QTBUG-99218. Add a comment to use these functions when they become available. Change-Id: I5d8c7363d443dff69338f6f6a7b4bff9957917ec Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Alex Trotsenko <alex1973tr@gmail.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
* QRingBuffer: remove QByteArray::resize()-shrinks work-aroundMarc Mutz2021-12-211-1/+0
| | | | | | | | QByteArray::resize() is now documented to not shrink capacity(), so remove the extra reserve(0) work-around. Change-Id: I3d5d944b9f01f8f84b31599548773198903aad4c Reviewed-by: Alex Trotsenko <alex1973tr@gmail.com>
* QHash: Return void from QHashPrivate::Data::erase()Lars Knoll2021-12-171-9/+11
| | | | | | | | | | | | | | | | | This removes some calculations that are not required in 80% of the cases where d->erase() is being called (as the return value is ignored). When removing lots of elements from the hash, the ++it could loop quite a bit until it found the next valid item in the hash. This chain of changes combined improve the overall performance of QHash by 10-50% depending on the operation. Deletes are twice as fast, reads around 20% faster, inserts around 10% faster. Task-number: QTBUG-91739 Fixes: QTBUG-98436 Change-Id: I2d82a7c9dd1dd0a4da8402e6d95bfd620caeff3a Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QHash: Add and use a Bucket helper classLars Knoll2021-12-172-97/+173
| | | | | | | | | | | | | | | | Introduces a QHashPrivate::Data::Bucket class. This class helps avoid repeated bitshift and masking operations when locating bucket entries in the hash. Change signature of some internal methods to use Bucket instead of the private iterator, so we can avoid repeated encoding/decoding steps for the bucket index. Task-number: QTBUG-91739 Task-number: QTBUG-98436 Change-Id: I9ed2205bf886f9c20a5be109fd88456eec4d1540 Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QRingBuffer: simplify QRingChunk special member functions [2/2]Marc Mutz2021-12-172-9/+7
| | | | | | | | | | | | | | | | | Use NSDMI and let the compiler generate the default ctor, too. Statically assert that it's still noexcept (we marked it as such, because MSVC still doesn't noexcept(auto) when an SMF is =default'ed. Simplify the other ctors, too, relying on NSDMI. Keep one instance of tailOffset(0), in the 'reserving' ctor, because it's inconsistent with the other ctors which all do tailOffset{chunk.size()}, so it's best to leave this explicit, lest the next reader wonders whether it was forgotten. Pick-to: 6.3 Change-Id: I0d9f91aa5bc89377c4144589df8786b502e956a4 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Fix hash lookup using the value of a key iteratorLars Knoll2021-12-161-7/+13
| | | | | | | | | | | | | | | QHash::operator[] could grow the hash even if the key being looked up already existed. This in turn invalidated all iterators. Avoid this by refactoring findOrInsert() to not grow if the key already exists. Added advantage is that this should make lookups of existing keys slightly faster. Fixes: QTBUG-97752 Pick-to: 6.3 6.2 Change-Id: I9df30459797b42c434ba0ee299fd1d55af8d2313 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QCache: remove dead codeVolker Hilsheimer2021-12-161-17/+0
| | | | | | | | | The Node::replace overloads and the Node::create method are not used anywhere (including in QHash). Pick-to: 6.2 6.3 Change-Id: I1f1f8c847c8f1181cd31d95d01997226f94b5fc4 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QRingBuffer: simplify QRingChunk special member functions [1/2]Marc Mutz2021-12-162-20/+8
| | | | | | | | | | Let the compiler generate the copy and move SMFs. Statically assert that the move SMFs are still noexcept. Pick-to: 6.3 Change-Id: I1c569bdf893a5f2cda972c0dd8196cab62494fcb Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QRingBuffer: restrict QRingChunk::toByteArray() calls to rvalue *thisMarc Mutz2021-12-162-3/+3
| | | | | | | | | It's only user, QRingBuffer::read(), calls it on an rvalue, so we don't need the lvalue overload, and we can devil-may-care-like just std::move(chunk) in the non-isShared() case. Change-Id: I99c16862f5586125c6346ce5f969dc735de738b8 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QRingBuffer: simplify QRingChunk::detach()Marc Mutz2021-12-161-3/+1
| | | | | | | | | Just use the QByteArray(ptr, n) ctor instead of the (n, Qt::Uninitialized) one + memcpy() + std::move(). Pick-to: 6.3 Change-Id: I127219c21556e683d15136f7e6f7b3576b7b2444 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Make QRingBuffer a move-only typeMarc Mutz2021-12-161-0/+4
| | | | | | | | | | | | There's no sense in copying a ring buffer. Moving is enough. This marks an important step on the way to preventing accidental copies of ring buffer content, because the 'QList buffers' member can now no longer be implicitly shared. While the compiler will still emit the code for detach()ing, it will now never be executed. Pick-to: 6.3 Change-Id: I968bfe3e50c46720ed4baca55c99c1f9c518f653 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QRingBuffer: overload append() for rvaluesMarc Mutz2021-12-152-0/+26
| | | | | | | | | | | | The majority of append() callers in QtBase pass rvalues, so overload append() to avoid the need for manipulating QBA's atomic ref counts. Also adjust a caller that could pass by rvalue, but didn't, to do so. Pick-to: 6.3 Change-Id: I3d9e60b0d04ef837bfdc526e1f0f691a151006f9 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QRingBuffer: simplify QRingChunk::clear()Marc Mutz2021-12-151-1/+1
| | | | | | | | | | | Clear should bring the QRingChunk into the default-constructe state, so just assign {} instead of calling assign(QByteArray()), which is equivalent, but has to manipulate QBA's atomic ref-count, which makes it unlikely the compiler will optimize this call. Pick-to: 6.3 Change-Id: Idab9c92ec84392d484395042db2427c668756efa Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QVarLengthArray: avoid std::aligned_storage (deprecated in C++23)Marc Mutz2021-12-151-1/+9
| | | | | | | | | | | | | | | | | Add some scaffolding to prevent us from running into BC issues due to the underspecified nature of std::aligned_storage. Qt 5.15 uses a union { char[], double, qint64 } instead of std::aligned_storage, so doesn't need the fix. References: - https://github.com/cplusplus/papers/issues/197 - wg21.link/p1413 Task-number: QTBUG-99122 Pick-to: 6.3 6.2 Change-Id: I212be7000376c2db33b8cb244a6e862cc4dad544 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVarLengthArray: don't allow syncqt to export base classesMarc Mutz2021-12-151-0/+5
| | | | | | | | Check, in tst_qvarlengtharray, that the forwarding header still works. Pick-to: 6.3 Change-Id: Ia03cf48457f538287880bb676aea3fa44aeb255f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QHash: Improve memory-allocation strategyLars Knoll2021-12-131-6/+19
| | | | | | | | | | | | | | | Be smarter when allocating memory for the real data in addStorage(). As the amount of entries in there follow a binominal distribution, we know pretty well, how many there will be at least and at most. This avoids most of the reallocations of the storage when not rehashing, while Tessil's tests show that the total memory consumption has not changed. Task-number: QTBUG-91739 Task-number: QTBUG-98436 Change-Id: I98854bfbde8b2a16e788bfa1890c694d38fd09b5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QHash: increase minimum buckets to a full spanLars Knoll2021-12-131-2/+4
| | | | | | | | | | | | | | Change the minimum amount of buckets to be at least 128, ie. one full Span. This will simplify some assumptions in the code. Regeneration of rcc test-data needed because the extra buckets causes the order of the keys to change. Task-number: QTBUG-91739 Task-number: QTBUG-98436 Change-Id: Ic0c7da03570cc4c4e6aacc9645e536aec3667a98 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QHash: Move span constants to its own structMårten Nordheim2021-12-131-52/+51
| | | | | | | | | To avoid needing a templated Span to access them Task-number: QTBUG-98436 Change-Id: I5c3b16f9a806986b14ed794a3818990aa3ead0f7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QCache: Adapt to upcoming QHash changesMårten Nordheim2021-12-131-1/+7
| | | | | | | | | | QHash changes some of its preconditions, so we must not call findNode without verifying !isEmpty() Task-number: QTBUG-91739 Task-number: QTBUG-98436 Change-Id: I2701b9a01187530f541a7c9a12db56c92f856d87 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QHash::insert: Remove outdated \noteMårten Nordheim2021-12-131-3/+0
| | | | | | | | It was added in 5.15 when QHash could have multiple entries per key. Pick-to: 6.2 6.3 Change-Id: Ifb855b05dd65bbc67bb64bf2567229394525b2aa Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QVarLengthArray: assert that the range passed to erase() is validMarc Mutz2021-12-111-0/+2
| | | | | | | | | | | | | | | | We already checked that the two iterators, indvidually, are valid, but we didn't check that the range formed by them is valid, namely that the end iterator is reachable from the start iterator. Add an assert, because if the range isn't valid, we run into UB in the std::move() algorithm two lines later. Qt 5.15 uses std::copy() here, which has the same precondition, so the assertion would make sense there, too. Pick-to: 6.2 5.15 Change-Id: I90b7e846455ff86383a8971bea908036684961d8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVLA: separate control from inline storage [11/11]: qHash()Marc Mutz2021-12-111-2/+6
| | | | | | | | | | | | | A previous attempt to make qHash() a hidden friend ran into an ICE on Clang, so to simplify the implementation, QVLABase::hash() is public for now. Use QtPrivate::QNothrowHashable_v to simplify the noexcept clauses. Fixes: QTBUG-84785 Change-Id: Ibb520bde7b1d6dc45846bd8e1fa27c39c401b96a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QVLA: separate control from inline storage [10/N]: range-insert()Marc Mutz2021-12-111-5/+10
| | | | | | | | | Also added a QVLABase::resize_impl() because insert(it, n, v) was the only function moved down into QVLABase to call resize(). Task-number: QTBUG-84785 Change-Id: I5dd0092216d73b28b957a01845325d744a5c0ba9 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>