summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
Commit message (Collapse)AuthorAgeFilesLines
* Introduce always constexpr variants of qCountTrailingZeroBitsFabian Kosmale2020-03-161-19/+46
| | | | | | | | | | | qt_builtin_ctz is unfortunately not constexpr on MSVC, so the whole function cannot be used in constexpr contexts, unless v is exactly 0. As we don't have std::is_costant_evaluated until C++20, we need to introduce a new helper function, which always works in constexpr contexts. Change-Id: I36290acb61e430d6bdb3da112a9b2263be4b9fbf Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Use qsizetype for size related methods in QVarlengthArrayLars Knoll2020-03-143-171/+170
| | | | | Change-Id: Ib94b9a4e6e17da21f592e71a36fd1b97d42dfe62 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Use qsizetype for size related methods in QMapLars Knoll2020-03-142-47/+47
| | | | | | | This allows QMap to hold more than 2^31 entries on 64 bit systeems. Change-Id: Ia6abd3441f9bc0c7e1a01b78726b5c32209542fa Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Extend QContiguousCache to use qsizetype for size and indicesLars Knoll2020-03-142-38/+38
| | | | | | | Allow for more than 2^31 items and large offsets. Change-Id: I42f7bf20ce0e4af43dbb2e2083abf0e232e68282 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Add move semantics to QContiguousCacheLars Knoll2020-03-141-34/+60
| | | | | | | | | | Provide move semantics for QContiguousCache. Do further cleanup of the code and avoid special casing for complex typeinfo where it won't make a difference anyway. Change-Id: I9bd261aec21be7a050e04f5b3a1f0b8e1d94c064 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Cleanup code in QContiguousCacheLars Knoll2020-03-141-94/+74
| | | | | | | | | Remove the union being used to hold the d-pointer, as accessing both members of the union on the same data is technically undefined behavior. Change-Id: Ia5a063d97538222575a47e9462c0675acdf32aef Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Remove an outdated commentGiuseppe D'Angelo2020-03-131-8/+0
| | | | | | | | QRandomGenerator is now used to seed QHash, so the comment is wrong. Change-Id: Ic50fe95ea4169b55290cc758f5aebfbb0a3ea085 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QFlatMap: explicitly include <vector>Vitaly Fanaskov2020-03-061-0/+1
| | | | | | | | | Without this include, it fails to compile the following line on some systems: "std::vector<bool> done(s)", because only a forward declaration is available. Change-Id: I6eac4b7f69dda16e181043eb707f970b21b2dfef Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Get rid of some QT_STRICT_ITERATORS leftoverLars Knoll2020-03-051-73/+0
| | | | | | | | Amends 06456873fceddcd340431fc5999c50ff6d3c2371. Fixes: QTBUG-82611 Change-Id: I8b1e01549f3e910b85a571833237e38a7c2b49a9 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* QHash/QMap: don't return const from value(), key()Marc Mutz2020-03-054-15/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | ... it breaks move semantics. We can change these, since they're templates and a short survey shows that no-one in Qt was crazy enough to inherit an exported class from QHash or QMap. Otherwise this would be BiC on MSVC, which encodes the return type. There's also no safety benefit here, as none of the overloads returns by reference, so users cannot expect map.value(key).mutate() to have an effect on the element in the container. In this, key() and value() differ from op[], which also returns const, but whose overload returns a reference. op[] is therefore not proposed here. [ChangeLog][QtCore][QHash/QMultiHash/QMap/QMultiMap] The value() and key() member functions now return T (was: const T), enabling move semantics on their return values. Change-Id: I0e5f53f9834caad458e3bde27f1daacbb4bac71b Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Merge "Merge remote-tracking branch 'origin/5.15' into dev"Lars Knoll2020-03-046-73/+78
|\
| * Merge remote-tracking branch 'origin/5.15' into devLars Knoll2020-03-046-73/+78
| |\ | | | | | | | | | Change-Id: I99ee6f8b4bdc372437ee60d1feab931487fe55c4
| | * Add operator-> to the key-value iterator for QHash and QMapIvan Čukić2020-03-032-3/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds the arrow operator to the stl-like key-value iterator (QKeyValueIterator) for QMap and QHash. This allows using normal member access syntax it->first and it->second instead of having to use (*it).first and (*it).second. [ChangeLog][QtCore][Containers] Added operator-> to the key-value iterator for QHash/QMap. Change-Id: I9cfa6480784ebce147fcfbf37fec5ad0080e2899 Reviewed-by: Vitaly Fanaskov <vitaly.fanaskov@qt.io>
| | * QMap: undeprecate QMap::count(Key)Mårten Nordheim2020-03-032-32/+19
| | | | | | | | | | | | | | | | | | | | | For compatibility with std::map Change-Id: Icba536244aadcad97c59dfd4bb22a7fdea881a7b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| | * QMap/QHash: Use versioned deprecation macroMårten Nordheim2020-03-032-10/+10
| | | | | | | | | | | | | | | | | | | | | Because then it can be configured Change-Id: Ib4c20dd64bedfe2ebadf13283698c50d4c0bc527 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| | * Undeprecate QHash::count(Key)Mårten Nordheim2020-03-032-29/+14
| | | | | | | | | | | | | | | | | | | | | For compatibility with std::unordered_map. Spotted in the API review. Change-Id: Ic34600d55baebcbbf115c1090cd555984037c44c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| | * Avoid UB in QList::removeAt()Lars Knoll2020-03-031-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Always keep the out of bounds check for backwards compatibility, but warn about it, so that we can remove it in Qt 6. Amends commit ebf695bc779a63a5730df05ab246305c0ab342e4 Change-Id: I3f1e7e8f9f20feb0b0f06ff9083c26682f1c7d3b Reviewed-by: Richard Öhlinger <richard.oehlinger@adbsafegate.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | | QTypeRevision: Fix warnings about max macro from windows.hFriedemann Kleint2020-03-041-1/+2
|/ / | | | | | | | | | | | | | | | | | | Similar to def272750cdb7810bca4f4815ed1183ba2bd6df9, put parentheses around std::numeric_limits<Integer>::max, fixing: qversionnumber.h(339): warning C4003: not enough arguments for function-like macro invocation 'max' Change-Id: Id574f3a08973cf1408e015f155c8e658b04bd170 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | Merge "Merge remote-tracking branch 'origin/5.15' into dev"Qt Forward Merge Bot2020-03-031-18/+0
|\ \
| * | Merge remote-tracking branch 'origin/5.15' into devQt Forward Merge Bot2020-03-031-18/+0
| |\| | | | | | | | | | Change-Id: If36d96c0fef3de5ab6503977501c55c62a2ecc97
| | * De-inline Qt::SplitBehavior splitters of QString and QStringRefEdward Welbourne2020-02-281-18/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Convert the QString::SplitBehavior variants to call them, rather than the other way round and convert the internal infrastructure to use Qt::SplitBehavior, ready to deprecate the QString::SplitBehavior versions without generating intenal warnings. Task-number: QTBUG-81853 Change-Id: Ia6b78881c3d0e30a7bbd4dfd00cc15a407f448a2 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Only declare comparison operators for QVector when comparableAllan Sandfeld Jensen2020-03-031-5/+9
|/ / | | | | | | | | | | | | | | This avoid SFINAE from incorrectly assuming QVectors of non-comparable types has them. Change-Id: Ie44eb7873384a0f41a6b8160c340b71ea25839dd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | STL compatibility: erase() should take a const_iterator as argumentLars Knoll2020-02-281-7/+6
| | | | | | | | | | | | | | | | | | erase() takes a const_iterator as argument in std::vector. We should do the same to facility better interoperatbility. Fixes: QTBUG-81915 Change-Id: I60ffb0eb45955be8e3e6aeaa56998f7c668fed09 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* | Merge "Merge remote-tracking branch 'origin/5.15' into dev"Lars Knoll2020-02-281-26/+26
|\ \
| * | Merge remote-tracking branch 'origin/5.15' into devLars Knoll2020-02-281-26/+26
| |\| | | | | | | | | | Change-Id: I469b0501cc65fc5ce4d797a69ae89405cc69c7f8
| | * QHash/QSet: Base iterator tag on warning version rather than deprecationMårten Nordheim2020-02-262-52/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If you have deprecation warning version set to 5.15 and the "disable deprecated before" set to something lower then it will complain about usage of operator-- inside std::distance which is used in our generic collection iterator. This also required changing over to the QT_DEPRECATED_VERSION_5_15 macro so that the deprecation warning would also be disabled. This is a possible work-around - change the iterator tag if it would trigger a warning. Fixes: QTBUG-82397 Change-Id: I3e0ecae5edebba2a3560e7c3785bd9d1a6d0076d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
| | * Merge remote-tracking branch 'origin/5.14' into 5.15Qt Forward Merge Bot2020-02-263-12/+12
| | |\ | | | | | | | | | | | | Change-Id: Iad459349ea8b4090d79b4771bfff8f656a8a8189
| | | * Use QT_DEPRECATED_X instead of Q_DECL_DEPRECATED_XThomas Sondergaard2020-02-253-12/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Allow deprecation warnings to be controlled with QT_NO_DEPRECATED_WARNINGS. Fixes: QTBUG-82424 Change-Id: I6df55ee2abaf4c141ac9b0e7661e46ba3706b20e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | | Get rid of QMatrixJarek Kobus2020-02-281-1/+0
|/ / / | | | | | | | | | | | | | | | Task-number: QTBUG-81628 Change-Id: Iad66bfdf49b9ee65558a451108c086fc40dc3884 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Merge remote-tracking branch 'origin/5.15' into devQt Forward Merge Bot2020-02-263-22/+26
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/network/bearermonitor/CMakeLists.txt examples/network/CMakeLists.txt src/corelib/tools/qlinkedlist.h src/sql/kernel/qsqldriver_p.h src/sql/kernel/qsqlresult_p.h src/widgets/kernel/qwidget.cpp src/widgets/kernel/qwidget_p.h tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp tests/auto/tools/moc/allmocs_baseline_in.json Change-Id: I21a3c34570ae79ea9d30107fae71759d7eac17d9
| * | Doc: Fix documentation warnings for Qt CoreTopi Reinio2020-02-253-4/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - QCborError: Classes cannot relate to header files; use \inheaderfile instead and link to the class from header file documentation. - QRecursiveMutex: QDoc doesn't allow shared documentation comments for duplicating \fn docs between the base and deriving classes. Remove the sharing, the function documentation is available under 'All Members' doc for QRecursiveMutex. - QMultiMap: unite() and one overload of insert() were not recognized because their definitions in the same header file interfered with QDoc - use Q_CLANG_QDOC macro to comment them out, and tag \fn comments to ensure that the function documentation is matched. Change-Id: Ic96869904a72d92453e4ffa6901000147571969b Reviewed-by: Paul Wicking <paul.wicking@qt.io>
| * | QMultiMap: Work around compiler problem in MSVC 2017Oliver Wolff2020-02-201-19/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In more complex projects (like MuseScore) it is possible, that MSVC 2017 chokes on the usage of "using typename ...". Just fully specify the iterators when they are used. Fixes: QTBUG-82166 Change-Id: I5e7882a0963445fc8529cfcb59d2aae606a2777e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | Merge remote-tracking branch 'origin/5.14' into 5.15Liang Qi2020-02-181-2/+2
| |\| | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/corelib/tools/qlinkedlist.h src/plugins/platforms/wasm/qwasmintegration.cpp src/plugins/platforms/wasm/qwasmscreen.cpp Change-Id: Iefca7f9f4966bdc20e7052aca736874861055738
| | * QLinkedListData: Move Q_CORE_EXPORT from class to shared_nullThiago Macieira2020-02-131-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This makes no difference for the IA-64 C++ ABI nor for MSVC until MSVC 2019 16.6. But it does with 16.6, where the std::atomic constructor becomes non-trivial, which makes QtPrivate::RefCount non-trivial, which makes QLinkedListData non-trivial. Before this change: User code \ Qt MSVC <=16.5 MSVC >=16.6 MSVC <=16.5 works works MSVC >=16.6 fails works With this change, they should all work. The list of symbols exported should not change either, so linking against a Qt compiled with MSVC <=16.5 should continue to work. [ChangeLog][MSVC] Fixed a compatibility issue found when linking code compiled with version 16.6 to a Qt compiled with 16.5. Fixes: QTBUG-81727 Change-Id: If79a52e476594446baccfffd15ee771397467f8b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Remove QLinkedListSona Kurazyan2020-02-198-2035/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | QLinkedList has been moved to Qt5Compat. Remove and stop mentioning it in docs, examples (the docs & examples for QLinkedList itself will be moved to Qt5Compat) and remove the corresponding tests. Also remove QT_NO_LINKED_LIST, since it's not needed anymore. Task-number: QTBUG-81630 Task-number: QTBUG-80312 Change-Id: I4a8f1105cb60aa87e7fd67e901ec1a27c489aa31 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | QTypeRevision: Disallow floats and doubles as argumentsUlf Hermann2020-02-171-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | Previously those would be implicitly casted to qint8, with interesting results. Change-Id: I145a737a7ef7a6f5212461b9f6a1fcb5d7780558 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* | | Implement better hash functions for integer typesLars Knoll2020-02-151-14/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The hash function provides rather good mixing of the input bits. It spreads numbers out evenly through the uint range, a change of one bit in the input changes around half the output bits, and it is pretty fast. Using this as a hash function over the simple hash(int) == int has the advantage that it reduces the amount of collisions for badly distributed keys. In addition, it allows us to always use power of two sizes for the hash table, leading to better performance for inserts and lookups. the 32 and 64 bit hash functions where chosen from https://nullprogram.com/blog/2018/07/31/. I selected the ones that give a very good distribution of the hash values while using the integer for both multiplication steps. This should be slighty faster than using two different numbers. While the result is still being cast to a uint, the method is prepared so it can handle 64 bit keys and seeds. Fixes: QTBUG-29009 Change-Id: Id7a1b97b3c0d219e65de2e6e1fe6faf092f8ce16 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | | Merge remote-tracking branch 'origin/5.15' into devLiang Qi2020-02-139-31/+90
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/widgets/graphicsview/boxes/scene.h src/corelib/Qt5CoreMacros.cmake src/corelib/Qt6CoreMacros.cmake src/network/ssl/qsslsocket.cpp src/network/ssl/qsslsocket.h src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp src/testlib/CMakeLists.txt src/testlib/.prev_CMakeLists.txt tests/auto/corelib/tools/qscopeguard/tst_qscopeguard.cpp Disabled building manual tests with CMake for now, because qmake doesn't do it, and it confuses people. Done-With: Alexandru Croitor <alexandru.croitor@qt.io> Done-With: Volker Hilsheimer <volker.hilsheimer@qt.io> Change-Id: I865ae347bd01f4e59f16d007b66d175a52f1f152
| * | QMultiMap: fix QDoc warningMårten Nordheim2020-02-071-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | The iterator is a QMultiMap iterator, not QMap, so the QDoc would complain. Change-Id: I1e3d2b454e21049d676387945e1e860e50854de8 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | Deprecate QLinkedListSona Kurazyan2020-02-044-5/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog][Deprecation Notice] QLinkedList is deprecated and will be moved to Qt5Compat in Qt 6. It is recommended to use std::list instead. Task-number: QTBUG-81630 Task-number: QTBUG-80312 Change-Id: I2c2b64e51d1cc2fd305aee6a11e9a89788f51eb4 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | Merge remote-tracking branch 'origin/5.14' into 5.15Qt Forward Merge Bot2020-02-041-1/+1
| |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf examples/widgets/widgets/imageviewer/imageviewer.cpp src/corelib/text/qchar.cpp src/corelib/time/qdatetime.cpp Change-Id: I9762f5c4ff650799219729d6aee79ac07ce9024a
| | * Fix 'the the' typo in commentsLinus Jahn2020-02-021-1/+1
| | | | | | | | | | | | | | | Change-Id: I00fcb1c2374e7ca168b6240f9d41c0323fb0867c Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
| * | QScopeGuard: Fix build failures with qScopeGuard()Kari Oikarinen2020-02-011-11/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Partially reverts 4f077b7e5ff1081afc0e362bdab6522c2b7ee43b. Can't overload with forwarding references and lvalue references. Use a single forwarding reference overload, but take care of not trying to create a QScopeGuard of reference type and forward instead of moving. Add tests to ensure calling with both lvalues and rvalues is possible. Change-Id: Ia034afe0a8feb08246c2c7c154a85cae37421c98 Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * | QHash: Re-remove Java-style iteratorMårten Nordheim2020-01-301-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When deprecating reverse iteratation for QHash the macro defining QHashIterator was expanded but QT_NO_JAVA_STYLE_ITERATORS was unfortunately forgotten. This patch brings it back. Amends dbb54805f63f9ed68d84fe090d608872f16170d2 Change-Id: I7b1912a13f6f8d2446c1f61a1c4a19afb2f28993 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
| * | QScopeGuard: Make constructor publicKari Oikarinen2020-01-302-23/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With Class Template Argument Deduction users might want to use the constructor itself instead of a separate helper function. In both cases it's possible to let the compiler deduce the template arguments. Try to make the usefulness of the helper function in the absence of CTAD still clear in the documentation. Change-Id: I9b07983c1fb276a6dd9e7ed4c3e606764e9b68ca Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
* | | Remove dead codeLars Knoll2020-02-101-9/+1
| | | | | | | | | | | | | | | | | | | | | We don't support unsharable containers anymore. Change-Id: Ifafa1c9b4eb43d16b3866be3dd74dda1c592f084 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* | | don't limit QCryptographicHash to 2^31 bytes of inputLars Knoll2020-02-102-44/+58
| | | | | | | | | | | | | | | Change-Id: Icd43d3b387af9ef9e9b8adb9a6388c741949c9e8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | | QVector: implement methods for adding new elements constructed in placeVitaly Fanaskov2020-02-103-51/+124
| | | | | | | | | | | | | | | | | | | | | Fixes: QTBUG-80293 Change-Id: I687dc05a9ad2bad7bab3dc2b1173edf75550d57e Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Core: Provide comparison functions for QTypeRevisionUlf Hermann2020-02-071-0/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The unspecified segment is between 0 and 1. This is because QTypeRevision::zero(), as the default revisision needs to be smaller than any other. At the same time we want explicitly specified non-zero revisions to be larger than unspecified ones. Breaking this down on a per segment level gives us the order shown here. Change-Id: I1cca12f1180eb6f77563fb5b22c3400e118dc5e9 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | qversionnumber.h: Stay compatible with C++11Ulf Hermann2020-01-311-9/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | Avoiding relaxed constexpr support is a small change that doesn't hurt and it allows us to progress in qtdeclarative without waiting for general C++17 support in qtbase. Change-Id: I234276036292346d60d6da3a75bcabbdec9ddde8 Reviewed-by: Marc Mutz <marc.mutz@kdab.com>