summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qanystringview.h
Commit message (Collapse)AuthorAgeFilesLines
* Rename qIsConstantEvaluated() to q20::is_constant_evaluated()Marc Mutz2024-03-021-10/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | We should really try to avoid another almost-std-compatible-but-not-quite idiom. When qIsConstantEvaluated() was added, the rationale was given that this cannot be q20, because we can't implement it in all compilers. But we can: returning false is a perfectly legal implementation, and makes most users actually simpler because the #ifdef'ery can be dropped. There are only two users that still require the macro, because either they do different fallbacks depending on whether the implementation is trivial, or because they direct expected test outcomes. The INTEGRITY compiler complains "calling __has_builtin() in a constant expression", which we currently don't understand. To unblock this patch, and therefore the 6.7 release, hard-code INTEGRITY to return false. Amends 95e6fac0a5a1eee3aa23e4da0a93c6c25e32fb98. Pick-to: 6.7 Change-Id: If6cae902ff434f2ccceb6057cb053b7f304a604c Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* QAnyStringView: use new comparison helper macrosIvan Solovev2024-03-021-17/+9
| | | | | | | | | | | Also extend unit-test to use new test helper functions. Remove the now-redundant test for three-way comparison, because it is covered by the test helper functions. Task-number: QTBUG-117661 Change-Id: I242b560c281245e04e34353c80000a20998fc677 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Bring back QASV::detects_US_ASCII_at_compile_timeIvan Solovev2024-03-011-0/+8
| | | | | | | | | | | | | | Even though undocumented, it's public API, doesn't hurt to carry along, and improves compiler coverage in the test, so let's not remove it. Found in 6.7 API review Amends 95e6fac0a5a1eee3aa23e4da0a93c6c25e32fb98. Pick-to: 6.7 Change-Id: Ia935036a69e0e678f22ac86b48a2c1c5e8c46733 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* qTo*ViewIgnoringNull: further ignore nullsThiago Macieira2023-12-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | Commit ba5db13c8d197706ac3dec5d351b6684f809f2e4 ("QStringView: add internal qToStringViewIgnoringNull()") said: As long as a null QString still returns non-null data(), QStringView's QString constructor needs to call isNull(). That's a branch we often can do without, so add an internal function that bypasses this correctness check. It's internal, since we might have a Q6String that returns nullptr data() when null, which will remove the need for this function. For Qt 6, we made QString and QByteArray be able to return nullptr from data() when null... but that's not enabled by default yet. However, the begin() functions do return nullptr, so we can avoid the extra branch the commit was talking about. Task-number: QTBUG-119750 Change-Id: Ica7a43f6147b49c187ccfffd179e4cf032bc8565 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Add a verify() method to all sequential containersAhmad Samir2023-09-281-7/+8
| | | | | | | | | | | | | | | | | | | A helper method encasuplating the asserts related to index into the container and length, modelled after the QVLA::verify(). `pos <= size` is OK because if pos == size, the e.g. sliced()'ed container is just going to be empty. Normalize how verify() is used, the first arg is an index and the second a length. This method is constexpr even in QString/QByteArray merely for consistency with similar methods in other string classes (this necessitates using `d.size` in verify() in QString/QBA because size() isn't constexpr). Change-Id: I90e3c56d76c802259297a06d11d46ee342a1daf2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QAnyStringView: add QDebug stream operatorMarc Mutz2023-07-061-0/+4
| | | | | | | | | | | | | | | | When QDebug::quoted(), indicates the encoding using the u/u8 prefixes or the _L1 suffix. This is information that might come in handy, and we plan to make it off-switchable (QTBUG-114936). The default should be true, though, for QAnyStringView, because we should confront users with this feature so they learn it exists. For concrete view types, changing the default behavior is probably not a good idea. [ChangeLog][QtCore][QAnyStringView/QDebug] Can now stream QAnyStringView into QDebug. Fixes: QTBUG-114935 Change-Id: Icd5bf700c8b7958e942468b54248487998f262d5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Q{Any,}StringView: optimize lengthHelperContainer for the runtimeThiago Macieira2023-06-111-18/+4
| | | | | | | | | | | | | | | | | | | | Deduplicate it in the process by moving to qstringalgorithms.h. In non-constexpr contexts, both GCC and Clang were giving up in pre-calculating the length if the UTF-16 string literal was too big. For the old code, that was 14 and 16 characters respectively. That number can be raised by adding some Q_ALWAYS_INLINE and (for GCC's case), replacing std::char_traits::find() with std::find(). If that limit is exceeded, we call the newly introduced qustrnlen() function. qustrnlen() is just qustrchr(), like qstrnlen() is just memchr(). But it is introduced as a separate function so we could change implementation if we ever wished to, plus QStringView is only forward-declared at this point. Change-Id: Ieab617d69f3b4b54ab30fffd175c560d926db1c3 Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Short-live qIsConstantEvaluated()Thiago Macieira2023-06-111-11/+4
| | | | | | | | | | | | | | This is not q20::is_constant_evaluated() because it does not replace that for all compilers. Instead, it's our own version of it that may return false even in constant contexts. However, for the majority of our users, it will work even in C++17 mode. Updated QStringView and QAnyStringView to use it, which are the only two places in all of Qt that used std::is_constant_evaluated(). Change-Id: Ieab617d69f3b4b54ab30fffd175c50c517589226 Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Q{Any,}StringView: remove the GCC-specific compile-time contentThiago Macieira2023-06-111-14/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Because GCC isn't really working them out at compile time. First, for both lengthHelperPointer(), they don't get called on string literals such as return QStringView(u"Hello"); because the type hasn't decayed to a pointer, but is instead a char16_t[6]. No one writes constexpr auto str = u"Hello"; return QStringView(str); Second, even when you do write that, GCC is emitting the code to search for the null or non-ASCII byte at runtime, instead of pre-calculating it. That's not worth it because the code is not vectorized, even at -O3 and with a long string. Instead, let it get the length at runtime with QtPrivate::qustrlen(), which has vector code. Drive-by fix the QAnyStringView::lengthPointerHelper() to be constexpr, avoiding the same GCC warning that was fixed for QStringView in commit 4fd4082c3ab682f14911e6308ec5ccb400de34f9. Change-Id: Ieab617d69f3b4b54ab30fffd175c505cb66eac02 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
* QAnyStringView: fix MSVC warning C4702Sze Howe Koh2023-02-021-1/+1
| | | | | | | | | | | | | | | The previous fix attempt at 8ba8d1346a562347c398bdd0529d34f94f2ac698 does not work when C++20 mode is enabled. MSVC optimizes away the "else" block but triggers warning C4702 on "return true". Moving the return line into the "else" block ensures that it is optimized away too. Change-Id: I9ef02cd3631ff78091530b6fb2b91c2eddcbab5d Pick-to: 6.5 6.4 Fixes: QTBUG-104836 Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Yuhang Zhao <yuhangzhao@deepin.org>
* Move q20::remove_cvref to q20type_traits.hMarc Mutz2023-01-121-1/+1
| | | | | | | | The original is defined in <type_traits>, not <functional>. Pick-to: 6.5 Change-Id: I596e56f64d2eed609ad2f7e6f03ae006afaa2fa9 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Untangle QLatin1StringView from qstring.{h,cpp}Ahmad Samir2023-01-071-0/+1
| | | | | | | | | | | | | | | | | Searching in qstring.{h,cpp} is slightly easier (it's already too long). From the task: Having similarly-structured header files for all the view classes would help rebasing the different view classes onto a common template come Qt 7. Diff best viewed in terminal with git's diff.colorMoved config set to default. Task-number: QTBUG-103509 Change-Id: Ie791760bb5bfa23def98d67c206ae8fd00c5f6e6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QAnyStringView: add substringing operationsMarc Mutz2022-12-081-0/+42
| | | | | | | | | | | | | | | | | | | | | | Add the full set of substringing operations: - mid/left/right (old-style) - sliced/first/last (new style) - chop/chopped/truncate The implementation is copied from QUtf8StringView, adjusted to use sliced() instead of the (ptr, n) ctor, so we need to deal with the tag twiddling only once, in sliced(). The documentation is also copied from QUtf8StringView. [ChangeLog][QtCore][QAnyStringView] Added substring functions sliced(), first(), last(), chop()/chopped(), truncate(). Change-Id: Ief454e9694519e97d9146fa84bc05dda1dded046 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Mate Barany <mate.barany@qt.io> Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QAnyStringView: move the two assertions to a central placeThiago Macieira2022-12-071-2/+0
| | | | | | | | Move the assertions to qtypes.cpp, next to where one of them already existed. Change-Id: I51d12ccdc56c4ad2af07fffd172dae7c49d78273 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QAnyStringView: move the tag bits to the LSB for Qt 7Thiago Macieira2022-12-061-10/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This removes the TODO that was left in the file. It's also applied for bootstrapped use of QAnyStringView, even though it's currently not used in the bootstrap lib. Along with the previous commit of inverting the order of the members, the code generated by GCC 12 for a visitation compares as: _Z1f14QAnyStringView: _Z1f14QAnyStringView: movabsq $4611686018427387903, %rcx | movq %rsi, %rax movq %rdi, %rdx | shrq $2, %rsi movabsq $-4611686018427387904, %rax | andl $3, %eax andq %rsi, %rax | cmpq $2, %rax andq %rcx, %rsi < movabsq $-9223372036854775808, %rcx < cmpq %rcx, %rax < je .L15 je .L15 movabsq $4611686018427387904, %rcx | cmpq $1, %rax cmpq %rcx, %rax < je .L16 je .L16 jmp _Z1fI20QBasicUtf8StringViewILb0EEEvT_ jmp _Z1fI20QBasicUtf8StringViewILb0EEEvT_ .L16: .L16: movq %rsi, %rdi | jmp _Z1fI17QLatin1StringViewEvT_ movq %rdx, %rsi < jmp _Z1fI13QLatin1StringEvT_ < .L15: .L15: movq %rsi, %rdi < movq %rdx, %rsi < jmp _Z1fI11QStringViewEvT_ jmp _Z1fI11QStringViewEvT_ Fixes: QTBUG-109086 Change-Id: I51d12ccdc56c4ad2af07fffd172db128ca4105a5 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Fix QAnyStringView build with GCC 13Ville Voutilainen2022-11-121-22/+24
| | | | | | | | | | | | | | | | The problem is caused by GCC 13 having an intrinsic for is_convertible, and that (correctly) checks for incomplete types. We then manage to trigger the instantiation of the QAnyStringView converting constructor from isUtf16 etc., and that triggers the enable_if and is_convertible. The fix is to move the Tag definition earlier, and to eagerly SFINAE away the Tag type so that the converting constructor rejects it. Otherwise, the converting constructor is considered a candidate for comparisons of Tags, and gets instantiated for overload resolution. Fixes: QTBUG-108136 Change-Id: I9b0c0f7ac771cdbf6a9c35a3d3b0ea01b88b970e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Replace usages of Q_CLANG_QDOC with Q_QDOCLuca Di Sera2022-10-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | To allow the user to customize the C++ code that QDoc sees, so as to be able to work-around some limitations on QDoc itself, QDoc defines two symbols: Q_QDOC and Q_CLANG_QDOC, both of which are "true" during an entire execution of QDoc. At a certain point in time, QDoc allowed the user the choice between a custom C++ parser and a Clang based one. The Q_QDOC symbol would always be defined while the Q_CLANG_QDOC symbol would be defined only when the Clang based parser was chosen. In more recent times, QDoc always uses a Clang based parser, such that both Q_CLANG_QDOC and Q_QDOC are always defined, making them equivalent. To avoid using different symbols, and the possible confusion and fragmentation that derives from it, all usages of Q_CLANG_QDOC are now replaced by the equivalent usages of Q_QDOC. Change-Id: I5810abb9ad1016a4c5bbea99acd03381b8514b3f Reviewed-by: Kai Koehne <kai.koehne@qt.io>
* QAnyStringView: fix MSVC warningYuhang Zhao2022-10-151-5/+9
| | | | | | | | | | | When use /W4, MSVC warns about the code is not reachable. It's not reachable indeed, so it's no need to include it in the final binary, just use the same #ifdef guard to comment it out. Pick-to: 6.4 Change-Id: I22a321e2c748bd1c5608475d61ba9a83734c5364 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QAnyStringView: construct from any T implicitly convertible to ↵Marc Mutz2022-09-011-7/+34
| | | | | | | | | | | | | | | | | | | | | QString/QByteArray This includes QDBusReply, QProperty, and QStringBuilder expressions. The new constructor subsumes the QStringBuilder case without requiring jumping though hoops to delay the definition of the ctor the way we had to for the explicit QStringBuilder constructor, so remove the explicit QStringBuilder one again. [ChangeLog][QtCore][QAnyStringView] Can now be constructed from anything that implicitly converts to either QString or QByteArray. Fixes: QTBUG-105389 Change-Id: I0e584dd3e20d591381609a3329ef47cec7356ecc Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
* Use SPDX license identifiersLucie Gérard2022-05-161-38/+2
| | | | | | | | | | | | | Replace the current license disclaimer in files by a SPDX-License-Identifier. Files that have to be modified by hand are modified. License files are organized under LICENSES directory. Task-number: QTBUG-67283 Change-Id: Id880c92784c40f3bbde861c0d93f58151c18b9f1 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* Remove remnants of the old Intel C++ compilerThiago Macieira2022-05-111-1/+1
| | | | | | | | | | | | | We don't support it any more. I don't think it has ever properly compiled Qt 6 (and it's no longer working for me against GCC 12's libstdc++ headers). If you report a bug against it, Intel support's first question is if you can try instead the new Clang/LLVM-based oneAPI C++ compiler. So we support only that one, which identifies itself as Q_CC_CLANG. Change-Id: I5ff8e16fcdcb4ffd9ab6fffd16eb57a092c8439e Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QtCore: Replace remaining uses of QLatin1String with QLatin1StringViewSona Kurazyan2022-03-261-2/+2
| | | | | | | Task-number: QTBUG-98434 Change-Id: Ib7c5fc0aaca6ef33b93c7486e99502c555bf20bc Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QAnyStringView: constexpr detect 8-bit ASCII as Latin 1Øystein Heskestad2022-03-211-7/+45
| | | | | | | | | | This has performance benefits when doing comparisons. The check is only performed at compile time. Task-number: QTBUG-101014 Change-Id: I55694b045fe5e75d9671d0a3a70c80d998cf98c8 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QAnyStringView: fix broken implicit conversion from QStringBuilderMarc Mutz2021-11-191-1/+2
| | | | | | | | | | | | | | Need to use QConcatenable<>::ConvertTo for SFINAE, the forwarded type alias in QStringBuilder itself doesn't work. [ChangeLog][QtCore][QAnyStringView/QStringBuilder] Implicit conversion from QStringBuilder to QAnyStringView now works as advertised. Pick-to: 6.2 Fixes: QTBUG-98138 Change-Id: I1c300675cf43b13017bc56398ae5d8c1c51e64fe Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Q{*String,ByteArray}View::length(): use qsizetype, not intGiuseppe D'Angelo2021-04-151-6/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Looks like these ones have been forgotten in the Qt 5 -> 6 upgrade to qsizetype. Change them to return qsizetype as well, and fix the docs. Being entirely inline, non-exported classes, we should be able to get away with it without affecting binary compatibility. Moreover, there's no reason for keeping them deprecated. Requires some minor adjustments, just like the ones done for size()'s changes. [ChangeLog][QtCore][QStringView] The length() function now returns `qsizetype`, not `int`, for consistency with the other string and container classes in Qt. Following this change, it has been un-deprecated. [ChangeLog][QtCore][QAnyStringView] The length() function now returns `qsizetype`, not `int`, for consistency with the other string and container classes in Qt. Following this change, it has been un-deprecated. [ChangeLog][QtCore][QUtf8StringView] The length() function now returns `qsizetype`, not `int`, for consistency with the other string and container classes in Qt. Following this change, it has been un-deprecated. [ChangeLog][QtCore][QByteArrayView] The length() function now returns `qsizetype`, not `int`, for consistency with the other string and container classes in Qt. Following this change, it has been un-deprecated. Fixes: QTBUG-92496 Change-Id: Ie0f4939d1083884e95d4725f891b6c6764532cb8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Build fixes for GCC 11Ville Voutilainen2021-01-191-0/+1
| | | | | | | Task-number: QTBUG-89977 Change-Id: Ic1b7ddbffb8a0a00f8c621d09a868f1d94a52c21 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix QAnyStringView comparison documentationVolker Hilsheimer2020-11-091-1/+1
| | | | | | | | | | qdoc's clang knows about spaceship operator, but we still need to document the regular ones. Also add missing return types. Change-Id: If382ac2f51a49c9adbe4a99025403a3e8332fabd Reviewed-by: Paul Wicking <paul.wicking@qt.io>
* Optimize equality operators for string classesLars Knoll2020-10-071-2/+3
| | | | | | | | | | | | | Using compare() for those operators is not a good idea, as we can't shortcut comparisons if the string sizes are different. This alone made our HTML parser in QtGui around 15% slower. Don't go through QAnyStringView to implement compare() for QUtf8StringView, use QtPrivate::compareStrings() directly instead. Task-number: QTBUG-86354 Change-Id: I04869c29c9918161990dc1baf8e943b3a264ff3c Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
* Make QAnyStringView comparison operators hidden friendsKarsten Heimrich2020-10-061-20/+24
| | | | | | | | | | Also add the very same operators to the QBasicUtf8StringView class to overcome the compiler issues seen on gcc. Fixes: QTBUG-86481 Change-Id: I12484455ebd3b7b38d4ad67c38977d76f9b3ddfa Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Q(Any|Utf8)StringView: move array size deduction feature to fromArrayMårten Nordheim2020-09-181-2/+8
| | | | | | | | | | | | | The constructor taking an array literal will now stop at the first null-terminator encountered. And fromArray is introduced which only supports array literals. Constructs a view of the full size. Explicit so it shouldn't be surprising. Change-Id: I1497c33a5c12453a95e87c990abe6335b2817081 Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* Long live Q{Any,Utf8}StringView!Marc Mutz2020-08-311-0/+292
We need to add these two classes at the same time, because QAnyStringView makes all QUtf8StringView relational operators moot. We might want to add some later, esp. for UTF-8/UTf-8 comparisons, to avoid the pessimization that we can't early-out on size() mismatch in QAnyStringView equality operators, but that's an optimization, not a correctness issue, and can be fixed in a source-compatible way even after Qt 6 is released. To deal with the char8_t problem in C++20, make QUtf8StringView a class template out of which two UTF-8 views can be instantiated: the Qt 7 version, which depends on C++20 char8_t as value_type, and the Qt 6 version where value_type is a char. Use inline namespaces to map the QUtf8StringView identifier to one or the other, depending on the C++ version used to compile the user code. The inline namespace names must needs be a bit ugly, as their inline'ness depends on __cpp_char8_t. If we simply used q_v1/q_v2 we'd be blocking these names for Qt inline namespaces forever, because it's likely that inline'ness of other users of inline namespaces in Qt depends on things other than __cpp_char8_t. While inline'ness of namespaces is, theoretically speaking, a compile-time-only property, at least Clang warns about mixed use of inline on a given namespace, so we need to bite the bullet here. This is also the reason for the QT_BEGIN_..._NAMESPACE macros: GCC is ok with the first declaration making a namespace inline, while Clang warns upon re-opening an inline namespace as a non-inline one. [ChangeLog][QtCore][QUtf8StringView] New class. [ChangeLog][QtCore][QAnyStringView] New class. Change-Id: Ia7179760fca0e0b67d52f5accb0a62e389b17913 Reviewed-by: Lars Knoll <lars.knoll@qt.io>