Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qstring.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// Copyright (C) 2022 Intel Corporation.
3// Copyright (C) 2019 Mail.ru Group.
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5// Qt-Security score:critical reason:data-parser
6
7#include "qstringlist.h"
8#if QT_CONFIG(regularexpression)
9#include "qregularexpression.h"
10#endif
12#include <private/qstringconverter_p.h>
13#include <private/qtools_p.h>
15#include "private/qsimd_p.h"
16#include <qnumeric.h>
17#include <qdatastream.h>
18#include <qlist.h>
19#include "qlocale.h"
20#include "qlocale_p.h"
21#include "qspan.h"
22#include "qstringbuilder.h"
23#include "qstringmatcher.h"
25#include "qdebug.h"
26#include "qendian.h"
27#include "qcollator.h"
28#include "qttypetraits.h"
29
30#ifdef Q_OS_DARWIN
31#include <private/qcore_mac_p.h>
32#endif
33
34#include <private/qfunctions_p.h>
35
36#include <limits.h>
37#include <string.h>
38#include <stdlib.h>
39#include <stdio.h>
40#include <stdarg.h>
41#include <wchar.h>
42
43#include "qchar.cpp"
48
49#include <algorithm>
50#include <functional>
51
52#ifdef Q_OS_WIN
53# include <qt_windows.h>
54# if !defined(QT_BOOTSTRAPPED) && (defined(QT_NO_CAST_FROM_ASCII) || defined(QT_NO_CAST_TO_ASCII))
55// MSVC requires this, but let's apply it to MinGW compilers too, just in case
56# error "This file cannot be compiled with QT_NO_CAST_{TO,FROM}_ASCII, "
57 "otherwise some QString functions will not get exported."
58# endif
59#endif
60
61#ifdef truncate
62# undef truncate
63#endif
64
65#define REHASH(a)
66 if (sl_minus_1 < sizeof(sl_minus_1) * CHAR_BIT)
67 hashHaystack -= decltype(hashHaystack)(a) << sl_minus_1;
68 hashHaystack <<= 1
69
71
72using namespace Qt::StringLiterals;
73using namespace QtMiscUtils;
74
75const char16_t QString::_empty = 0;
76
77// in qstringmatcher.cpp
78qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs);
79
80namespace {
81enum StringComparisonMode {
82 CompareStringsForEquality,
83 CompareStringsForOrdering
84};
85
86template <typename Pointer>
87char32_t foldCaseHelper(Pointer ch, Pointer start) = delete;
88
89template <>
90char32_t foldCaseHelper<const QChar*>(const QChar* ch, const QChar* start)
91{
92 return foldCase(reinterpret_cast<const char16_t*>(ch),
93 reinterpret_cast<const char16_t*>(start));
94}
95
96template <>
97char32_t foldCaseHelper<const char*>(const char* ch, const char*)
98{
99 return foldCase(char16_t(uchar(*ch)));
100}
101
102template <typename T>
103char16_t valueTypeToUtf16(T t) = delete;
104
105template <>
106char16_t valueTypeToUtf16<QChar>(QChar t)
107{
108 return t.unicode();
109}
110
111template <>
112char16_t valueTypeToUtf16<char>(char t)
113{
114 return char16_t{uchar(t)};
115}
116
117template <typename T>
118static inline bool foldAndCompare(const T a, const T b)
119{
120 return foldCase(a) == b;
121}
122
123/*!
124 \internal
125
126 Returns the index position of the first occurrence of the
127 character \a ch in the string given by \a str and \a len,
128 searching forward from index
129 position \a from. Returns -1 if \a ch could not be found.
130*/
131template <typename Haystack>
132static inline qsizetype qLastIndexOf(Haystack haystack, QChar needle,
133 qsizetype from, Qt::CaseSensitivity cs) noexcept
134{
135 if (haystack.size() == 0)
136 return -1;
137 if (from < 0)
138 from += haystack.size();
139 else if (std::size_t(from) > std::size_t(haystack.size()))
140 from = haystack.size() - 1;
141 if (from >= 0) {
142 char16_t c = needle.unicode();
143 const auto b = haystack.data();
144 auto n = b + from;
145 if (cs == Qt::CaseSensitive) {
146 for (; n >= b; --n)
147 if (valueTypeToUtf16(*n) == c)
148 return n - b;
149 } else {
150 c = foldCase(c);
151 for (; n >= b; --n)
152 if (foldCase(valueTypeToUtf16(*n)) == c)
153 return n - b;
154 }
155 }
156 return -1;
157}
158template <> qsizetype
159qLastIndexOf(QString, QChar, qsizetype, Qt::CaseSensitivity) noexcept = delete; // unwanted, would detach
160
161template<typename Haystack, typename Needle>
162static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from,
163 Needle needle0, Qt::CaseSensitivity cs) noexcept
164{
165 const qsizetype sl = needle0.size();
166 if (sl == 1)
167 return qLastIndexOf(haystack0, needle0.front(), from, cs);
168
169 const qsizetype l = haystack0.size();
170 if (from < 0)
171 from += l;
172 if (from == l && sl == 0)
173 return from;
174 const qsizetype delta = l - sl;
175 if (std::size_t(from) > std::size_t(l) || delta < 0)
176 return -1;
177 if (from > delta)
178 from = delta;
179
180 auto sv = [sl](const typename Haystack::value_type *v) { return Haystack(v, sl); };
181
182 auto haystack = haystack0.data();
183 const auto needle = needle0.data();
184 const auto *end = haystack;
185 haystack += from;
186 const qregisteruint sl_minus_1 = sl ? sl - 1 : 0;
187 const auto *n = needle + sl_minus_1;
188 const auto *h = haystack + sl_minus_1;
189 qregisteruint hashNeedle = 0, hashHaystack = 0;
190
191 if (cs == Qt::CaseSensitive) {
192 for (qsizetype idx = 0; idx < sl; ++idx) {
193 hashNeedle = (hashNeedle << 1) + valueTypeToUtf16(*(n - idx));
194 hashHaystack = (hashHaystack << 1) + valueTypeToUtf16(*(h - idx));
195 }
196 hashHaystack -= valueTypeToUtf16(*haystack);
197
198 while (haystack >= end) {
199 hashHaystack += valueTypeToUtf16(*haystack);
200 if (hashHaystack == hashNeedle
201 && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
202 return haystack - end;
203 --haystack;
204 REHASH(valueTypeToUtf16(haystack[sl]));
205 }
206 } else {
207 for (qsizetype idx = 0; idx < sl; ++idx) {
208 hashNeedle = (hashNeedle << 1) + foldCaseHelper(n - idx, needle);
209 hashHaystack = (hashHaystack << 1) + foldCaseHelper(h - idx, end);
210 }
211 hashHaystack -= foldCaseHelper(haystack, end);
212
213 while (haystack >= end) {
214 hashHaystack += foldCaseHelper(haystack, end);
215 if (hashHaystack == hashNeedle
216 && QtPrivate::compareStrings(sv(haystack), needle0, Qt::CaseInsensitive) == 0)
217 return haystack - end;
218 --haystack;
219 REHASH(foldCaseHelper(haystack + sl, end));
220 }
221 }
222 return -1;
223}
224
225template <typename Haystack, typename Needle>
226bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
227{
228 if (haystack.isNull())
229 return needle.isNull();
230 const auto haystackLen = haystack.size();
231 const auto needleLen = needle.size();
232 if (haystackLen == 0)
233 return needleLen == 0;
234 if (needleLen > haystackLen)
235 return false;
236
237 return QtPrivate::compareStrings(haystack.first(needleLen), needle, cs) == 0;
238}
239
240template <typename Haystack, typename Needle>
241bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) noexcept
242{
243 if (haystack.isNull())
244 return needle.isNull();
245 const auto haystackLen = haystack.size();
246 const auto needleLen = needle.size();
247 if (haystackLen == 0)
248 return needleLen == 0;
249 if (haystackLen < needleLen)
250 return false;
251
252 return QtPrivate::compareStrings(haystack.last(needleLen), needle, cs) == 0;
253}
254
255template <typename T>
256static void append_helper(QString &self, T view)
257{
258 const auto strData = view.data();
259 const qsizetype strSize = view.size();
260 auto &d = self.data_ptr();
261 if (strData && strSize > 0) {
262 // the number of UTF-8 code units is always at a minimum equal to the number
263 // of equivalent UTF-16 code units
264 d.detachAndGrow(QArrayData::GrowsAtEnd, strSize, nullptr, nullptr);
265 Q_CHECK_PTR(d.data());
266 Q_ASSERT(strSize <= d.freeSpaceAtEnd());
267
268 auto dst = std::next(d.data(), d.size);
269 if constexpr (std::is_same_v<T, QUtf8StringView>) {
270 dst = QUtf8::convertToUnicode(dst, view);
271 } else if constexpr (std::is_same_v<T, QLatin1StringView>) {
272 QLatin1::convertToUnicode(dst, view);
273 dst += strSize;
274 } else {
275 static_assert(QtPrivate::type_dependent_false<T>(),
276 "Can only operate on UTF-8 and Latin-1");
277 }
278 self.resize(std::distance(d.begin(), dst));
279 } else if (d.isNull() && !view.isNull()) { // special case
280 self = QLatin1StringView("");
281 }
282}
283
284template <uint MaxCount> struct UnrollTailLoop
285{
286 template <typename RetType, typename Functor1, typename Functor2, typename Number>
287 static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
288 {
289 /* equivalent to:
290 * while (count--) {
291 * if (loopCheck(i))
292 * return returnIfFailed(i);
293 * }
294 * return returnIfExited;
295 */
296
297 if (!count)
298 return returnIfExited;
299
300 bool check = loopCheck(i);
301 if (check)
302 return returnIfFailed(i);
303
304 return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
305 }
306
307 template <typename Functor, typename Number>
308 static inline void exec(Number count, Functor code)
309 {
310 /* equivalent to:
311 * for (Number i = 0; i < count; ++i)
312 * code(i);
313 */
314 exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
315 }
316};
317template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
318inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
319{
320 return returnIfExited;
321}
322} // unnamed namespace
323
324/*
325 * Note on the use of SIMD in qstring.cpp:
326 *
327 * Several operations with strings are improved with the use of SIMD code,
328 * since they are repetitive. For MIPS, we have hand-written assembly code
329 * outside of qstring.cpp targeting MIPS DSP and MIPS DSPr2. For ARM and for
330 * x86, we can only use intrinsics and therefore everything is contained in
331 * qstring.cpp. We need to use intrinsics only for those platforms due to the
332 * different compilers and toolchains used, which have different syntax for
333 * assembly sources.
334 *
335 * ** SSE notes: **
336 *
337 * Whenever multiple alternatives are equivalent or near so, we prefer the one
338 * using instructions from SSE2, since SSE2 is guaranteed to be enabled for all
339 * 64-bit builds and we enable it for 32-bit builds by default. Use of higher
340 * SSE versions should be done when there is a clear performance benefit and
341 * requires fallback code to SSE2, if it exists.
342 *
343 * Performance measurement in the past shows that most strings are short in
344 * size and, therefore, do not benefit from alignment prologues. That is,
345 * trying to find a 16-byte-aligned boundary to operate on is often more
346 * expensive than executing the unaligned operation directly. In addition, note
347 * that the QString private data is designed so that the data is stored on
348 * 16-byte boundaries if the system malloc() returns 16-byte aligned pointers
349 * on its own (64-bit glibc on Linux does; 32-bit glibc on Linux returns them
350 * 50% of the time), so skipping the alignment prologue is actually optimizing
351 * for the common case.
352 */
353
354#if defined(__mips_dsp)
355// From qstring_mips_dsp_asm.S
356extern "C" void qt_fromlatin1_mips_asm_unroll4 (char16_t*, const char*, uint);
357extern "C" void qt_fromlatin1_mips_asm_unroll8 (char16_t*, const char*, uint);
358extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const char16_t *src, int length);
359#endif
360
361#if defined(__SSE2__) && defined(Q_CC_GNU)
362// We may overrun the buffer, but that's a false positive:
363// this won't crash nor produce incorrect results
364# define ATTRIBUTE_NO_SANITIZE __attribute__((__no_sanitize_address__, __no_sanitize_thread__))
365#else
366# define ATTRIBUTE_NO_SANITIZE
367#endif
368
369#ifdef __SSE2__
370static constexpr bool UseSse4_1 = bool(qCompilerCpuFeatures & CpuFeatureSSE4_1);
371static constexpr bool UseAvx2 = UseSse4_1 &&
372 (qCompilerCpuFeatures & CpuFeatureArchHaswell) == CpuFeatureArchHaswell;
373
374[[maybe_unused]]
375Q_ALWAYS_INLINE static __m128i mm_load8_zero_extend(const void *ptr)
376{
377 const __m128i *dataptr = static_cast<const __m128i *>(ptr);
378 if constexpr (UseSse4_1) {
379 // use a MOVQ followed by PMOVZXBW
380 // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
381 __m128i data = _mm_loadl_epi64(dataptr);
382 return _mm_cvtepu8_epi16(data);
383 }
384
385 // use MOVQ followed by PUNPCKLBW
386 __m128i data = _mm_loadl_epi64(dataptr);
387 return _mm_unpacklo_epi8(data, _mm_setzero_si128());
388}
389
390[[maybe_unused]] ATTRIBUTE_NO_SANITIZE
391static qsizetype qustrlen_sse2(const char16_t *str) noexcept
392{
393 // find the 16-byte alignment immediately prior or equal to str
394 quintptr misalignment = quintptr(str) & 0xf;
395 Q_ASSERT((misalignment & 1) == 0);
396 const char16_t *ptr = str - (misalignment / 2);
397
398 // load 16 bytes and see if we have a null
399 // (aligned loads can never segfault)
400 const __m128i zeroes = _mm_setzero_si128();
401 __m128i data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
402 __m128i comparison = _mm_cmpeq_epi16(data, zeroes);
403 uint mask = _mm_movemask_epi8(comparison);
404
405 // ignore the result prior to the beginning of str
406 mask >>= misalignment;
407
408 // Have we found something in the first block? Need to handle it now
409 // because of the left shift above.
410 if (mask)
411 return qCountTrailingZeroBits(mask) / sizeof(char16_t);
412
413 constexpr qsizetype Step = sizeof(__m128i) / sizeof(char16_t);
414 qsizetype size = Step - misalignment / sizeof(char16_t);
415
416 size -= Step;
417 do {
418 size += Step;
419 data = _mm_load_si128(reinterpret_cast<const __m128i *>(str + size));
420
421 comparison = _mm_cmpeq_epi16(data, zeroes);
422 mask = _mm_movemask_epi8(comparison);
423 } while (mask == 0);
424
425 // found a null
426 return size + qCountTrailingZeroBits(mask) / sizeof(char16_t);
427}
428
429// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
430// the no non-zero was found. Returns false and updates \a ptr to point to the
431// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
432// may be updated to one byte short).
433static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
434{
435 auto updatePtr = [&](uint result) {
436 // found a character matching the mask
437 uint idx = qCountTrailingZeroBits(~result);
438 ptr += idx;
439 return false;
440 };
441
442 if constexpr (UseSse4_1) {
443# ifndef Q_OS_QNX // compiler fails in the code below
444 __m128i mask;
445 auto updatePtrSimd = [&](__m128i data) -> bool {
446 __m128i masked = _mm_and_si128(mask, data);
447 __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
448 uint result = _mm_movemask_epi8(comparison);
449 return updatePtr(result);
450 };
451
452 if constexpr (UseAvx2) {
453 // AVX2 implementation: test 32 bytes at a time
454 const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
455 while (ptr + 32 <= end) {
456 __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
457 if (!_mm256_testz_si256(mask256, data)) {
458 // found a character matching the mask
459 __m256i masked256 = _mm256_and_si256(mask256, data);
460 __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
461 return updatePtr(_mm256_movemask_epi8(comparison256));
462 }
463 ptr += 32;
464 }
465
466 mask = _mm256_castsi256_si128(mask256);
467 } else {
468 // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
469 // comparisons, unrolled)
470 mask = _mm_set1_epi32(maskval);
471 while (ptr + 32 <= end) {
472 __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
473 __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
474 if (!_mm_testz_si128(mask, data1))
475 return updatePtrSimd(data1);
476
477 ptr += 16;
478 if (!_mm_testz_si128(mask, data2))
479 return updatePtrSimd(data2);
480 ptr += 16;
481 }
482 }
483
484 // AVX2 and SSE4.1: final 16-byte comparison
485 if (ptr + 16 <= end) {
486 __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
487 if (!_mm_testz_si128(mask, data1))
488 return updatePtrSimd(data1);
489 ptr += 16;
490 }
491
492 // and final 8-byte comparison
493 if (ptr + 8 <= end) {
494 __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
495 if (!_mm_testz_si128(mask, data1))
496 return updatePtrSimd(data1);
497 ptr += 8;
498 }
499
500 return true;
501# endif // QNX
502 }
503
504 // SSE2 implementation: test 16 bytes at a time.
505 const __m128i mask = _mm_set1_epi32(maskval);
506 while (ptr + 16 <= end) {
507 __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
508 __m128i masked = _mm_and_si128(mask, data);
509 __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
510 quint16 result = _mm_movemask_epi8(comparison);
511 if (result != 0xffff)
512 return updatePtr(result);
513 ptr += 16;
514 }
515
516 // and one 8-byte comparison
517 if (ptr + 8 <= end) {
518 __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
519 __m128i masked = _mm_and_si128(mask, data);
520 __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
521 quint8 result = _mm_movemask_epi8(comparison);
522 if (result != 0xff)
523 return updatePtr(result);
524 ptr += 8;
525 }
526
527 return true;
528}
529
530template <StringComparisonMode Mode, typename Char> [[maybe_unused]]
531static int ucstrncmp_sse2(const char16_t *a, const Char *b, size_t l)
532{
533 static_assert(std::is_unsigned_v<Char>);
534
535 // Using the PMOVMSKB instruction, we get two bits for each UTF-16 character
536 // we compare. This lambda helps extract the code unit.
537 static const auto codeUnitAt = [](const auto *n, qptrdiff idx) -> int {
538 constexpr int Stride = 2;
539 // this is the same as:
540 // return n[idx / Stride];
541 // but using pointer arithmetic to avoid the compiler dividing by two
542 // and multiplying by two in the case of char16_t (we know idx is even,
543 // but the compiler does not). This is not UB.
544
545 auto ptr = reinterpret_cast<const uchar *>(n);
546 ptr += idx / (Stride / sizeof(*n));
547 return *reinterpret_cast<decltype(n)>(ptr);
548 };
549 auto difference = [a, b](uint mask, qptrdiff offset) {
550 if (Mode == CompareStringsForEquality)
551 return 1;
552 uint idx = qCountTrailingZeroBits(mask);
553 return codeUnitAt(a + offset, idx) - codeUnitAt(b + offset, idx);
554 };
555
556 static const auto load8Chars = [](const auto *ptr) {
557 if (sizeof(*ptr) == 2)
558 return _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
559 __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
560 return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
561 };
562 static const auto load4Chars = [](const auto *ptr) {
563 if (sizeof(*ptr) == 2)
564 return _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
565 __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<quint32>(ptr));
566 return _mm_unpacklo_epi8(chunk, _mm_setzero_si128());
567 };
568
569 // we're going to read a[0..15] and b[0..15] (32 bytes)
570 auto processChunk16Chars = [a, b](qptrdiff offset) -> uint {
571 if constexpr (UseAvx2) {
572 __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
573 __m256i b_data;
574 if (sizeof(Char) == 1) {
575 // expand to UTF-16 via zero-extension
576 __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
577 b_data = _mm256_cvtepu8_epi16(chunk);
578 } else {
579 b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
580 }
581 __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
582 return _mm256_movemask_epi8(result);
583 }
584
585 __m128i a_data1 = load8Chars(a + offset);
586 __m128i a_data2 = load8Chars(a + offset + 8);
587 __m128i b_data1, b_data2;
588 if (sizeof(Char) == 1) {
589 // expand to UTF-16 via unpacking
590 __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
591 b_data1 = _mm_unpacklo_epi8(b_data, _mm_setzero_si128());
592 b_data2 = _mm_unpackhi_epi8(b_data, _mm_setzero_si128());
593 } else {
594 b_data1 = load8Chars(b + offset);
595 b_data2 = load8Chars(b + offset + 8);
596 }
597 __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
598 __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
599 return _mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16;
600 };
601
602 if (l >= sizeof(__m256i) / sizeof(char16_t)) {
603 qptrdiff offset = 0;
604 for ( ; l >= offset + sizeof(__m256i) / sizeof(char16_t); offset += sizeof(__m256i) / sizeof(char16_t)) {
605 uint mask = ~processChunk16Chars(offset);
606 if (mask)
607 return difference(mask, offset);
608 }
609
610 // maybe overlap the last 32 bytes
611 if (size_t(offset) < l) {
612 offset = l - sizeof(__m256i) / sizeof(char16_t);
613 uint mask = ~processChunk16Chars(offset);
614 return mask ? difference(mask, offset) : 0;
615 }
616 } else if (l >= 4) {
617 __m128i a_data1, b_data1;
618 __m128i a_data2, b_data2;
619 int width;
620 if (l >= 8) {
621 width = 8;
622 a_data1 = load8Chars(a);
623 b_data1 = load8Chars(b);
624 a_data2 = load8Chars(a + l - width);
625 b_data2 = load8Chars(b + l - width);
626 } else {
627 // we're going to read a[0..3] and b[0..3] (8 bytes)
628 width = 4;
629 a_data1 = load4Chars(a);
630 b_data1 = load4Chars(b);
631 a_data2 = load4Chars(a + l - width);
632 b_data2 = load4Chars(b + l - width);
633 }
634
635 __m128i result = _mm_cmpeq_epi16(a_data1, b_data1);
636 ushort mask = ~_mm_movemask_epi8(result);
637 if (mask)
638 return difference(mask, 0);
639
640 result = _mm_cmpeq_epi16(a_data2, b_data2);
641 mask = ~_mm_movemask_epi8(result);
642 if (mask)
643 return difference(mask, l - width);
644 } else {
645 // reset l
646 l &= 3;
647
648 const auto lambda = [=](size_t i) -> int {
649 return a[i] - b[i];
650 };
651 return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
652 }
653 return 0;
654}
655#endif
656
657Q_NEVER_INLINE
658qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept
659{
660#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)) && !(defined(__SANITIZE_THREAD__) || __has_feature(thread_sanitizer))
661 return qustrlen_sse2(str);
662#endif
663
664 if (sizeof(wchar_t) == sizeof(char16_t))
665 return wcslen(reinterpret_cast<const wchar_t *>(str));
666
667 qsizetype result = 0;
668 while (*str++)
669 ++result;
670 return result;
671}
672
673qsizetype QtPrivate::qustrnlen(const char16_t *str, qsizetype maxlen) noexcept
674{
675 return qustrchr({ str, maxlen }, u'\0') - str;
676}
677
678/*!
679 * \internal
680 *
681 * Searches for character \a c in the string \a str and returns a pointer to
682 * it. Unlike strchr() and wcschr() (but like glibc's strchrnul()), if the
683 * character is not found, this function returns a pointer to the end of the
684 * string -- that is, \c{str.end()}.
685 */
687const char16_t *QtPrivate::qustrchr(QStringView str, char16_t c) noexcept
688{
689 const char16_t *n = str.utf16();
690 const char16_t *e = n + str.size();
691
692#ifdef __SSE2__
693 bool loops = true;
694 // Using the PMOVMSKB instruction, we get two bits for each character
695 // we compare.
696 __m128i mch;
697 if constexpr (UseAvx2) {
698 // we're going to read n[0..15] (32 bytes)
699 __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
700 for (const char16_t *next = n + 16; next <= e; n = next, next += 16) {
701 __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
702 __m256i result = _mm256_cmpeq_epi16(data, mch256);
703 uint mask = uint(_mm256_movemask_epi8(result));
704 if (mask) {
705 uint idx = qCountTrailingZeroBits(mask);
706 return n + idx / 2;
707 }
708 }
709 loops = false;
710 mch = _mm256_castsi256_si128(mch256);
711 } else {
712 mch = _mm_set1_epi32(c | (c << 16));
713 }
714
715 auto hasMatch = [mch, &n](__m128i data, ushort validityMask) {
716 __m128i result = _mm_cmpeq_epi16(data, mch);
717 uint mask = uint(_mm_movemask_epi8(result));
718 if ((mask & validityMask) == 0)
719 return false;
720 uint idx = qCountTrailingZeroBits(mask);
721 n += idx / 2;
722 return true;
723 };
724
725 // we're going to read n[0..7] (16 bytes)
726 for (const char16_t *next = n + 8; next <= e; n = next, next += 8) {
727 __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(n));
728 if (hasMatch(data, 0xffff))
729 return n;
730
731 if (!loops) {
732 n += 8;
733 break;
734 }
735 }
736
737# if !defined(__OPTIMIZE_SIZE__)
738 // we're going to read n[0..3] (8 bytes)
739 if (e - n > 3) {
740 __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(n));
741 if (hasMatch(data, 0xff))
742 return n;
743
744 n += 4;
745 }
746
747 return UnrollTailLoop<3>::exec(e - n, e,
748 [=](qsizetype i) { return n[i] == c; },
749 [=](qsizetype i) { return n + i; });
750# endif
751#elif defined(__ARM_NEON__)
752 const uint16x8_t vmask = qvsetq_n_u16(1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7);
753 const uint16x8_t ch_vec = vdupq_n_u16(c);
754 for (const char16_t *next = n + 8; next <= e; n = next, next += 8) {
755 uint16x8_t data = vld1q_u16(reinterpret_cast<const uint16_t *>(n));
756 uint mask = vaddvq_u16(vandq_u16(vceqq_u16(data, ch_vec), vmask));
757 if (ushort(mask)) {
758 // found a match
759 return n + qCountTrailingZeroBits(mask);
760 }
761 }
762#endif // aarch64
763
764 return std::find(n, e, c);
765}
766
767/*!
768 * \internal
769 *
770 * Searches case-insensitively for character \a c in the string \a str and
771 * returns a pointer to it. Iif the character is not found, this function
772 * returns a pointer to the end of the string -- that is, \c{str.end()}.
773 */
775const char16_t *QtPrivate::qustrcasechr(QStringView str, char16_t c) noexcept
776{
777 const QChar *n = str.begin();
778 const QChar *e = str.end();
779 c = foldCase(c);
780 auto it = std::find_if(n, e, [c](auto ch) { return foldAndCompare(ch, QChar(c)); });
781 return reinterpret_cast<const char16_t *>(it);
782}
783
784// Note: ptr on output may be off by one and point to a preceding US-ASCII
785// character. Usually harmless.
786bool qt_is_ascii(const char *&ptr, const char *end) noexcept
787{
788#if defined(__SSE2__)
789 // Testing for the high bit can be done efficiently with just PMOVMSKB
790 bool loops = true;
791 if constexpr (UseAvx2) {
792 while (ptr + 32 <= end) {
793 __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
794 quint32 mask = _mm256_movemask_epi8(data);
795 if (mask) {
796 uint idx = qCountTrailingZeroBits(mask);
797 ptr += idx;
798 return false;
799 }
800 ptr += 32;
801 }
802 loops = false;
803 }
804
805 while (ptr + 16 <= end) {
806 __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
807 quint32 mask = _mm_movemask_epi8(data);
808 if (mask) {
809 uint idx = qCountTrailingZeroBits(mask);
810 ptr += idx;
811 return false;
812 }
813 ptr += 16;
814
815 if (!loops)
816 break;
817 }
818 if (ptr + 8 <= end) {
819 __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
820 quint8 mask = _mm_movemask_epi8(data);
821 if (mask) {
822 uint idx = qCountTrailingZeroBits(mask);
823 ptr += idx;
824 return false;
825 }
826 ptr += 8;
827 }
828#endif
829
830 while (ptr + 4 <= end) {
831 quint32 data = qFromUnaligned<quint32>(ptr);
832 if (data &= 0x80808080U) {
833 uint idx = QSysInfo::ByteOrder == QSysInfo::BigEndian
834 ? qCountLeadingZeroBits(data)
835 : qCountTrailingZeroBits(data);
836 ptr += idx / 8;
837 return false;
838 }
839 ptr += 4;
840 }
841
842 while (ptr != end) {
843 if (quint8(*ptr) & 0x80)
844 return false;
845 ++ptr;
846 }
847 return true;
848}
849
850bool QtPrivate::isAscii(QLatin1StringView s) noexcept
851{
852 const char *ptr = s.begin();
853 const char *end = s.end();
854
855 return qt_is_ascii(ptr, end);
856}
857
858static bool isAscii_helper(const char16_t *&ptr, const char16_t *end)
859{
860#ifdef __SSE2__
861 const char *ptr8 = reinterpret_cast<const char *>(ptr);
862 const char *end8 = reinterpret_cast<const char *>(end);
863 bool ok = simdTestMask(ptr8, end8, 0xff80ff80);
864 ptr = reinterpret_cast<const char16_t *>(ptr8);
865 if (!ok)
866 return false;
867#endif
868
869 while (ptr != end) {
870 if (*ptr & 0xff80)
871 return false;
872 ++ptr;
873 }
874 return true;
875}
876
877bool QtPrivate::isAscii(QStringView s) noexcept
878{
879 const char16_t *ptr = s.utf16();
880 const char16_t *end = ptr + s.size();
881
882 return isAscii_helper(ptr, end);
883}
884
885bool QtPrivate::isLatin1(QStringView s) noexcept
886{
887 const char16_t *ptr = s.utf16();
888 const char16_t *end = ptr + s.size();
889
890#ifdef __SSE2__
891 const char *ptr8 = reinterpret_cast<const char *>(ptr);
892 const char *end8 = reinterpret_cast<const char *>(end);
893 if (!simdTestMask(ptr8, end8, 0xff00ff00))
894 return false;
895 ptr = reinterpret_cast<const char16_t *>(ptr8);
896#endif
897
898 while (ptr != end) {
899 if (*ptr++ > 0xff)
900 return false;
901 }
902 return true;
903}
904
905bool QtPrivate::isValidUtf16(QStringView s) noexcept
906{
907 constexpr char32_t InvalidCodePoint = UINT_MAX;
908
909 QStringIterator i(s);
910 while (i.hasNext()) {
911 const char32_t c = i.next(InvalidCodePoint);
912 if (c == InvalidCodePoint)
913 return false;
914 }
915
916 return true;
917}
918
919// conversion between Latin 1 and UTF-16
920Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept
921{
922 /* SIMD:
923 * Unpacking with SSE has been shown to improve performance on recent CPUs
924 * The same method gives no improvement with NEON. On Aarch64, clang will do the vectorization
925 * itself in exactly the same way as one would do it with intrinsics.
926 */
927#if defined(__SSE2__)
928 // we're going to read str[offset..offset+15] (16 bytes)
929 const __m128i nullMask = _mm_setzero_si128();
930 auto processOneChunk = [=](qptrdiff offset) {
931 const __m128i chunk = _mm_loadu_si128((const __m128i*)(str + offset)); // load
932 if constexpr (UseAvx2) {
933 // zero extend to an YMM register
934 const __m256i extended = _mm256_cvtepu8_epi16(chunk);
935
936 // store
937 _mm256_storeu_si256((__m256i*)(dst + offset), extended);
938 } else {
939 // unpack the first 8 bytes, padding with zeros
940 const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
941 _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
942
943 // unpack the last 8 bytes, padding with zeros
944 const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
945 _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
946 }
947 };
948
949 const char *e = str + size;
950 if (size >= sizeof(__m128i)) {
951 qptrdiff offset = 0;
952 for ( ; str + offset + sizeof(__m128i) <= e; offset += sizeof(__m128i))
953 processOneChunk(offset);
954 if (str + offset < e)
955 processOneChunk(size - sizeof(__m128i));
956 return;
957 }
958
959# if !defined(__OPTIMIZE_SIZE__)
960 if (size >= 4) {
961 // two overlapped loads & stores, of either 64-bit or of 32-bit
962 if (size >= 8) {
963 const __m128i unpacked1 = mm_load8_zero_extend(str);
964 const __m128i unpacked2 = mm_load8_zero_extend(str + size - 8);
965 _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), unpacked1);
966 _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + size - 8), unpacked2);
967 } else {
968 const __m128i chunk1 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str));
969 const __m128i chunk2 = _mm_cvtsi32_si128(qFromUnaligned<quint32>(str + size - 4));
970 const __m128i unpacked1 = _mm_unpacklo_epi8(chunk1, nullMask);
971 const __m128i unpacked2 = _mm_unpacklo_epi8(chunk2, nullMask);
972 _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), unpacked1);
973 _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + size - 4), unpacked2);
974 }
975 return;
976 } else {
977 size = size % 4;
978 return UnrollTailLoop<3>::exec(qsizetype(size), [=](qsizetype i) { dst[i] = uchar(str[i]); });
979 }
980# endif
981#endif
982#if defined(__mips_dsp)
983 static_assert(sizeof(qsizetype) == sizeof(int),
984 "oops, the assembler implementation needs to be called in a loop");
985 if (size > 20)
986 qt_fromlatin1_mips_asm_unroll8(dst, str, size);
987 else
988 qt_fromlatin1_mips_asm_unroll4(dst, str, size);
989#else
990 while (size--)
991 *dst++ = (uchar)*str++;
992#endif
993}
994
995static QVarLengthArray<char16_t> qt_from_latin1_to_qvla(QLatin1StringView str)
996{
997 const qsizetype len = str.size();
998 QVarLengthArray<char16_t> arr(len);
999 qt_from_latin1(arr.data(), str.data(), len);
1000 return arr;
1001}
1002
1003template <bool Checked>
1004static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype length)
1005{
1006#if defined(__SSE2__)
1007 auto questionMark256 = []() {
1008 if constexpr (UseAvx2)
1009 return _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
1010 else
1011 return 0;
1012 }();
1013 auto outOfRange256 = []() {
1014 if constexpr (UseAvx2)
1015 return _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
1016 else
1017 return 0;
1018 }();
1019 __m128i questionMark, outOfRange;
1020 if constexpr (UseAvx2) {
1021 questionMark = _mm256_castsi256_si128(questionMark256);
1022 outOfRange = _mm256_castsi256_si128(outOfRange256);
1023 } else {
1024 questionMark = _mm_set1_epi16('?');
1025 outOfRange = _mm_set1_epi16(0x100);
1026 }
1027
1028 auto mergeQuestionMarks = [=](__m128i chunk) {
1029 if (!Checked)
1030 return chunk;
1031
1032 // SSE has no compare instruction for unsigned comparison.
1033 if constexpr (UseSse4_1) {
1034 // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
1035 chunk = _mm_min_epu16(chunk, outOfRange);
1036 const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
1037 chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
1038 return chunk;
1039 }
1040 // The variables must be shiffted + 0x8000 to be compared
1041 const __m128i signedBitOffset = _mm_set1_epi16(short(0x8000));
1042 const __m128i thresholdMask = _mm_set1_epi16(short(0xff + 0x8000));
1043
1044 const __m128i signedChunk = _mm_add_epi16(chunk, signedBitOffset);
1045 const __m128i offLimitMask = _mm_cmpgt_epi16(signedChunk, thresholdMask);
1046
1047 // offLimitQuestionMark contains '?' for each 16 bits that was off-limit
1048 // the 16 bits that were correct contains zeros
1049 const __m128i offLimitQuestionMark = _mm_and_si128(offLimitMask, questionMark);
1050
1051 // correctBytes contains the bytes that were in limit
1052 // the 16 bits that were off limits contains zeros
1053 const __m128i correctBytes = _mm_andnot_si128(offLimitMask, chunk);
1054
1055 // merge offLimitQuestionMark and correctBytes to have the result
1056 chunk = _mm_or_si128(correctBytes, offLimitQuestionMark);
1057
1058 Q_UNUSED(outOfRange);
1059 return chunk;
1060 };
1061
1062 // we're going to read to src[offset..offset+15] (16 bytes)
1063 auto loadChunkAt = [=](qptrdiff offset) {
1064 __m128i chunk1, chunk2;
1065 if constexpr (UseAvx2) {
1066 __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
1067 if (Checked) {
1068 // See mergeQuestionMarks lambda above for details
1069 chunk = _mm256_min_epu16(chunk, outOfRange256);
1070 const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
1071 chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
1072 }
1073
1074 chunk2 = _mm256_extracti128_si256(chunk, 1);
1075 chunk1 = _mm256_castsi256_si128(chunk);
1076 } else {
1077 chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
1078 chunk1 = mergeQuestionMarks(chunk1);
1079
1080 chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
1081 chunk2 = mergeQuestionMarks(chunk2);
1082 }
1083
1084 // pack the two vector to 16 x 8bits elements
1085 return _mm_packus_epi16(chunk1, chunk2);
1086 };
1087
1088 if (size_t(length) >= sizeof(__m128i)) {
1089 // because of possible overlapping, we won't process the last chunk in the loop
1090 qptrdiff offset = 0;
1091 for ( ; offset + 2 * sizeof(__m128i) < size_t(length); offset += sizeof(__m128i))
1092 _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), loadChunkAt(offset));
1093
1094 // overlapped conversion of the last full chunk and the tail
1095 __m128i last1 = loadChunkAt(offset);
1096 __m128i last2 = loadChunkAt(length - sizeof(__m128i));
1097 _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), last1);
1098 _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + length - sizeof(__m128i)), last2);
1099 return;
1100 }
1101
1102# if !defined(__OPTIMIZE_SIZE__)
1103 if (length >= 4) {
1104 // this code is fine even for in-place conversion because we load both
1105 // before any store
1106 if (length >= 8) {
1107 __m128i chunk1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src));
1108 __m128i chunk2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + length - 8));
1109 chunk1 = mergeQuestionMarks(chunk1);
1110 chunk2 = mergeQuestionMarks(chunk2);
1111
1112 // pack, where the upper half is ignored
1113 const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
1114 const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
1115 _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), result1);
1116 _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + length - 8), result2);
1117 } else {
1118 __m128i chunk1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src));
1119 __m128i chunk2 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + length - 4));
1120 chunk1 = mergeQuestionMarks(chunk1);
1121 chunk2 = mergeQuestionMarks(chunk2);
1122
1123 // pack, we'll zero the upper three quarters
1124 const __m128i result1 = _mm_packus_epi16(chunk1, chunk1);
1125 const __m128i result2 = _mm_packus_epi16(chunk2, chunk2);
1126 qToUnaligned(_mm_cvtsi128_si32(result1), dst);
1127 qToUnaligned(_mm_cvtsi128_si32(result2), dst + length - 4);
1128 }
1129 return;
1130 }
1131
1132 length = length % 4;
1133 return UnrollTailLoop<3>::exec(length, [=](qsizetype i) {
1134 if (Checked)
1135 dst[i] = (src[i]>0xff) ? '?' : (uchar) src[i];
1136 else
1137 dst[i] = src[i];
1138 });
1139# else
1140 length = length % 16;
1141# endif // optimize size
1142#elif defined(__ARM_NEON__)
1143 // Refer to the documentation of the SSE2 implementation.
1144 // This uses exactly the same method as for SSE except:
1145 // 1) neon has unsigned comparison
1146 // 2) packing is done to 64 bits (8 x 8bits component).
1147 if (length >= 16) {
1148 const qsizetype chunkCount = length >> 3; // divided by 8
1149 const uint16x8_t questionMark = vdupq_n_u16('?'); // set
1150 const uint16x8_t thresholdMask = vdupq_n_u16(0xff); // set
1151 for (qsizetype i = 0; i < chunkCount; ++i) {
1152 uint16x8_t chunk = vld1q_u16((uint16_t *)src); // load
1153 src += 8;
1154
1155 if (Checked) {
1156 const uint16x8_t offLimitMask = vcgtq_u16(chunk, thresholdMask); // chunk > thresholdMask
1157 const uint16x8_t offLimitQuestionMark = vandq_u16(offLimitMask, questionMark); // offLimitMask & questionMark
1158 const uint16x8_t correctBytes = vbicq_u16(chunk, offLimitMask); // !offLimitMask & chunk
1159 chunk = vorrq_u16(correctBytes, offLimitQuestionMark); // correctBytes | offLimitQuestionMark
1160 }
1161 const uint8x8_t result = vmovn_u16(chunk); // narrowing move->packing
1162 vst1_u8(dst, result); // store
1163 dst += 8;
1164 }
1165 length = length % 8;
1166 }
1167#endif
1168#if defined(__mips_dsp)
1169 static_assert(sizeof(qsizetype) == sizeof(int),
1170 "oops, the assembler implementation needs to be called in a loop");
1171 qt_toLatin1_mips_dsp_asm(dst, src, length);
1172#else
1173 while (length--) {
1174 if (Checked)
1175 *dst++ = (*src>0xff) ? '?' : (uchar) *src;
1176 else
1177 *dst++ = *src;
1178 ++src;
1179 }
1180#endif
1181}
1182
1183void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
1184{
1185 qt_to_latin1_internal<true>(dst, src, length);
1186}
1187
1188void qt_to_latin1_unchecked(uchar *dst, const char16_t *src, qsizetype length)
1189{
1190 qt_to_latin1_internal<false>(dst, src, length);
1191}
1192
1193// Unicode case-insensitive comparison (argument order matches QStringView)
1194Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char16_t *b)
1195{
1196 if (a == b)
1197 return qt_lencmp(alen, blen);
1198
1199 qsizetype l = qMin(alen, blen);
1200 qsizetype i;
1201 for (i = 0; i < l; ++i) {
1202// qDebug() << Qt::hex << alast << blast;
1203// qDebug() << Qt::hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast);
1204// qDebug() << Qt::hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast);
1205 int diff = foldCase(a + i, a) - foldCase(b + i, b);
1206 if ((diff))
1207 return diff;
1208 }
1209 if (i == alen) {
1210 if (i == blen)
1211 return 0;
1212 return -1;
1213 }
1214 return 1;
1215}
1216
1217// Case-insensitive comparison between a QStringView and a QLatin1StringView
1218// (argument order matches those types)
1219Q_NEVER_INLINE static int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char *b)
1220{
1221 qsizetype l = qMin(alen, blen);
1222 qsizetype i;
1223 for (i = 0; i < l; ++i) {
1224 int diff = foldCase(a[i]) - foldCase(char16_t{uchar(b[i])});
1225 if ((diff))
1226 return diff;
1227 }
1228 if (i == alen) {
1229 if (i == blen)
1230 return 0;
1231 return -1;
1232 }
1233 return 1;
1234}
1235
1236// Case-insensitive comparison between a Unicode string and a UTF-8 string
1237Q_NEVER_INLINE static int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16, const QChar *utf16end)
1238{
1239 auto src1 = reinterpret_cast<const qchar8_t *>(utf8);
1240 auto end1 = reinterpret_cast<const qchar8_t *>(utf8end);
1241 QStringIterator src2(utf16, utf16end);
1242
1243 while (src1 < end1 && src2.hasNext()) {
1244 char32_t uc1 = QChar::toCaseFolded(QUtf8Functions::nextUcs4FromUtf8(src1, end1));
1245 char32_t uc2 = QChar::toCaseFolded(src2.next());
1246 int diff = uc1 - uc2; // can't underflow
1247 if (diff)
1248 return diff;
1249 }
1250
1251 // the shorter string sorts first
1252 return (end1 > src1) - int(src2.hasNext());
1253}
1254
1255#if defined(__mips_dsp)
1256// From qstring_mips_dsp_asm.S
1257extern "C" int qt_ucstrncmp_mips_dsp_asm(const char16_t *a,
1258 const char16_t *b,
1259 unsigned len);
1260#endif
1261
1262// Unicode case-sensitive compare two same-sized strings
1263template <StringComparisonMode Mode>
1264static int ucstrncmp(const char16_t *a, const char16_t *b, size_t l)
1265{
1266 // This function isn't memcmp() because that can return the wrong sorting
1267 // result in little-endian architectures: 0x00ff must sort before 0x0100,
1268 // but the bytes in memory are FF 00 and 00 01.
1269
1270#ifndef __OPTIMIZE_SIZE__
1271# if defined(__mips_dsp)
1272 static_assert(sizeof(uint) == sizeof(size_t));
1273 if (l >= 8) {
1274 return qt_ucstrncmp_mips_dsp_asm(a, b, l);
1275 }
1276# elif defined(__SSE2__)
1277 return ucstrncmp_sse2<Mode>(a, b, l);
1278# elif defined(__ARM_NEON__)
1279 if (l >= 8) {
1280 const char16_t *end = a + l;
1281 const uint16x8_t mask = qvsetq_n_u16( 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 );
1282 while (end - a > 7) {
1283 uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a));
1284 uint16x8_t db = vld1q_u16(reinterpret_cast<const uint16_t *>(b));
1285
1286 uint8_t r = ~(uint8_t)vaddvq_u16(vandq_u16(vceqq_u16(da, db), mask));
1287 if (r) {
1288 // found a different QChar
1289 if (Mode == CompareStringsForEquality)
1290 return 1;
1291 uint idx = qCountTrailingZeroBits(r);
1292 return a[idx] - b[idx];
1293 }
1294 a += 8;
1295 b += 8;
1296 }
1297 l &= 7;
1298 }
1299 const auto lambda = [=](size_t i) -> int {
1300 return a[i] - b[i];
1301 };
1302 return UnrollTailLoop<7>::exec(l, 0, lambda, lambda);
1303# endif // MIPS DSP or __SSE2__ or __ARM_NEON__
1304#endif // __OPTIMIZE_SIZE__
1305
1306 if (Mode == CompareStringsForEquality || QSysInfo::ByteOrder == QSysInfo::BigEndian)
1307 return memcmp(a, b, l * sizeof(char16_t));
1308
1309 for (size_t i = 0; i < l; ++i) {
1310 if (int diff = a[i] - b[i])
1311 return diff;
1312 }
1313 return 0;
1314}
1315
1316template <StringComparisonMode Mode>
1317static int ucstrncmp(const char16_t *a, const char *b, size_t l)
1318{
1319 const uchar *c = reinterpret_cast<const uchar *>(b);
1320 const char16_t *uc = a;
1321 const char16_t *e = uc + l;
1322
1323#if defined(__SSE2__) && !defined(__OPTIMIZE_SIZE__)
1324 return ucstrncmp_sse2<Mode>(uc, c, l);
1325#endif
1326
1327 while (uc < e) {
1328 int diff = *uc - *c;
1329 if (diff)
1330 return diff;
1331 uc++, c++;
1332 }
1333
1334 return 0;
1335}
1336
1337// Unicode case-sensitive equality
1338template <typename Char2>
1339static bool ucstreq(const char16_t *a, size_t alen, const Char2 *b)
1340{
1341 return ucstrncmp<CompareStringsForEquality>(a, b, alen) == 0;
1342}
1343
1344// Unicode case-sensitive comparison
1345template <typename Char2>
1346static int ucstrcmp(const char16_t *a, size_t alen, const Char2 *b, size_t blen)
1347{
1348 const size_t l = qMin(alen, blen);
1349 int cmp = ucstrncmp<CompareStringsForOrdering>(a, b, l);
1350 return cmp ? cmp : qt_lencmp(alen, blen);
1351}
1352
1354
1355static int latin1nicmp(const char *lhsChar, qsizetype lSize, const char *rhsChar, qsizetype rSize)
1356{
1357 // We're called with QLatin1StringView's .data() and .size():
1358 Q_ASSERT(lSize >= 0 && rSize >= 0);
1359 if (!lSize)
1360 return rSize ? -1 : 0;
1361 if (!rSize)
1362 return 1;
1363 const qsizetype size = std::min(lSize, rSize);
1364
1365 Q_ASSERT(lhsChar && rhsChar); // since both lSize and rSize are positive
1366 for (qsizetype i = 0; i < size; i++) {
1367 if (int res = CaseInsensitiveL1::difference(lhsChar[i], rhsChar[i]))
1368 return res;
1369 }
1370 return qt_lencmp(lSize, rSize);
1371}
1372
1373bool QtPrivate::equalStrings(QStringView lhs, QStringView rhs) noexcept
1374{
1375 Q_ASSERT(lhs.size() == rhs.size());
1376 return ucstreq(lhs.utf16(), lhs.size(), rhs.utf16());
1377}
1378
1379bool QtPrivate::equalStrings(QStringView lhs, QLatin1StringView rhs) noexcept
1380{
1381 Q_ASSERT(lhs.size() == rhs.size());
1382 return ucstreq(lhs.utf16(), lhs.size(), rhs.latin1());
1383}
1384
1385bool QtPrivate::equalStrings(QLatin1StringView lhs, QStringView rhs) noexcept
1386{
1387 return QtPrivate::equalStrings(rhs, lhs);
1388}
1389
1390bool QtPrivate::equalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept
1391{
1392 Q_ASSERT(lhs.size() == rhs.size());
1393 return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
1394}
1395
1396bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept
1397{
1398 return QUtf8::compareUtf8(lhs, rhs) == 0;
1399}
1400
1401bool QtPrivate::equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept
1402{
1403 return QtPrivate::equalStrings(rhs, lhs);
1404}
1405
1406bool QtPrivate::equalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept
1407{
1408 return QUtf8::compareUtf8(QByteArrayView(rhs), lhs) == 0;
1409}
1410
1411bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept
1412{
1413 return QtPrivate::equalStrings(rhs, lhs);
1414}
1415
1416bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept
1417{
1418#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED) || defined(QT_STATIC)
1419 Q_ASSERT(lhs.size() == rhs.size());
1420#else
1421 // operator== didn't enforce size prior to Qt 6.2
1422 if (lhs.size() != rhs.size())
1423 return false;
1424#endif
1425 return (!lhs.size() || memcmp(lhs.data(), rhs.data(), lhs.size()) == 0);
1426}
1427
1428bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
1429{
1430 if (lhs.size() != rhs.size() && lhs.isUtf8() == rhs.isUtf8())
1431 return false;
1432 return lhs.visit([rhs](auto lhs) {
1433 return rhs.visit([lhs](auto rhs) {
1434 return QtPrivate::equalStrings(lhs, rhs);
1435 });
1436 });
1437}
1438
1439/*!
1440 \relates QStringView
1441 \internal
1442 \since 5.10
1443
1444 Returns an integer that compares to 0 as \a lhs compares to \a rhs.
1445
1446 \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
1447
1448 Case-sensitive comparison is based exclusively on the numeric Unicode values
1449 of the characters and is very fast, but is not what a human would expect.
1450 Consider sorting user-visible strings with QString::localeAwareCompare().
1451
1452 \sa {Comparing Strings}
1453*/
1454int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
1455{
1456 if (cs == Qt::CaseSensitive)
1457 return ucstrcmp(lhs.utf16(), lhs.size(), rhs.utf16(), rhs.size());
1458 return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.utf16());
1459}
1460
1461/*!
1462 \relates QStringView
1463 \internal
1464 \since 5.10
1465 \overload
1466
1467 Returns an integer that compares to 0 as \a lhs compares to \a rhs.
1468
1469 \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
1470
1471 Case-sensitive comparison is based exclusively on the numeric Unicode values
1472 of the characters and is very fast, but is not what a human would expect.
1473 Consider sorting user-visible strings with QString::localeAwareCompare().
1474
1475 \sa {Comparing Strings}
1476*/
1477int QtPrivate::compareStrings(QStringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
1478{
1479 if (cs == Qt::CaseSensitive)
1480 return ucstrcmp(lhs.utf16(), lhs.size(), rhs.latin1(), rhs.size());
1481 return ucstricmp(lhs.size(), lhs.utf16(), rhs.size(), rhs.latin1());
1482}
1483
1484/*!
1485 \relates QStringView
1486 \internal
1487 \since 6.0
1488 \overload
1489*/
1490int QtPrivate::compareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
1491{
1492 return -compareStrings(rhs, lhs, cs);
1493}
1494
1495/*!
1496 \relates QStringView
1497 \internal
1498 \since 5.10
1499 \overload
1500*/
1501int QtPrivate::compareStrings(QLatin1StringView lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
1502{
1503 return -compareStrings(rhs, lhs, cs);
1504}
1505
1506/*!
1507 \relates QStringView
1508 \internal
1509 \since 5.10
1510 \overload
1511
1512 Returns an integer that compares to 0 as \a lhs compares to \a rhs.
1513
1514 \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
1515
1516 Case-sensitive comparison is based exclusively on the numeric Latin-1 values
1517 of the characters and is very fast, but is not what a human would expect.
1518 Consider sorting user-visible strings with QString::localeAwareCompare().
1519
1520 \sa {Comparing Strings}
1521*/
1522int QtPrivate::compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
1523{
1524 if (lhs.isEmpty())
1525 return qt_lencmp(qsizetype(0), rhs.size());
1526 if (rhs.isEmpty())
1527 return qt_lencmp(lhs.size(), qsizetype(0));
1528 if (cs == Qt::CaseInsensitive)
1529 return latin1nicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size());
1530 const auto l = std::min(lhs.size(), rhs.size());
1531 int r = memcmp(lhs.data(), rhs.data(), l);
1532 return r ? r : qt_lencmp(lhs.size(), rhs.size());
1533}
1534
1535/*!
1536 \relates QStringView
1537 \internal
1538 \since 6.0
1539 \overload
1540*/
1541int QtPrivate::compareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
1542{
1543 return -QUtf8::compareUtf8(QByteArrayView(rhs), lhs, cs);
1544}
1545
1546/*!
1547 \relates QStringView
1548 \internal
1549 \since 6.0
1550 \overload
1551*/
1552int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs, Qt::CaseSensitivity cs) noexcept
1553{
1554 if (cs == Qt::CaseSensitive)
1555 return QUtf8::compareUtf8(lhs, rhs);
1556 return ucstricmp8(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
1557}
1558
1559/*!
1560 \relates QStringView
1561 \internal
1562 \since 6.0
1563 \overload
1564*/
1565int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs, Qt::CaseSensitivity cs) noexcept
1566{
1567 return -compareStrings(rhs, lhs, cs);
1568}
1569
1570/*!
1571 \relates QStringView
1572 \internal
1573 \since 6.0
1574 \overload
1575*/
1576int QtPrivate::compareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs, Qt::CaseSensitivity cs) noexcept
1577{
1578 return QUtf8::compareUtf8(QByteArrayView(lhs), QByteArrayView(rhs), cs);
1579}
1580
1581int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs) noexcept
1582{
1583 return lhs.visit([rhs, cs](auto lhs) {
1584 return rhs.visit([lhs, cs](auto rhs) {
1585 return QtPrivate::compareStrings(lhs, rhs, cs);
1586 });
1587 });
1588}
1589
1590// ### Qt 7: do not allow anything but ASCII digits
1591// in arg()'s replacements.
1592#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
1593static bool supportUnicodeDigitValuesInArg()
1594{
1595 static const bool result = []() {
1596 static const char supportUnicodeDigitValuesEnvVar[]
1597 = "QT_USE_UNICODE_DIGIT_VALUES_IN_STRING_ARG";
1598
1599 if (qEnvironmentVariableIsSet(supportUnicodeDigitValuesEnvVar))
1600 return qEnvironmentVariableIntValue(supportUnicodeDigitValuesEnvVar) != 0;
1601
1602#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0) // keep it in sync with the test
1603 return true;
1604#else
1605 return false;
1606#endif
1607 }();
1608
1609 return result;
1610}
1611#endif
1612
1613static int qArgDigitValue(QChar ch) noexcept
1614{
1615#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
1616 if (supportUnicodeDigitValuesInArg())
1617 return ch.digitValue();
1618#endif
1619 if (ch >= u'0' && ch <= u'9')
1620 return int(ch.unicode() - u'0');
1621 return -1;
1622}
1623
1624#if QT_CONFIG(regularexpression)
1625Q_DECL_COLD_FUNCTION
1626static void qtWarnAboutInvalidRegularExpression(const QRegularExpression &re, const char *cls, const char *method)
1627{
1628 extern void qtWarnAboutInvalidRegularExpression(const QString &pattern, const char *cls, const char *method);
1629 qtWarnAboutInvalidRegularExpression(re.pattern(), cls, method);
1630}
1631#endif
1632
1633/*!
1634 \macro QT_RESTRICTED_CAST_FROM_ASCII
1635 \relates QString
1636
1637 Disables most automatic conversions from source literals and 8-bit data
1638 to unicode QStrings, but allows the use of
1639 the \c{QChar(char)} and \c{QString(const char (&ch)[N]} constructors,
1640 and the \c{QString::operator=(const char (&ch)[N])} assignment operator.
1641 This gives most of the type-safety benefits of \l QT_NO_CAST_FROM_ASCII
1642 but does not require user code to wrap character and string literals
1643 with QLatin1Char, QLatin1StringView or similar.
1644
1645 Using this macro together with source strings outside the 7-bit range,
1646 non-literals, or literals with embedded NUL characters is undefined.
1647
1648 \sa QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII
1649*/
1650
1651/*!
1652 \macro QT_NO_CAST_FROM_ASCII
1653 \relates QString
1654 \relates QChar
1655
1656 Disables automatic conversions from 8-bit strings (\c{char *}) to Unicode
1657 QStrings, as well as from 8-bit \c{char} types (\c{char} and
1658 \c{unsigned char}) to QChar.
1659
1660 \sa QT_NO_CAST_TO_ASCII, QT_RESTRICTED_CAST_FROM_ASCII,
1661 QT_NO_CAST_FROM_BYTEARRAY
1662*/
1663
1664/*!
1665 \macro QT_NO_CAST_TO_ASCII
1666 \relates QString
1667
1668 Disables automatic conversion from QString to 8-bit strings (\c{char *}).
1669
1670 \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII,
1671 QT_NO_CAST_FROM_BYTEARRAY
1672*/
1673
1674/*!
1675 \macro QT_ASCII_CAST_WARNINGS
1676 \internal
1677 \relates QString
1678
1679 This macro can be defined to force a warning whenever a function is
1680 called that automatically converts between unicode and 8-bit encodings.
1681
1682 Note: This only works for compilers that support warnings for
1683 deprecated API.
1684
1685 \sa QT_NO_CAST_TO_ASCII, QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
1686*/
1687
1688/*!
1689 \class QString
1690 \inmodule QtCore
1691 \reentrant
1692
1693 \brief The QString class provides a Unicode character string.
1694
1695 \ingroup tools
1696 \ingroup shared
1697 \ingroup string-processing
1698
1699 \compares strong
1700 \compareswith strong QChar QLatin1StringView {const char16_t *} \
1701 QStringView QUtf8StringView
1702 \endcompareswith
1703 \compareswith strong QByteArray QByteArrayView {const char *}
1704 When comparing with byte arrays, their content is interpreted as UTF-8.
1705 \endcompareswith
1706
1707 QString stores a string of 16-bit \l{QChar}s, where each QChar
1708 corresponds to one UTF-16 code unit. (Unicode characters
1709 with code values above 65535 are stored using surrogate pairs,
1710 that is, two consecutive \l{QChar}s.)
1711
1712 \l{Unicode} is an international standard that supports most of the
1713 writing systems in use today. It is a superset of US-ASCII (ANSI
1714 X3.4-1986) and Latin-1 (ISO 8859-1), and all the US-ASCII/Latin-1
1715 characters are available at the same code positions.
1716
1717 Behind the scenes, QString uses \l{implicit sharing}
1718 (copy-on-write) to reduce memory usage and to avoid the needless
1719 copying of data. This also helps reduce the inherent overhead of
1720 storing 16-bit characters instead of 8-bit characters.
1721
1722 In addition to QString, Qt also provides the QByteArray class to
1723 store raw bytes and traditional 8-bit '\\0'-terminated strings.
1724 For most purposes, QString is the class you want to use. It is
1725 used throughout the Qt API, and the Unicode support ensures that
1726 your applications are easy to translate if you want to expand
1727 your application's market at some point. Two prominent cases
1728 where QByteArray is appropriate are when you need to store raw
1729 binary data, and when memory conservation is critical (like in
1730 embedded systems).
1731
1732 \section1 Initializing a string
1733
1734 One way to initialize a QString is to pass a \c{const char
1735 *} to its constructor. For example, the following code creates a
1736 QString of size 5 containing the data "Hello":
1737
1738 \snippet qstring/main.cpp 0
1739
1740 QString converts the \c{const char *} data into Unicode using the
1741 fromUtf8() function.
1742
1743 In all of the QString functions that take \c{const char *}
1744 parameters, the \c{const char *} is interpreted as a classic
1745 C-style \c{'\\0'}-terminated string. Except where the function's
1746 name overtly indicates some other encoding, such \c{const char *}
1747 parameters are assumed to be encoded in UTF-8.
1748
1749 Since Qt 6.4, it is also possible to initialize QStrings using
1750 the \l {Qt::Literals::StringLiterals::operator""_s()} and
1751 \l {Qt::Literals::StringLiterals::operator""_L1()} literal
1752 operators. In many cases, using the literals results in
1753 \l{More efficient string construction}{more efficient string construction}.
1754
1755
1756 You can also provide string data as an array of \l{QChar}s:
1757
1758 \snippet qstring/main.cpp 1
1759
1760 QString makes a deep copy of the QChar data, so you can modify it
1761 later without experiencing side effects. You can avoid taking a
1762 deep copy of the character data by using QStringView or
1763 QString::fromRawData() instead.
1764
1765 Another approach is to set the size of the string using resize()
1766 and to initialize the data character per character. QString uses
1767 0-based indexes, just like C++ arrays. To access the character at
1768 a particular index position, you can use \l operator[](). On
1769 non-\c{const} strings, \l operator[]() returns a reference to a
1770 character that can be used on the left side of an assignment. For
1771 example:
1772
1773 \snippet qstring/main.cpp 2
1774
1775 For read-only access, an alternative syntax is to use the at()
1776 function:
1777
1778 \snippet qstring/main.cpp 3
1779
1780 The at() function can be faster than \l operator[]() because it
1781 never causes a \l{deep copy} to occur. Alternatively, use the
1782 first(), last(), or sliced() functions to extract several characters
1783 at a time.
1784
1785 A QString can embed '\\0' characters (QChar::Null). The size()
1786 function always returns the size of the whole string, including
1787 embedded '\\0' characters.
1788
1789 After a call to the resize() function, newly allocated characters
1790 have undefined values. To set all the characters in the string to
1791 a particular value, use the fill() function.
1792
1793 QString provides dozens of overloads designed to simplify string
1794 usage. For example, if you want to compare a QString with a string
1795 literal, you can write code like this and it will work as expected:
1796
1797 \snippet qstring/main.cpp 4
1798
1799 You can also pass string literals to functions that take QStrings
1800 as arguments, invoking the QString(const char *)
1801 constructor. Similarly, you can pass a QString to a function that
1802 takes a \c{const char *} argument using the \l qPrintable() macro,
1803 which returns the given QString as a \c{const char *}. This is
1804 equivalent to calling toLocal8Bit().\l{QByteArray::}{constData()}
1805 on the QString.
1806
1807 \section1 Manipulating string data
1808
1809 QString provides the following basic functions for modifying the
1810 character data: append(), prepend(), insert(), replace(), and
1811 remove(). For example:
1812
1813 \snippet qstring/main.cpp 5
1814
1815 In the above example, the replace() function's first two arguments are the
1816 position from which to start replacing and the number of characters that
1817 should be replaced.
1818
1819 When data-modifying functions increase the size of the string,
1820 QString may reallocate the memory in which it holds its data. When
1821 this happens, QString expands by more than it immediately needs so as
1822 to have space for further expansion without reallocation until the size
1823 of the string has significantly increased.
1824
1825 The insert(), remove(), and, when replacing a sub-string with one of
1826 different size, replace() functions can be slow (\l{linear time}) for
1827 large strings because they require moving many characters in the string
1828 by at least one position in memory.
1829
1830 If you are building a QString gradually and know in advance
1831 approximately how many characters the QString will contain, you
1832 can call reserve(), asking QString to preallocate a certain amount
1833 of memory. You can also call capacity() to find out how much
1834 memory the QString actually has allocated.
1835
1836 QString provides \l{STL-style iterators} (QString::const_iterator and
1837 QString::iterator). In practice, iterators are handy when working with
1838 generic algorithms provided by the C++ standard library.
1839
1840 \note Iterators over a QString, and references to individual characters
1841 within one, cannot be relied on to remain valid when any non-\c{const}
1842 method of the QString is called. Accessing such an iterator or reference
1843 after the call to a non-\c{const} method leads to undefined behavior. When
1844 stability for iterator-like functionality is required, you should use
1845 indexes instead of iterators, as they are not tied to QString's internal
1846 state and thus do not get invalidated.
1847
1848 \note Due to \l{implicit sharing}, the first non-\c{const} operator or
1849 function used on a given QString may cause it to internally perform a deep
1850 copy of its data. This invalidates all iterators over the string and
1851 references to individual characters within it. Do not call non-const
1852 functions while keeping iterators. Accessing an iterator or reference
1853 after it has been invalidated leads to undefined behavior. See the
1854 \l{Implicit sharing iterator problem} section for more information.
1855
1856 A frequent requirement is to remove or simplify the spacing between
1857 visible characters in a string. The characters that make up that spacing
1858 are those for which \l {QChar::}{isSpace()} returns \c true, such as
1859 the simple space \c{' '}, the horizontal tab \c{'\\t'} and the newline \c{'\\n'}.
1860 To obtain a copy of a string leaving out any spacing from its start and end,
1861 use \l trimmed(). To also replace each sequence of spacing characters within
1862 the string with a simple space, \c{' '}, use \l simplified().
1863
1864 If you want to find all occurrences of a particular character or
1865 substring in a QString, use the indexOf() or lastIndexOf()
1866 functions.The former searches forward, the latter searches backward.
1867 Either can be told an index position from which to start their search.
1868 Each returns the index position of the character or substring if they
1869 find it; otherwise, they return -1. For example, here is a typical loop
1870 that finds all occurrences of a particular substring:
1871
1872 \snippet qstring/main.cpp 6
1873
1874 QString provides many functions for converting numbers into
1875 strings and strings into numbers. See the arg() functions, the
1876 setNum() functions, the number() static functions, and the
1877 toInt(), toDouble(), and similar functions.
1878
1879 To get an uppercase or lowercase version of a string, use toUpper() or
1880 toLower().
1881
1882 Lists of strings are handled by the QStringList class. You can
1883 split a string into a list of strings using the split() function,
1884 and join a list of strings into a single string with an optional
1885 separator using QStringList::join(). You can obtain a filtered list
1886 from a string list by selecting the entries in it that contain a
1887 particular substring or match a particular QRegularExpression.
1888 See QStringList::filter() for details.
1889
1890 \section1 Querying string data
1891
1892 To see if a QString starts or ends with a particular substring, use
1893 startsWith() or endsWith(). To check whether a QString contains a
1894 specific character or substring, use the contains() function. To
1895 find out how many times a particular character or substring occurs
1896 in a string, use count().
1897
1898 To obtain a pointer to the actual character data, call data() or
1899 constData(). These functions return a pointer to the beginning of
1900 the QChar data. The pointer is guaranteed to remain valid until a
1901 non-\c{const} function is called on the QString.
1902
1903 \section2 Comparing strings
1904
1905 QStrings can be compared using overloaded operators such as \l
1906 operator<(), \l operator<=(), \l operator==(), \l operator>=(),
1907 and so on. The comparison is based exclusively on the lexicographical
1908 order of the two strings, seen as sequences of UTF-16 code units.
1909 It is very fast but is not what a human would expect; the
1910 QString::localeAwareCompare() function is usually a better choice for
1911 sorting user-interface strings, when such a comparison is available.
1912
1913 When Qt is linked with the ICU library (which it usually is), its
1914 locale-aware sorting is used. Otherwise, platform-specific solutions
1915 are used:
1916 \list
1917 \li On Windows, localeAwareCompare() uses the current user locale,
1918 as set in the \uicontrol{regional} and \uicontrol{language}
1919 options portion of \uicontrol{Control Panel}.
1920 \li On \macos and iOS, \l localeAwareCompare() compares according
1921 to the \uicontrol{Order for sorted lists} setting in the
1922 \uicontrol{International preferences} panel.
1923 \li On other Unix-like systems, the comparison falls back to the
1924 system library's \c strcoll().
1925 \endlist
1926
1927 \section1 Converting between encoded string data and QString
1928
1929 QString provides the following functions that return a
1930 \c{const char *} version of the string as QByteArray: toUtf8(),
1931 toLatin1(), and toLocal8Bit().
1932
1933 \list
1934 \li toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string.
1935 \li toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a
1936 superset of US-ASCII (ANSI X3.4-1986) that supports the entire
1937 Unicode character set through multibyte sequences.
1938 \li toLocal8Bit() returns an 8-bit string using the system's local
1939 encoding. This is the same as toUtf8() on Unix systems.
1940 \endlist
1941
1942 To convert from one of these encodings, QString provides
1943 fromLatin1(), fromUtf8(), and fromLocal8Bit(). Other
1944 encodings are supported through the QStringEncoder and QStringDecoder
1945 classes.
1946
1947 As mentioned above, QString provides a lot of functions and
1948 operators that make it easy to interoperate with \c{const char *}
1949 strings. But this functionality is a double-edged sword: It makes
1950 QString more convenient to use if all strings are US-ASCII or
1951 Latin-1, but there is always the risk that an implicit conversion
1952 from or to \c{const char *} is done using the wrong 8-bit
1953 encoding. To minimize these risks, you can turn off these implicit
1954 conversions by defining some of the following preprocessor symbols:
1955
1956 \list
1957 \li \l QT_NO_CAST_FROM_ASCII disables automatic conversions from
1958 C string literals and pointers to Unicode.
1959 \li \l QT_RESTRICTED_CAST_FROM_ASCII allows automatic conversions
1960 from C characters and character arrays but disables automatic
1961 conversions from character pointers to Unicode.
1962 \li \l QT_NO_CAST_TO_ASCII disables automatic conversion from QString
1963 to C strings.
1964 \endlist
1965
1966 You then need to explicitly call fromUtf8(), fromLatin1(),
1967 or fromLocal8Bit() to construct a QString from an
1968 8-bit string, or use the lightweight QLatin1StringView class. For
1969 example:
1970
1971 \snippet code/src_corelib_text_qstring.cpp 1
1972
1973 Similarly, you must call toLatin1(), toUtf8(), or
1974 toLocal8Bit() explicitly to convert the QString to an 8-bit
1975 string.
1976
1977 \table 100 %
1978 \header
1979 \li Note for C Programmers
1980
1981 \row
1982 \li
1983 Due to C++'s type system and the fact that QString is
1984 \l{implicitly shared}, QStrings may be treated like \c{int}s or
1985 other basic types. For example:
1986
1987 \snippet qstring/main.cpp 7
1988
1989 The \c result variable is a normal variable allocated on the
1990 stack. When \c return is called, and because we're returning by
1991 value, the copy constructor is called and a copy of the string is
1992 returned. No actual copying takes place thanks to the implicit
1993 sharing.
1994
1995 \endtable
1996
1997 \section1 Distinction between null and empty strings
1998
1999 For historical reasons, QString distinguishes between null
2000 and empty strings. A \e null string is a string that is
2001 initialized using QString's default constructor or by passing
2002 \nullptr to the constructor. An \e empty string is any
2003 string with size 0. A null string is always empty, but an empty
2004 string isn't necessarily null:
2005
2006 \snippet qstring/main.cpp 8
2007
2008 All functions except isNull() treat null strings the same as empty
2009 strings. For example, toUtf8().\l{QByteArray::}{constData()} returns a valid pointer
2010 (not \nullptr) to a '\\0' character for a null string. We
2011 recommend that you always use the isEmpty() function and avoid isNull().
2012
2013 \section1 Number formats
2014
2015 When a QString::arg() \c{'%'} format specifier includes the \c{'L'} locale
2016 qualifier, and the base is ten (its default), the default locale is
2017 used. This can be set using \l{QLocale::setDefault()}. For more refined
2018 control of localized string representations of numbers, see
2019 QLocale::toString(). All other number formatting done by QString follows the
2020 C locale's representation of numbers.
2021
2022 When QString::arg() applies left-padding to numbers, the fill character
2023 \c{'0'} is treated specially. If the number is negative, its minus sign
2024 appears before the zero-padding. If the field is localized, the
2025 locale-appropriate zero character is used in place of \c{'0'}. For
2026 floating-point numbers, this special treatment only applies if the number is
2027 finite.
2028
2029 \section2 Floating-point formats
2030
2031 In member functions (for example, arg() and number()) that format floating-point
2032 numbers (\c float or \c double) as strings, the representation used can be
2033 controlled by a choice of \e format and \e precision, whose meanings are as
2034 for \l {QLocale::toString(double, char, int)}.
2035
2036 If the selected \e format includes an exponent, localized forms follow the
2037 locale's convention on digits in the exponent. For non-localized formatting,
2038 the exponent shows its sign and includes at least two digits, left-padding
2039 with zero if needed.
2040
2041 \section1 More efficient string construction
2042
2043 Many strings are known at compile time. The QString constructor from
2044 C++ string literals will copy the contents of the string,
2045 treating the contents as UTF-8. This requires memory allocation and
2046 re-encoding string data, operations that will happen at runtime.
2047 If the string data is known at compile time, you can use the QStringLiteral
2048 macro or similarly \c{operator""_s} to create QString's payload at compile
2049 time instead.
2050
2051 Using the QString \c{'+'} operator, it is easy to construct a
2052 complex string from multiple substrings. You will often write code
2053 like this:
2054
2055 \snippet qstring/stringbuilder.cpp 0
2056
2057 There is nothing wrong with either of these string constructions,
2058 but there are a few hidden inefficiencies:
2059
2060 First, repeated use of the \c{'+'} operator may lead to
2061 multiple memory allocations. When concatenating \e{n} substrings,
2062 where \e{n > 2}, there can be as many as \e{n - 1} calls to the
2063 memory allocator.
2064
2065 These allocations can be optimized by an internal class
2066 \c{QStringBuilder}. This class is marked
2067 internal and does not appear in the documentation, because you
2068 aren't meant to instantiate it in your code. Its use will be
2069 automatic, as described below.
2070
2071 \c{QStringBuilder} uses expression templates and reimplements the
2072 \c{'%'} operator so that when you use \c{'%'} for string
2073 concatenation instead of \c{'+'}, multiple substring
2074 concatenations will be postponed until the final result is about
2075 to be assigned to a QString. At this point, the amount of memory
2076 required for the final result is known. The memory allocator is
2077 then called \e{once} to get the required space, and the substrings
2078 are copied into it one by one.
2079
2080 Additional efficiency is gained by inlining and reducing reference
2081 counting (the QString created from a \c{QStringBuilder}
2082 has a ref count of 1, whereas QString::append() needs an extra
2083 test).
2084
2085 There are two ways you can access this improved method of string
2086 construction. The straightforward way is to include
2087 \c{QStringBuilder} wherever you want to use it and use the
2088 \c{'%'} operator instead of \c{'+'} when concatenating strings:
2089
2090 \snippet qstring/stringbuilder.cpp 5
2091
2092 A more global approach, which is more convenient but not entirely
2093 source-compatible, is to define \c QT_USE_QSTRINGBUILDER (by adding
2094 it to the compiler flags) at build time. This will make concatenating
2095 strings with \c{'+'} work the same way as \c{QStringBuilder's} \c{'%'}.
2096
2097 \note Using automatic type deduction (for example, by using the \c
2098 auto keyword) with the result of string concatenation when QStringBuilder
2099 is enabled will show that the concatenation is indeed an object of a
2100 QStringBuilder specialization:
2101
2102 \snippet qstring/stringbuilder.cpp 6
2103
2104 This does not cause any harm, as QStringBuilder will implicitly convert to
2105 QString when required. If this is undesirable, then one should specify
2106 the necessary types instead of having the compiler deduce them:
2107
2108 \snippet qstring/stringbuilder.cpp 7
2109
2110 \section1 Maximum size and out-of-memory conditions
2111
2112 The maximum size of QString depends on the architecture. Most 64-bit
2113 systems can allocate more than 2 GB of memory, with a typical limit
2114 of 2^63 bytes. The actual value also depends on the overhead required for
2115 managing the data block. As a result, you can expect a maximum size
2116 of 2 GB minus overhead on 32-bit platforms and 2^63 bytes minus overhead
2117 on 64-bit platforms. The number of elements that can be stored in a
2118 QString is this maximum size divided by the size of QChar.
2119
2120 When memory allocation fails, QString throws a \c std::bad_alloc
2121 exception if the application was compiled with exception support.
2122 Out-of-memory conditions in Qt containers are the only cases where Qt
2123 will throw exceptions. If exceptions are disabled, then running out of
2124 memory is undefined behavior.
2125
2126 \note Target operating systems may impose limits on how much memory an
2127 application can allocate, in total, or on the size of individual allocations.
2128 This may further restrict the size of string a QString can hold.
2129 Mitigating or controlling the behavior these limits cause is beyond the
2130 scope of the Qt API.
2131
2132 \sa {Which string class to use?}, fromRawData(), QChar, QStringView,
2133 QLatin1StringView, QByteArray
2134*/
2135
2136/*! \typedef QString::ConstIterator
2137
2138 Qt-style synonym for QString::const_iterator.
2139*/
2140
2141/*! \typedef QString::Iterator
2142
2143 Qt-style synonym for QString::iterator.
2144*/
2145
2146/*! \typedef QString::const_iterator
2147
2148 \sa QString::iterator
2149*/
2150
2151/*! \typedef QString::iterator
2152
2153 \sa QString::const_iterator
2154*/
2155
2156/*! \typedef QString::const_reverse_iterator
2157 \since 5.6
2158
2159 \sa QString::reverse_iterator, QString::const_iterator
2160*/
2161
2162/*! \typedef QString::reverse_iterator
2163 \since 5.6
2164
2165 \sa QString::const_reverse_iterator, QString::iterator
2166*/
2167
2168/*!
2169 \typedef QString::size_type
2170*/
2171
2172/*!
2173 \typedef QString::difference_type
2174*/
2175
2176/*!
2177 \typedef QString::const_reference
2178*/
2179/*!
2180 \typedef QString::reference
2181*/
2182
2183/*!
2184 \typedef QString::const_pointer
2185
2186 The QString::const_pointer typedef provides an STL-style
2187 const pointer to a QString element (QChar).
2188*/
2189/*!
2190 \typedef QString::pointer
2191
2192 The QString::pointer typedef provides an STL-style
2193 pointer to a QString element (QChar).
2194*/
2195
2196/*!
2197 \typedef QString::value_type
2198*/
2199
2200/*! \fn QString::iterator QString::begin()
2201
2202 Returns an \l{STL-style iterators}{STL-style iterator} pointing to the
2203 first character in the string.
2204
2205//! [iterator-invalidation-func-desc]
2206 \warning The returned iterator is invalidated on detachment or when the
2207 QString is modified.
2208//! [iterator-invalidation-func-desc]
2209
2210 \sa constBegin(), end()
2211*/
2212
2213/*! \fn QString::const_iterator QString::begin() const
2214
2215 \overload begin()
2216*/
2217
2218/*! \fn QString::const_iterator QString::cbegin() const
2219 \since 5.0
2220
2221 Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
2222 first character in the string.
2223
2224 \include qstring.cpp iterator-invalidation-func-desc
2225
2226 \sa begin(), cend()
2227*/
2228
2229/*! \fn QString::const_iterator QString::constBegin() const
2230
2231 Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the
2232 first character in the string.
2233
2234 \include qstring.cpp iterator-invalidation-func-desc
2235
2236 \sa begin(), constEnd()
2237*/
2238
2239/*! \fn QString::iterator QString::end()
2240
2241 Returns an \l{STL-style iterators}{STL-style iterator} pointing just after
2242 the last character in the string.
2243
2244 \include qstring.cpp iterator-invalidation-func-desc
2245
2246 \sa begin(), constEnd()
2247*/
2248
2249/*! \fn QString::const_iterator QString::end() const
2250
2251 \overload end()
2252*/
2253
2254/*! \fn QString::const_iterator QString::cend() const
2255 \since 5.0
2256
2257 Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
2258 after the last character in the string.
2259
2260 \include qstring.cpp iterator-invalidation-func-desc
2261
2262 \sa cbegin(), end()
2263*/
2264
2265/*! \fn QString::const_iterator QString::constEnd() const
2266
2267 Returns a const \l{STL-style iterators}{STL-style iterator} pointing just
2268 after the last character in the string.
2269
2270 \include qstring.cpp iterator-invalidation-func-desc
2271
2272 \sa constBegin(), end()
2273*/
2274
2275/*! \fn QString::reverse_iterator QString::rbegin()
2276 \since 5.6
2277
2278 Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to
2279 the first character in the string, in reverse order.
2280
2281 \include qstring.cpp iterator-invalidation-func-desc
2282
2283 \sa begin(), crbegin(), rend()
2284*/
2285
2286/*! \fn QString::const_reverse_iterator QString::rbegin() const
2287 \since 5.6
2288 \overload
2289*/
2290
2291/*! \fn QString::const_reverse_iterator QString::crbegin() const
2292 \since 5.6
2293
2294 Returns a const \l{STL-style iterators}{STL-style} reverse iterator
2295 pointing to the first character in the string, in reverse order.
2296
2297 \include qstring.cpp iterator-invalidation-func-desc
2298
2299 \sa begin(), rbegin(), rend()
2300*/
2301
2302/*! \fn QString::reverse_iterator QString::rend()
2303 \since 5.6
2304
2305 Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
2306 after the last character in the string, in reverse order.
2307
2308 \include qstring.cpp iterator-invalidation-func-desc
2309
2310 \sa end(), crend(), rbegin()
2311*/
2312
2313/*! \fn QString::const_reverse_iterator QString::rend() const
2314 \since 5.6
2315 \overload
2316*/
2317
2318/*! \fn QString::const_reverse_iterator QString::crend() const
2319 \since 5.6
2320
2321 Returns a const \l{STL-style iterators}{STL-style} reverse iterator
2322 pointing just after the last character in the string, in reverse order.
2323
2324 \include qstring.cpp iterator-invalidation-func-desc
2325
2326 \sa end(), rend(), rbegin()
2327*/
2328
2329/*!
2330 \fn QString::QString()
2331
2332 Constructs a null string. Null strings are also considered empty.
2333
2334 \sa isEmpty(), isNull(), {Distinction Between Null and Empty Strings}
2335*/
2336
2337/*!
2338 \fn QString::QString(QString &&other)
2339
2340 Move-constructs a QString instance, making it point at the same
2341 object that \a other was pointing to.
2342
2343 \since 5.2
2344*/
2345
2346/*! \fn QString::QString(const char *str)
2347
2348 Constructs a string initialized with the 8-bit string \a str. The
2349 given const char pointer is converted to Unicode using the
2350 fromUtf8() function.
2351
2352 You can disable this constructor by defining
2353 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
2354 can be useful if you want to ensure that all user-visible strings
2355 go through QObject::tr(), for example.
2356
2357 \note Defining \l QT_RESTRICTED_CAST_FROM_ASCII also disables
2358 this constructor, but enables a \c{QString(const char (&ch)[N])}
2359 constructor instead. Using non-literal input, or input with
2360 embedded NUL characters, or non-7-bit characters is undefined
2361 in this case.
2362
2363 \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
2364*/
2365
2366/*! \fn QString::QString(const char8_t *str)
2367
2368 Constructs a string initialized with the UTF-8 string \a str. The
2369 given const char8_t pointer is converted to Unicode using the
2370 fromUtf8() function.
2371
2372 \since 6.1
2373 \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
2374*/
2375
2376/*!
2377 \fn QString::QString(QStringView sv)
2378
2379 Constructs a string initialized with the string view's data.
2380
2381 The QString will be null if and only if \a sv is null.
2382
2383 \since 6.8
2384
2385 \sa fromUtf16()
2386*/
2387
2388/*
2389//! [from-std-string]
2390Returns a copy of the \a str string. The given string is assumed to be
2391encoded in \1, and is converted to QString using the \2 function.
2392//! [from-std-string]
2393*/
2394
2395/*! \fn QString QString::fromStdString(const std::string &str)
2396
2397 \include qstring.cpp {from-std-string} {UTF-8} {fromUtf8()}
2398
2399 \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QByteArray::fromStdString()
2400*/
2401
2402/*! \fn QString QString::fromStdWString(const std::wstring &str)
2403
2404 Returns a copy of the \a str string. The given string is assumed
2405 to be encoded in utf16 if the size of wchar_t is 2 bytes (e.g. on
2406 windows) and ucs4 if the size of wchar_t is 4 bytes (most Unix
2407 systems).
2408
2409 \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(),
2410 fromStdU16String(), fromStdU32String()
2411*/
2412
2413/*! \fn QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
2414 \since 4.2
2415
2416 Reads the first \a size code units of the \c wchar_t array to whose start
2417 \a string points, converting them to Unicode and returning the result as
2418 a QString. The encoding used by \c wchar_t is assumed to be UTF-32 if the
2419 type's size is four bytes or UTF-16 if its size is two bytes.
2420
2421 If \a size is -1 (default), the \a string must be '\\0'-terminated.
2422
2423 \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(),
2424 fromStdWString()
2425*/
2426
2427/*! \fn std::wstring QString::toStdWString() const
2428
2429 Returns a std::wstring object with the data contained in this
2430 QString. The std::wstring is encoded in UTF-16 on platforms where
2431 wchar_t is 2 bytes wide (for example, Windows) and in UTF-32 on platforms
2432 where wchar_t is 4 bytes wide (most Unix systems).
2433
2434 This method is mostly useful to pass a QString to a function
2435 that accepts a std::wstring object.
2436
2437 \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit(), toStdU16String(),
2438 toStdU32String()
2439*/
2440
2441qsizetype QString::toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out)
2442{
2443 qsizetype count = 0;
2444
2445 QStringIterator i(QStringView(uc, length));
2446 while (i.hasNext())
2447 out[count++] = i.next();
2448
2449 return count;
2450}
2451
2452/*! \fn qsizetype QString::toWCharArray(wchar_t *array) const
2453 \since 4.2
2454
2455 Fills the \a array with the data contained in this QString object.
2456 The array is encoded in UTF-16 on platforms where
2457 wchar_t is 2 bytes wide (e.g. windows) and in UTF-32 on platforms
2458 where wchar_t is 4 bytes wide (most Unix systems).
2459
2460 \a array has to be allocated by the caller and contain enough space to
2461 hold the complete string (allocating the array with the same length as the
2462 string is always sufficient).
2463
2464 This function returns the actual length of the string in \a array.
2465
2466 \note This function does not append a null character to the array.
2467
2468 \sa utf16(), toUcs4(), toLatin1(), toUtf8(), toLocal8Bit(), toStdWString(),
2469 QStringView::toWCharArray()
2470*/
2471
2472/*! \fn QString::QString(const QString &other)
2473
2474 Constructs a copy of \a other.
2475
2476 This operation takes \l{constant time}, because QString is
2477 \l{implicitly shared}. This makes returning a QString from a
2478 function very fast. If a shared instance is modified, it will be
2479 copied (copy-on-write), and that takes \l{linear time}.
2480
2481 \sa operator=()
2482*/
2483
2484/*!
2485 Constructs a string initialized with the first \a size characters
2486 of the QChar array \a unicode.
2487
2488 If \a unicode is 0, a null string is constructed.
2489
2490 If \a size is negative, \a unicode is assumed to point to a '\\0'-terminated
2491 array and its length is determined dynamically. The terminating
2492 null character is not considered part of the string.
2493
2494 QString makes a deep copy of the string data. The unicode data is copied as
2495 is and the Byte Order Mark is preserved if present.
2496
2497 \sa fromRawData()
2498*/
2499QString::QString(const QChar *unicode, qsizetype size)
2500{
2501 if (!unicode) {
2502 d.clear();
2503 } else {
2504 if (size < 0)
2505 size = QtPrivate::qustrlen(reinterpret_cast<const char16_t *>(unicode));
2506 if (!size) {
2507 d = DataPointer::fromRawData(&_empty, 0);
2508 } else {
2509 d = DataPointer(size, size);
2510 Q_CHECK_PTR(d.data());
2511 memcpy(d.data(), unicode, size * sizeof(QChar));
2512 d.data()[size] = '\0';
2513 }
2514 }
2515}
2516
2517/*!
2518 Constructs a string of the given \a size with every character set
2519 to \a ch.
2520
2521 \sa fill()
2522*/
2523QString::QString(qsizetype size, QChar ch)
2524{
2525 if (size <= 0) {
2526 d = DataPointer::fromRawData(&_empty, 0);
2527 } else {
2528 d = DataPointer(size, size);
2529 Q_CHECK_PTR(d.data());
2530 d.data()[size] = '\0';
2531 char16_t *b = d.data();
2532 char16_t *e = d.data() + size;
2533 const char16_t value = ch.unicode();
2534 std::fill(b, e, value);
2535 }
2536}
2537
2538/*! \fn QString::QString(qsizetype size, Qt::Initialization)
2539 \internal
2540
2541 Constructs a string of the given \a size without initializing the
2542 characters. This is only used in \c QStringBuilder::toString().
2543*/
2544QString::QString(qsizetype size, Qt::Initialization)
2545{
2546 if (size <= 0) {
2547 d = DataPointer::fromRawData(&_empty, 0);
2548 } else {
2549 d = DataPointer(size, size);
2550 Q_CHECK_PTR(d.data());
2551 d.data()[size] = '\0';
2552 }
2553}
2554
2555/*! \fn QString::QString(QLatin1StringView str)
2556
2557 Constructs a copy of the Latin-1 string viewed by \a str.
2558
2559 \sa fromLatin1()
2560*/
2561
2562/*!
2563 Constructs a string of size 1 containing the character \a ch.
2564*/
2565QString::QString(QChar ch)
2566{
2567 d = DataPointer(1, 1);
2568 Q_CHECK_PTR(d.data());
2569 d.data()[0] = ch.unicode();
2570 d.data()[1] = '\0';
2571}
2572
2573/*! \fn QString::QString(const QByteArray &ba)
2574
2575 Constructs a string initialized with the byte array \a ba. The
2576 given byte array is converted to Unicode using fromUtf8().
2577
2578 You can disable this constructor by defining
2579 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
2580 can be useful if you want to ensure that all user-visible strings
2581 go through QObject::tr(), for example.
2582
2583 \note Any null ('\\0') bytes in the byte array will be included in this
2584 string, converted to Unicode null characters (U+0000). This behavior is
2585 different from Qt 5.x.
2586
2587 \sa fromLatin1(), fromLocal8Bit(), fromUtf8()
2588*/
2589
2590/*! \fn QString::QString(const Null &)
2591 \internal
2592*/
2593
2594/*! \fn QString::QString(QStringPrivate)
2595 \internal
2596*/
2597
2598/*! \fn QString &QString::operator=(const QString::Null &)
2599 \internal
2600*/
2601
2602/*!
2603 \fn QString::~QString()
2604
2605 Destroys the string.
2606*/
2607
2608
2609/*! \fn void QString::swap(QString &other)
2610 \since 4.8
2611 \memberswap{string}
2612*/
2613
2614/*! \fn void QString::detach()
2615
2616 Ensures that this string's data is no longer
2617 \l{Implicit Sharing}{shared} with other instances.
2618*/
2619
2620/*! \fn bool QString::isDetached() const
2621
2622 \internal
2623*/
2624
2625/*! \fn bool QString::isSharedWith(const QString &other) const
2626
2627 \internal
2628*/
2629
2630/*! \fn QString::operator std::u16string_view() const
2631 \target qstring-operator-std-u16string_view
2632 \since 6.7
2633
2634 Converts this QString object to a \c{std::u16string_view} object.
2635*/
2636
2637static bool needsReallocate(const QString &str, qsizetype newSize)
2638{
2639 const auto capacityAtEnd = str.capacity() - str.data_ptr().freeSpaceAtBegin();
2640 return newSize > capacityAtEnd;
2641}
2642
2643/*!
2644 Sets the size of the string to \a size characters.
2645
2646 If \a size is greater than the current size, the string is
2647 extended to make it \a size characters long with the extra
2648 characters added to the end. The new characters are uninitialized.
2649
2650 If \a size is less than the current size, characters beyond position
2651 \a size are excluded from the string.
2652
2653 \note While resize() will grow the capacity if needed, it never shrinks
2654 capacity. To shed excess capacity, use squeeze().
2655
2656 Example:
2657
2658 \snippet qstring/main.cpp 45
2659
2660 If you want to append a certain number of identical characters to
2661 the string, use the \l {QString::}{resize(qsizetype, QChar)} overload.
2662
2663 If you want to expand the string so that it reaches a certain
2664 width and fill the new positions with a particular character, use
2665 the leftJustified() function:
2666
2667 If \a size is negative, it is equivalent to passing zero.
2668
2669 \snippet qstring/main.cpp 47
2670
2671 \sa truncate(), reserve(), squeeze()
2672*/
2673
2674void QString::resize(qsizetype size)
2675{
2676 if (size < 0)
2677 size = 0;
2678
2679 if (d.needsDetach() || needsReallocate(*this, size))
2680 reallocData(size, QArrayData::Grow);
2681 d.size = size;
2682 if (d.allocatedCapacity())
2683 d.data()[size] = u'\0';
2684}
2685
2686/*!
2687 \overload
2688 \since 5.7
2689
2690 Unlike \l {QString::}{resize(qsizetype)}, this overload
2691 initializes the new characters to \a fillChar:
2692
2693 \snippet qstring/main.cpp 46
2694*/
2695
2696void QString::resize(qsizetype newSize, QChar fillChar)
2697{
2698 const qsizetype oldSize = size();
2699 resize(newSize);
2700 const qsizetype difference = size() - oldSize;
2701 if (difference > 0)
2702 std::fill_n(d.data() + oldSize, difference, fillChar.unicode());
2703}
2704
2705
2706/*!
2707 \since 6.8
2708
2709 Sets the size of the string to \a size characters. If the size of
2710 the string grows, the new characters are uninitialized.
2711
2712 The behavior is identical to \c{resize(size)}.
2713
2714 \sa resize()
2715*/
2716
2717void QString::resizeForOverwrite(qsizetype size)
2718{
2719 resize(size);
2720}
2721
2722
2723/*! \fn qsizetype QString::capacity() const
2724
2725 Returns the maximum number of characters that can be stored in
2726 the string without forcing a reallocation.
2727
2728 The sole purpose of this function is to provide a means of fine
2729 tuning QString's memory usage. In general, you will rarely ever
2730 need to call this function. If you want to know how many
2731 characters are in the string, call size().
2732
2733 \note a statically allocated string will report a capacity of 0,
2734 even if it's not empty.
2735
2736 \note The free space position in the allocated memory block is undefined. In
2737 other words, one should not assume that the free memory is always located
2738 after the initialized elements.
2739
2740 \sa reserve(), squeeze()
2741*/
2742
2743/*!
2744 \fn void QString::reserve(qsizetype size)
2745
2746 Ensures the string has space for at least \a size characters.
2747
2748 If you know in advance how large a string will be, you can call this
2749 function to save repeated reallocation while building it.
2750 This can improve performance when building a string incrementally.
2751 A long sequence of operations that add to a string may trigger several
2752 reallocations, the last of which may leave you with significantly more
2753 space than you need. This is less efficient than doing a single
2754 allocation of the right size at the start.
2755
2756 If in doubt about how much space shall be needed, it is usually better to
2757 use an upper bound as \a size, or a high estimate of the most likely size,
2758 if a strict upper bound would be much bigger than this. If \a size is an
2759 underestimate, the string will grow as needed once the reserved size is
2760 exceeded, which may lead to a larger allocation than your best
2761 overestimate would have and will slow the operation that triggers it.
2762
2763 \warning reserve() reserves memory but does not change the size of the
2764 string. Accessing data beyond the end of the string is undefined behavior.
2765 If you need to access memory beyond the current end of the string,
2766 use resize().
2767
2768 This function is useful for code that needs to build up a long
2769 string and wants to avoid repeated reallocation. In this example,
2770 we want to add to the string until some condition is \c true, and
2771 we're fairly sure that size is large enough to make a call to
2772 reserve() worthwhile:
2773
2774 \snippet qstring/main.cpp 44
2775
2776 \sa squeeze(), capacity(), resize()
2777*/
2778
2779/*!
2780 \fn void QString::squeeze()
2781
2782 Releases any memory not required to store the character data.
2783
2784 The sole purpose of this function is to provide a means of fine
2785 tuning QString's memory usage. In general, you will rarely ever
2786 need to call this function.
2787
2788 \sa reserve(), capacity()
2789*/
2790
2791void QString::reallocData(qsizetype alloc, QArrayData::AllocationOption option)
2792{
2793 if (!alloc) {
2794 d = DataPointer::fromRawData(&_empty, 0);
2795 return;
2796 }
2797
2798 // don't use reallocate path when reducing capacity and there's free space
2799 // at the beginning: might shift data pointer outside of allocated space
2800 const bool cannotUseReallocate = d.freeSpaceAtBegin() > 0;
2801
2802 if (d.needsDetach() || cannotUseReallocate) {
2803 DataPointer dd(alloc, qMin(alloc, d.size), option);
2804 Q_CHECK_PTR(dd.data());
2805 if (dd.size > 0)
2806 ::memcpy(dd.data(), d.data(), dd.size * sizeof(QChar));
2807 dd.data()[dd.size] = 0;
2808 d.swap(dd);
2809 } else {
2810 d->reallocate(alloc, option);
2811 }
2812}
2813
2814void QString::reallocGrowData(qsizetype n)
2815{
2816 if (!n) // expected to always allocate
2817 n = 1;
2818
2819 if (d.needsDetach()) {
2820 DataPointer dd(DataPointer::allocateGrow(d, n, QArrayData::GrowsAtEnd));
2821 Q_CHECK_PTR(dd.data());
2822 dd->copyAppend(d.data(), d.data() + d.size);
2823 dd.data()[dd.size] = 0;
2824 d.swap(dd);
2825 } else {
2826 d->reallocate(d.constAllocatedCapacity() + n, QArrayData::Grow);
2827 }
2828}
2829
2830/*! \fn void QString::clear()
2831
2832 Clears the contents of the string and makes it null.
2833
2834 \sa resize(), isNull()
2835*/
2836
2837/*! \fn QString &QString::operator=(const QString &other)
2838
2839 Assigns \a other to this string and returns a reference to this
2840 string.
2841*/
2842
2843QString &QString::operator=(const QString &other) noexcept
2844{
2845 d = other.d;
2846 return *this;
2847}
2848
2849/*!
2850 \fn QString &QString::operator=(QString &&other)
2851
2852 Move-assigns \a other to this QString instance.
2853
2854 \since 5.2
2855*/
2856
2857/*! \fn QString &QString::operator=(QLatin1StringView str)
2858
2859 \overload operator=()
2860
2861 Assigns the Latin-1 string viewed by \a str to this string.
2862*/
2863QString &QString::operator=(QLatin1StringView other)
2864{
2865 const qsizetype capacityAtEnd = capacity() - d.freeSpaceAtBegin();
2866 if (isDetached() && other.size() <= capacityAtEnd) { // assumes d.alloc == 0 -> !isDetached() (sharedNull)
2867 d.size = other.size();
2868 d.data()[other.size()] = 0;
2869 qt_from_latin1(d.data(), other.latin1(), other.size());
2870 } else {
2871 *this = fromLatin1(other.latin1(), other.size());
2872 }
2873 return *this;
2874}
2875
2876/*! \fn QString &QString::operator=(const QByteArray &ba)
2877
2878 \overload operator=()
2879
2880 Assigns \a ba to this string. The byte array is converted to Unicode
2881 using the fromUtf8() function.
2882
2883 You can disable this operator by defining
2884 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
2885 can be useful if you want to ensure that all user-visible strings
2886 go through QObject::tr(), for example.
2887*/
2888
2889/*! \fn QString &QString::operator=(const char *str)
2890
2891 \overload operator=()
2892
2893 Assigns \a str to this string. The const char pointer is converted
2894 to Unicode using the fromUtf8() function.
2895
2896 You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
2897 or \l QT_RESTRICTED_CAST_FROM_ASCII when you compile your applications.
2898 This can be useful if you want to ensure that all user-visible strings
2899 go through QObject::tr(), for example.
2900*/
2901
2902/*!
2903 \overload operator=()
2904
2905 Sets the string to contain the single character \a ch.
2906*/
2907QString &QString::operator=(QChar ch)
2908{
2909 return assign(1, ch);
2910}
2911
2912/*!
2913 \fn QString& QString::insert(qsizetype position, const QString &str)
2914
2915 Inserts the string \a str at the given index \a position and
2916 returns a reference to this string.
2917
2918 Example:
2919
2920 \snippet qstring/main.cpp 26
2921
2922//! [string-grow-at-insertion]
2923 This string grows to accommodate the insertion. If \a position is beyond
2924 the end of the string, space characters are appended to the string to reach
2925 this \a position, followed by \a str.
2926//! [string-grow-at-insertion]
2927
2928 \sa append(), prepend(), replace(), remove()
2929*/
2930
2931/*!
2932 \fn QString& QString::insert(qsizetype position, QStringView str)
2933 \since 6.0
2934 \overload insert()
2935
2936 Inserts the string view \a str at the given index \a position and
2937 returns a reference to this string.
2938
2939 \include qstring.cpp string-grow-at-insertion
2940*/
2941
2942
2943/*!
2944 \fn QString& QString::insert(qsizetype position, const char *str)
2945 \since 5.5
2946 \overload insert()
2947
2948 Inserts the C string \a str at the given index \a position and
2949 returns a reference to this string.
2950
2951 \include qstring.cpp string-grow-at-insertion
2952
2953 This function is not available when \l QT_NO_CAST_FROM_ASCII is
2954 defined.
2955*/
2956
2957/*!
2958 \fn QString& QString::insert(qsizetype position, const QByteArray &str)
2959 \since 5.5
2960 \overload insert()
2961
2962 Interprets the contents of \a str as UTF-8, inserts the Unicode string
2963 it encodes at the given index \a position and returns a reference to
2964 this string.
2965
2966 \include qstring.cpp string-grow-at-insertion
2967
2968 This function is not available when \l QT_NO_CAST_FROM_ASCII is
2969 defined.
2970*/
2971
2972/*! \internal
2973 T is a view or a container on/of QChar, char16_t, or char
2974*/
2975template <typename T>
2976static void insert_helper(QString &str, qsizetype i, const T &toInsert)
2977{
2978 auto &str_d = str.data_ptr();
2979 qsizetype difference = 0;
2980 if (Q_UNLIKELY(i > str_d.size))
2981 difference = i - str_d.size;
2982 const qsizetype oldSize = str_d.size;
2983 const qsizetype insert_size = toInsert.size();
2984 const qsizetype newSize = str_d.size + difference + insert_size;
2985 const auto side = i == 0 ? QArrayData::GrowsAtBeginning : QArrayData::GrowsAtEnd;
2986
2987 if (str_d.needsDetach() || needsReallocate(str, newSize)) {
2988 const auto cbegin = str.cbegin();
2989 const auto cend = str.cend();
2990 const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend;
2991 QString other;
2992 // Using detachAndGrow() so that prepend optimization works and QStringBuilder
2993 // unittests pass
2994 other.data_ptr().detachAndGrow(side, newSize, nullptr, nullptr);
2995 other.append(QStringView(cbegin, insert_start));
2996 other.resize(i, u' ');
2997 other.append(toInsert);
2998 other.append(QStringView(insert_start, cend));
2999 str.swap(other);
3000 return;
3001 }
3002
3003 str_d.detachAndGrow(side, difference + insert_size, nullptr, nullptr);
3004 Q_CHECK_PTR(str_d.data());
3005 str.resize(newSize);
3006
3007 auto begin = str_d.begin();
3008 auto old_end = std::next(begin, oldSize);
3009 std::fill_n(old_end, difference, u' ');
3010 auto insert_start = std::next(begin, i);
3011 if (difference == 0)
3012 std::move_backward(insert_start, old_end, str_d.end());
3013
3014 using Char = std::remove_cv_t<typename T::value_type>;
3015 if constexpr(std::is_same_v<Char, QChar>)
3016 std::copy_n(reinterpret_cast<const char16_t *>(toInsert.data()), insert_size, insert_start);
3017 else if constexpr (std::is_same_v<Char, char16_t>)
3018 std::copy_n(toInsert.data(), insert_size, insert_start);
3019 else if constexpr (std::is_same_v<Char, char>)
3020 qt_from_latin1(insert_start, toInsert.data(), insert_size);
3021}
3022
3023/*!
3024 \fn QString &QString::insert(qsizetype position, QLatin1StringView str)
3025 \overload insert()
3026
3027 Inserts the Latin-1 string viewed by \a str at the given index \a position.
3028
3029 \include qstring.cpp string-grow-at-insertion
3030*/
3031QString &QString::insert(qsizetype i, QLatin1StringView str)
3032{
3033 const char *s = str.latin1();
3034 if (i < 0 || !s || !(*s))
3035 return *this;
3036
3037 insert_helper(*this, i, str);
3038 return *this;
3039}
3040
3041/*!
3042 \fn QString &QString::insert(qsizetype position, QUtf8StringView str)
3043 \overload insert()
3044 \since 6.5
3045
3046 Inserts the UTF-8 string view \a str at the given index \a position.
3047
3048 \note Inserting variable-width UTF-8-encoded string data is conceptually slower
3049 than inserting fixed-width string data such as UTF-16 (QStringView) or Latin-1
3050 (QLatin1StringView) and should thus be used sparingly.
3051
3052 \include qstring.cpp string-grow-at-insertion
3053*/
3054QString &QString::insert(qsizetype i, QUtf8StringView s)
3055{
3056 auto insert_size = s.size();
3057 if (i < 0 || insert_size <= 0)
3058 return *this;
3059
3060 qsizetype difference = 0;
3061 if (Q_UNLIKELY(i > d.size))
3062 difference = i - d.size;
3063
3064 const qsizetype newSize = d.size + difference + insert_size;
3065
3066 if (d.needsDetach() || needsReallocate(*this, newSize)) {
3067 const auto cbegin = this->cbegin();
3068 const auto insert_start = difference == 0 ? std::next(cbegin, i) : cend();
3069 QString other;
3070 other.reserve(newSize);
3071 other.append(QStringView(cbegin, insert_start));
3072 if (difference > 0)
3073 other.resize(i, u' ');
3074 other.append(s);
3075 other.append(QStringView(insert_start, cend()));
3076 swap(other);
3077 return *this;
3078 }
3079
3080 if (i >= d.size) {
3081 d.detachAndGrow(QArrayData::GrowsAtEnd, difference + insert_size, nullptr, nullptr);
3082 Q_CHECK_PTR(d.data());
3083
3084 if (difference > 0)
3085 resize(i, u' ');
3086 append(s);
3087 } else {
3088 // Optimal insertion of Utf8 data is at the end, anywhere else could
3089 // potentially lead to moving characters twice if Utf8 data size
3090 // (variable-width) is less than the equivalent Utf16 data size
3091 QVarLengthArray<char16_t> buffer(insert_size); // ### optimize (QTBUG-108546)
3092 char16_t *b = QUtf8::convertToUnicode(buffer.data(), s);
3093 insert_helper(*this, i, QStringView(buffer.data(), b));
3094 }
3095
3096 return *this;
3097}
3098
3099/*!
3100 \fn QString& QString::insert(qsizetype position, const QChar *unicode, qsizetype size)
3101 \overload insert()
3102
3103 Inserts the first \a size characters of the QChar array \a unicode
3104 at the given index \a position in the string.
3105
3106 This string grows to accommodate the insertion. If \a position is beyond
3107 the end of the string, space characters are appended to the string to reach
3108 this \a position, followed by \a size characters of the QChar array
3109 \a unicode.
3110*/
3111QString& QString::insert(qsizetype i, const QChar *unicode, qsizetype size)
3112{
3113 if (i < 0 || size <= 0)
3114 return *this;
3115
3116 // In case when data points into "this"
3117 if (!d.needsDetach() && QtPrivate::q_points_into_range(unicode, *this)) {
3118 QVarLengthArray copy(unicode, unicode + size);
3119 insert(i, copy.data(), size);
3120 } else {
3121 insert_helper(*this, i, QStringView(unicode, size));
3122 }
3123
3124 return *this;
3125}
3126
3127/*!
3128 \fn QString& QString::insert(qsizetype position, QChar ch)
3129 \overload insert()
3130
3131 Inserts \a ch at the given index \a position in the string.
3132
3133 This string grows to accommodate the insertion. If \a position is beyond
3134 the end of the string, space characters are appended to the string to reach
3135 this \a position, followed by \a ch.
3136*/
3137
3138QString& QString::insert(qsizetype i, QChar ch)
3139{
3140 if (i < 0)
3141 i += d.size;
3142 return insert(i, &ch, 1);
3143}
3144
3145/*!
3146 Appends the string \a str onto the end of this string.
3147
3148 Example:
3149
3150 \snippet qstring/main.cpp 9
3151
3152 This is the same as using the insert() function:
3153
3154 \snippet qstring/main.cpp 10
3155
3156 The append() function is typically very fast (\l{constant time}),
3157 because QString preallocates extra space at the end of the string
3158 data so it can grow without reallocating the entire string each
3159 time.
3160
3161 \sa operator+=(), prepend(), insert()
3162*/
3163QString &QString::append(const QString &str)
3164{
3165 if (!str.isNull()) {
3166 if (isNull()) {
3167 if (Q_UNLIKELY(!str.d.isMutable()))
3168 assign(str); // fromRawData, so we do a deep copy
3169 else
3170 operator=(str);
3171 } else if (str.size()) {
3172 append(str.constData(), str.size());
3173 }
3174 }
3175 return *this;
3176}
3177
3178/*!
3179 \fn QString &QString::append(QStringView v)
3180 \overload append()
3181 \since 6.0
3182
3183 Appends the given string view \a v to this string and returns the result.
3184*/
3185
3186/*!
3187 \overload append()
3188 \since 5.0
3189
3190 Appends \a len characters from the QChar array \a str to this string.
3191*/
3192QString &QString::append(const QChar *str, qsizetype len)
3193{
3194 if (str && len > 0) {
3195 static_assert(sizeof(QChar) == sizeof(char16_t), "Unexpected difference in sizes");
3196 // the following should be safe as QChar uses char16_t as underlying data
3197 const char16_t *char16String = reinterpret_cast<const char16_t *>(str);
3198 d->growAppend(char16String, char16String + len);
3199 d.data()[d.size] = u'\0';
3200 }
3201 return *this;
3202}
3203
3204/*!
3205 \overload append()
3206
3207 Appends the Latin-1 string viewed by \a str to this string.
3208*/
3209QString &QString::append(QLatin1StringView str)
3210{
3211 append_helper(*this, str);
3212 return *this;
3213}
3214
3215/*!
3216 \overload append()
3217 \since 6.5
3218
3219 Appends the UTF-8 string view \a str to this string.
3220*/
3221QString &QString::append(QUtf8StringView str)
3222{
3223 append_helper(*this, str);
3224 return *this;
3225}
3226
3227/*! \fn QString &QString::append(const QByteArray &ba)
3228
3229 \overload append()
3230
3231 Appends the byte array \a ba to this string. The given byte array
3232 is converted to Unicode using the fromUtf8() function.
3233
3234 You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
3235 when you compile your applications. This can be useful if you want
3236 to ensure that all user-visible strings go through QObject::tr(),
3237 for example.
3238*/
3239
3240/*! \fn QString &QString::append(const char *str)
3241
3242 \overload append()
3243
3244 Appends the string \a str to this string. The given const char
3245 pointer is converted to Unicode using the fromUtf8() function.
3246
3247 You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
3248 when you compile your applications. This can be useful if you want
3249 to ensure that all user-visible strings go through QObject::tr(),
3250 for example.
3251*/
3252
3253/*!
3254 \overload append()
3255
3256 Appends the character \a ch to this string.
3257*/
3258QString &QString::append(QChar ch)
3259{
3260 d.detachAndGrow(QArrayData::GrowsAtEnd, 1, nullptr, nullptr);
3261 d->copyAppend(1, ch.unicode());
3262 d.data()[d.size] = '\0';
3263 return *this;
3264}
3265
3266/*! \fn QString &QString::prepend(const QString &str)
3267
3268 Prepends the string \a str to the beginning of this string and
3269 returns a reference to this string.
3270
3271 This operation is typically very fast (\l{constant time}), because
3272 QString preallocates extra space at the beginning of the string data,
3273 so it can grow without reallocating the entire string each time.
3274
3275 Example:
3276
3277 \snippet qstring/main.cpp 36
3278
3279 \sa append(), insert()
3280*/
3281
3282/*! \fn QString &QString::prepend(QLatin1StringView str)
3283
3284 \overload prepend()
3285
3286 Prepends the Latin-1 string viewed by \a str to this string.
3287*/
3288
3289/*! \fn QString &QString::prepend(QUtf8StringView str)
3290 \since 6.5
3291 \overload prepend()
3292
3293 Prepends the UTF-8 string view \a str to this string.
3294*/
3295
3296/*! \fn QString &QString::prepend(const QChar *str, qsizetype len)
3297 \since 5.5
3298 \overload prepend()
3299
3300 Prepends \a len characters from the QChar array \a str to this string and
3301 returns a reference to this string.
3302*/
3303
3304/*! \fn QString &QString::prepend(QStringView str)
3305 \since 6.0
3306 \overload prepend()
3307
3308 Prepends the string view \a str to the beginning of this string and
3309 returns a reference to this string.
3310*/
3311
3312/*! \fn QString &QString::prepend(const QByteArray &ba)
3313
3314 \overload prepend()
3315
3316 Prepends the byte array \a ba to this string. The byte array is
3317 converted to Unicode using the fromUtf8() function.
3318
3319 You can disable this function by defining
3320 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
3321 can be useful if you want to ensure that all user-visible strings
3322 go through QObject::tr(), for example.
3323*/
3324
3325/*! \fn QString &QString::prepend(const char *str)
3326
3327 \overload prepend()
3328
3329 Prepends the string \a str to this string. The const char pointer
3330 is converted to Unicode using the fromUtf8() function.
3331
3332 You can disable this function by defining
3333 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
3334 can be useful if you want to ensure that all user-visible strings
3335 go through QObject::tr(), for example.
3336*/
3337
3338/*! \fn QString &QString::prepend(QChar ch)
3339
3340 \overload prepend()
3341
3342 Prepends the character \a ch to this string.
3343*/
3344
3345/*!
3346 \fn QString &QString::assign(QAnyStringView v)
3347 \since 6.6
3348
3349 Replaces the contents of this string with a copy of \a v and returns a
3350 reference to this string.
3351
3352 The size of this string will be equal to the size of \a v, converted to
3353 UTF-16 as if by \c{v.toString()}. Unlike QAnyStringView::toString(), however,
3354 this function only allocates memory if the estimated size exceeds the capacity
3355 of this string or this string is shared.
3356
3357 \sa QAnyStringView::toString()
3358*/
3359
3360/*!
3361 \fn QString &QString::assign(qsizetype n, QChar c)
3362 \since 6.6
3363
3364 Replaces the contents of this string with \a n copies of \a c and
3365 returns a reference to this string.
3366
3367 The size of this string will be equal to \a n, which has to be non-negative.
3368
3369 This function will only allocate memory if \a n exceeds the capacity of this
3370 string or this string is shared.
3371
3372 \sa fill()
3373*/
3374
3375/*!
3376 \fn template <typename InputIterator, QString::if_compatible_iterator<InputIterator>> QString &QString::assign(InputIterator first, InputIterator last)
3377 \since 6.6
3378
3379 Replaces the contents of this string with a copy of the elements in the
3380 iterator range [\a first, \a last) and returns a reference to this string.
3381
3382 The size of this string will be equal to the decoded length of the elements
3383 in the range [\a first, \a last), which need not be the same as the length of
3384 the range itself, because this function transparently recodes the input
3385 character set to UTF-16.
3386
3387 This function will only allocate memory if the number of elements in the
3388 range, or, for non-UTF-16-encoded input, the maximum possible size of the
3389 resulting string, exceeds the capacity of this string, or if this string is
3390 shared.
3391
3392 \note The behavior is undefined if either argument is an iterator into *this or
3393 [\a first, \a last) is not a valid range.
3394
3395 \constraints
3396 \c InputIterator meets the requirements of a
3397 \l {https://en.cppreference.com/w/cpp/named_req/InputIterator} {LegacyInputIterator}
3398 and the \c{value_type} of \c InputIterator is one of the following character types:
3399 \list
3400 \li QChar
3401 \li QLatin1Char
3402 \li \c {char}
3403 \li \c {unsigned char}
3404 \li \c {signed char}
3405 \li \c {char8_t}
3406 \li \c char16_t
3407 \li (on platforms, such as Windows, where it is a 16-bit type) \c wchar_t
3408 \li \c char32_t
3409 \endlist
3410*/
3411
3412QString &QString::assign(QAnyStringView s)
3413{
3414 if (s.size() <= capacity() && isDetached()) {
3415 const auto offset = d.freeSpaceAtBegin();
3416 if (offset)
3417 d.setBegin(d.begin() - offset);
3418 resize(0);
3419 s.visit([this](auto input) {
3420 this->append(input);
3421 });
3422 } else {
3423 *this = s.toString();
3424 }
3425 return *this;
3426}
3427
3428#ifndef QT_BOOTSTRAPPED
3429QString &QString::assign_helper(const char32_t *data, qsizetype len)
3430{
3431 // worst case: each char32_t requires a surrogate pair, so
3432 const auto requiredCapacity = len * 2;
3433 if (requiredCapacity <= capacity() && isDetached()) {
3434 const auto offset = d.freeSpaceAtBegin();
3435 if (offset)
3436 d.setBegin(d.begin() - offset);
3437 auto begin = reinterpret_cast<QChar *>(d.begin());
3438 auto ba = QByteArrayView(reinterpret_cast<const std::byte*>(data), len * sizeof(char32_t));
3439 QStringConverter::State state;
3440 const auto end = QUtf32::convertToUnicode(begin, ba, &state, DetectEndianness);
3441 d.size = end - begin;
3442 d.data()[d.size] = u'\0';
3443 } else {
3444 *this = QString::fromUcs4(data, len);
3445 }
3446 return *this;
3447}
3448#endif
3449
3450/*!
3451 \fn QString &QString::remove(qsizetype position, qsizetype n)
3452
3453 Removes \a n characters from the string, starting at the given \a
3454 position index, and returns a reference to the string.
3455
3456 If the specified \a position index is within the string, but \a
3457 position + \a n is beyond the end of the string, the string is
3458 truncated at the specified \a position.
3459
3460 If \a n is <= 0 nothing is changed.
3461
3462 \snippet qstring/main.cpp 37
3463
3464//! [shrinking-erase]
3465 Element removal will preserve the string's capacity and not reduce the
3466 amount of allocated memory. To shed extra capacity and free as much memory
3467 as possible, call squeeze() after the last change to the string's size.
3468//! [shrinking-erase]
3469
3470 \sa insert(), replace()
3471*/
3472QString &QString::remove(qsizetype pos, qsizetype len)
3473{
3474 if (pos < 0) // count from end of string
3475 pos += size();
3476
3477 if (size_t(pos) >= size_t(size()) || len <= 0)
3478 return *this;
3479
3480 len = std::min(len, size() - pos);
3481
3482 if (!d.isShared()) {
3483 d->erase(d.begin() + pos, len);
3484 d.data()[d.size] = u'\0';
3485 } else {
3486 // TODO: either reserve "size()", which is bigger than needed, or
3487 // modify the shrinking-erase docs of this method (since the size
3488 // of "copy" won't have any extra capacity any more)
3489 const qsizetype sz = size() - len;
3490 QString copy{sz, Qt::Uninitialized};
3491 auto begin = d.begin();
3492 auto toRemove_start = d.begin() + pos;
3493 copy.d->copyRanges({{begin, toRemove_start},
3494 {toRemove_start + len, d.end()}});
3495 swap(copy);
3496 }
3497 return *this;
3498}
3499
3500template<typename T>
3501static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs)
3502{
3503 const auto needleSize = needle.size();
3504 if (!needleSize)
3505 return;
3506
3507 // avoid detach if nothing to do:
3508 qsizetype i = s.indexOf(needle, 0, cs);
3509 if (i < 0)
3510 return;
3511
3512 QString::DataPointer &dptr = s.data_ptr();
3513 auto begin = dptr.begin();
3514 auto end = dptr.end();
3515
3516 auto copyFunc = [&](auto &dst) {
3517 auto src = begin + i + needleSize;
3518 while (src < end) {
3519 i = s.indexOf(needle, std::distance(begin, src), cs);
3520 auto hit = i == -1 ? end : begin + i;
3521 dst = std::copy(src, hit, dst);
3522 src = hit + needleSize;
3523 }
3524 return dst;
3525 };
3526
3527 if (!dptr.needsDetach()) {
3528 auto dst = begin + i;
3529 dst = copyFunc(dst);
3530 s.truncate(std::distance(begin, dst));
3531 } else {
3532 QString copy{s.size(), Qt::Uninitialized};
3533 auto copy_begin = copy.begin();
3534 auto dst = std::copy(begin, begin + i, copy_begin); // Chunk before the first hit
3535 dst = copyFunc(dst);
3536 copy.resize(std::distance(copy_begin, dst));
3537 s.swap(copy);
3538 }
3539}
3540
3541/*!
3542 Removes every occurrence of the given \a str string in this
3543 string, and returns a reference to this string.
3544
3545 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3546
3547 This is the same as \c replace(str, "", cs).
3548
3549 \include qstring.cpp shrinking-erase
3550
3551 \sa replace()
3552*/
3553QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
3554{
3555 const auto s = str.d.data();
3556 if (QtPrivate::q_points_into_range(s, d))
3557 removeStringImpl(*this, QStringView{QVarLengthArray(s, s + str.size())}, cs);
3558 else
3559 removeStringImpl(*this, qToStringViewIgnoringNull(str), cs);
3560 return *this;
3561}
3562
3563/*!
3564 \since 5.11
3565 \overload
3566
3567 Removes every occurrence of the given Latin-1 string viewed by \a str
3568 from this string, and returns a reference to this string.
3569
3570 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3571
3572 This is the same as \c replace(str, "", cs).
3573
3574 \include qstring.cpp shrinking-erase
3575
3576 \sa replace()
3577*/
3578QString &QString::remove(QLatin1StringView str, Qt::CaseSensitivity cs)
3579{
3580 removeStringImpl(*this, str, cs);
3581 return *this;
3582}
3583
3584/*!
3585 \fn QString &QString::removeAt(qsizetype pos)
3586
3587 \since 6.5
3588
3589 Removes the character at index \a pos. If \a pos is out of bounds
3590 (i.e. \a pos >= size()), this function does nothing.
3591
3592 \sa remove()
3593*/
3594
3595/*!
3596 \fn QString &QString::removeFirst()
3597
3598 \since 6.5
3599
3600 Removes the first character in this string. If the string is empty,
3601 this function does nothing.
3602
3603 \sa remove()
3604*/
3605
3606/*!
3607 \fn QString &QString::removeLast()
3608
3609 \since 6.5
3610
3611 Removes the last character in this string. If the string is empty,
3612 this function does nothing.
3613
3614 \sa remove()
3615*/
3616
3617/*!
3618 Removes every occurrence of the character \a ch in this string, and
3619 returns a reference to this string.
3620
3621 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3622
3623 Example:
3624
3625 \snippet qstring/main.cpp 38
3626
3627 This is the same as \c replace(ch, "", cs).
3628
3629 \include qstring.cpp shrinking-erase
3630
3631 \sa replace()
3632*/
3633QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
3634{
3635 const qsizetype idx = indexOf(ch, 0, cs);
3636 if (idx == -1)
3637 return *this;
3638
3639 const bool isCase = cs == Qt::CaseSensitive;
3640 ch = isCase ? ch : ch.toCaseFolded();
3641 auto match = [ch, isCase](QChar x) {
3642 return ch == (isCase ? x : x.toCaseFolded());
3643 };
3644
3645
3646 auto begin = d.begin();
3647 auto first_match = begin + idx;
3648 auto end = d.end();
3649 if (!d.isShared()) {
3650 auto it = std::remove_if(first_match, end, match);
3651 d->erase(it, std::distance(it, end));
3652 d.data()[d.size] = u'\0';
3653 } else {
3654 // Instead of detaching, create a new string and copy all characters except for
3655 // the ones we're removing
3656 // TODO: size() is more than the needed since "copy" would be shorter
3657 QString copy{size(), Qt::Uninitialized};
3658 auto dst = copy.d.begin();
3659 auto it = std::copy(begin, first_match, dst); // Chunk before idx
3660 it = std::remove_copy_if(first_match + 1, end, it, match);
3661 copy.d.size = std::distance(dst, it);
3662 copy.d.data()[copy.d.size] = u'\0';
3663 *this = std::move(copy);
3664 }
3665 return *this;
3666}
3667
3668/*!
3669 \fn QString &QString::remove(const QRegularExpression &re)
3670 \since 5.0
3671
3672 Removes every occurrence of the regular expression \a re in the
3673 string, and returns a reference to the string. For example:
3674
3675 \snippet qstring/main.cpp 96
3676
3677 \include qstring.cpp shrinking-erase
3678
3679 \sa indexOf(), lastIndexOf(), replace()
3680*/
3681
3682/*!
3683 \fn template <typename Predicate> QString &QString::removeIf(Predicate pred)
3684 \since 6.1
3685
3686 Removes all elements for which the predicate \a pred returns true
3687 from the string. Returns a reference to the string.
3688
3689 \sa remove()
3690*/
3691
3692static void replace_helper(QString &str, QSpan<qsizetype> indices, qsizetype blen, QStringView after)
3693{
3694 const qsizetype oldSize = str.data_ptr().size;
3695 const qsizetype adjust = indices.size() * (after.size() - blen);
3696 const qsizetype newSize = oldSize + adjust;
3697 using A = QStringAlgorithms<QString>;
3698 if (str.data_ptr().needsDetach() || needsReallocate(str, newSize)) {
3699 A::replace_helper(str, blen, after, indices);
3700 return;
3701 }
3702
3703 if (QtPrivate::q_points_into_range(after.begin(), str)) {
3704 // Copy after if it lies inside our own d.b area (which we could
3705 // possibly invalidate via a realloc or modify by replacement)
3706 A::replace_helper(str, blen, QVarLengthArray(after.begin(), after.end()), indices);
3707 } else {
3708 A::replace_helper(str, blen, after, indices);
3709 }
3710}
3711
3712/*!
3713 \fn QString &QString::replace(qsizetype position, qsizetype n, const QString &after)
3714
3715 Replaces \a n characters beginning at index \a position with
3716 the string \a after and returns a reference to this string.
3717
3718 \note If the specified \a position index is within the string,
3719 but \a position + \a n goes outside the strings range,
3720 then \a n will be adjusted to stop at the end of the string.
3721
3722 Example:
3723
3724 \snippet qstring/main.cpp 40
3725
3726 \sa insert(), remove()
3727*/
3728QString &QString::replace(qsizetype pos, qsizetype len, const QString &after)
3729{
3730 return replace(pos, len, after.constData(), after.size());
3731}
3732
3733/*!
3734 \fn QString &QString::replace(qsizetype position, qsizetype n, const QChar *after, qsizetype alen)
3735 \overload replace()
3736 Replaces \a n characters beginning at index \a position with the
3737 first \a alen characters of the QChar array \a after and returns a
3738 reference to this string.
3739
3740 \a n must not be negative.
3741*/
3742QString &QString::replace(qsizetype pos, qsizetype len, const QChar *after, qsizetype alen)
3743{
3744 Q_PRE(len >= 0);
3745
3746 if (size_t(pos) > size_t(this->size()))
3747 return *this;
3748 if (len > this->size() - pos)
3749 len = this->size() - pos;
3750
3751 qsizetype indices[] = {pos};
3752 replace_helper(*this, indices, len, QStringView{after, alen});
3753 return *this;
3754}
3755
3756/*!
3757 \fn QString &QString::replace(qsizetype position, qsizetype n, QChar after)
3758 \overload replace()
3759
3760 Replaces \a n characters beginning at index \a position with the
3761 character \a after and returns a reference to this string.
3762*/
3763QString &QString::replace(qsizetype pos, qsizetype len, QChar after)
3764{
3765 return replace(pos, len, &after, 1);
3766}
3767
3768/*!
3769 \overload replace()
3770 Replaces every occurrence of the string \a before with the string \a
3771 after and returns a reference to this string.
3772
3773 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3774
3775 Example:
3776
3777 \snippet qstring/main.cpp 41
3778
3779 \note The replacement text is not rescanned after it is inserted.
3780
3781 Example:
3782
3783 \snippet qstring/main.cpp 86
3784
3785//! [empty-before-arg-in-replace]
3786 \note If you use an empty \a before argument, the \a after argument will be
3787 inserted \e {before and after} each character of the string.
3788//! [empty-before-arg-in-replace]
3789
3790*/
3791QString &QString::replace(const QString &before, const QString &after, Qt::CaseSensitivity cs)
3792{
3793 return replace(before.constData(), before.size(), after.constData(), after.size(), cs);
3794}
3795
3796/*!
3797 \since 4.5
3798 \overload replace()
3799
3800 Replaces each occurrence in this string of the first \a blen
3801 characters of \a before with the first \a alen characters of \a
3802 after and returns a reference to this string.
3803
3804 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3805
3806 \note If \a before points to an \e empty string (that is, \a blen == 0),
3807 the string pointed to by \a after will be inserted \e {before and after}
3808 each character in this string.
3809*/
3810QString &QString::replace(const QChar *before, qsizetype blen,
3811 const QChar *after, qsizetype alen,
3812 Qt::CaseSensitivity cs)
3813{
3814 if (isEmpty()) {
3815 if (blen)
3816 return *this;
3817 } else {
3818 if (cs == Qt::CaseSensitive && before == after && blen == alen)
3819 return *this;
3820 }
3821 if (alen == 0 && blen == 0)
3822 return *this;
3823 if (alen == 1 && blen == 1)
3824 return replace(*before, *after, cs);
3825
3826 QStringMatcher matcher(before, blen, cs);
3827
3828 qsizetype index = 0;
3829
3830 QVarLengthArray<qsizetype> indices;
3831 while ((index = matcher.indexIn(*this, index)) != -1) {
3832 indices.push_back(index);
3833 if (blen) // Step over before:
3834 index += blen;
3835 else // Only count one instance of empty between any two characters:
3836 index++;
3837 }
3838 if (indices.isEmpty())
3839 return *this;
3840
3841 replace_helper(*this, indices, blen, QStringView{after, alen});
3842 return *this;
3843}
3844
3845/*!
3846 \overload replace()
3847 Replaces every occurrence of the character \a ch in the string with
3848 \a after and returns a reference to this string.
3849
3850 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3851*/
3852QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
3853{
3854 if (after.size() == 0)
3855 return remove(ch, cs);
3856
3857 if (after.size() == 1)
3858 return replace(ch, after.front(), cs);
3859
3860 if (size() == 0)
3861 return *this;
3862
3863 const char16_t cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
3864
3865 QVarLengthArray<qsizetype> indices;
3866 if (cs == Qt::CaseSensitive) {
3867 const char16_t *begin = d.begin();
3868 const char16_t *end = d.end();
3869 QStringView view(begin, end);
3870 const char16_t *hit = nullptr;
3871 while ((hit = QtPrivate::qustrchr(view, cc)) != end) {
3872 indices.push_back(std::distance(begin, hit));
3873 view = QStringView(std::next(hit), end);
3874 }
3875 } else {
3876 for (qsizetype i = 0; i < d.size; ++i)
3877 if (QChar::toCaseFolded(d.data()[i]) == cc)
3878 indices.push_back(i);
3879 }
3880 if (indices.isEmpty())
3881 return *this;
3882
3883 replace_helper(*this, indices, 1, after);
3884 return *this;
3885}
3886
3887/*!
3888 \overload replace()
3889 Replaces every occurrence of the character \a before with the
3890 character \a after and returns a reference to this string.
3891
3892 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3893*/
3894QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
3895{
3896 const qsizetype idx = indexOf(before, 0, cs);
3897 if (idx == -1)
3898 return *this;
3899
3900 const char16_t achar = after.unicode();
3901 char16_t bchar = before.unicode();
3902
3903 auto matchesCIS = [](char16_t beforeChar) {
3904 return [beforeChar](char16_t ch) { return foldAndCompare(ch, beforeChar); };
3905 };
3906
3907 auto hit = d.begin() + idx;
3908 if (!d.needsDetach()) {
3909 *hit++ = achar;
3910 if (cs == Qt::CaseSensitive) {
3911 std::replace(hit, d.end(), bchar, achar);
3912 } else {
3913 bchar = foldCase(bchar);
3914 std::replace_if(hit, d.end(), matchesCIS(bchar), achar);
3915 }
3916 } else {
3917 QString other{ d.size, Qt::Uninitialized };
3918 auto dest = std::copy(d.begin(), hit, other.d.begin());
3919 *dest++ = achar;
3920 ++hit;
3921 if (cs == Qt::CaseSensitive) {
3922 std::replace_copy(hit, d.end(), dest, bchar, achar);
3923 } else {
3924 bchar = foldCase(bchar);
3925 std::replace_copy_if(hit, d.end(), dest, matchesCIS(bchar), achar);
3926 }
3927
3928 swap(other);
3929 }
3930 return *this;
3931}
3932
3933/*!
3934 \since 4.5
3935 \overload replace()
3936
3937 Replaces every occurrence in this string of the Latin-1 string viewed
3938 by \a before with the Latin-1 string viewed by \a after, and returns a
3939 reference to this string.
3940
3941 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3942
3943 \note The text is not rescanned after a replacement.
3944
3945 \include qstring.cpp empty-before-arg-in-replace
3946*/
3947QString &QString::replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs)
3948{
3949 const qsizetype alen = after.size();
3950 const qsizetype blen = before.size();
3951 if (blen == 1 && alen == 1)
3952 return replace(before.front(), after.front(), cs);
3953
3954 QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
3955 QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
3956 return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs);
3957}
3958
3959/*!
3960 \since 4.5
3961 \overload replace()
3962
3963 Replaces every occurrence in this string of the Latin-1 string viewed
3964 by \a before with the string \a after, and returns a reference to this
3965 string.
3966
3967 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3968
3969 \note The text is not rescanned after a replacement.
3970
3971 \include qstring.cpp empty-before-arg-in-replace
3972*/
3973QString &QString::replace(QLatin1StringView before, const QString &after, Qt::CaseSensitivity cs)
3974{
3975 const qsizetype blen = before.size();
3976 if (blen == 1 && after.size() == 1)
3977 return replace(before.front(), after.front(), cs);
3978
3979 QVarLengthArray<char16_t> b = qt_from_latin1_to_qvla(before);
3980 return replace((const QChar *)b.data(), blen, after.constData(), after.d.size, cs);
3981}
3982
3983/*!
3984 \since 4.5
3985 \overload replace()
3986
3987 Replaces every occurrence of the string \a before with the string \a
3988 after and returns a reference to this string.
3989
3990 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
3991
3992 \note The text is not rescanned after a replacement.
3993
3994 \include qstring.cpp empty-before-arg-in-replace
3995*/
3996QString &QString::replace(const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs)
3997{
3998 const qsizetype alen = after.size();
3999 if (before.size() == 1 && alen == 1)
4000 return replace(before.front(), after.front(), cs);
4001
4002 QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
4003 return replace(before.constData(), before.d.size, (const QChar *)a.data(), alen, cs);
4004}
4005
4006/*!
4007 \since 4.5
4008 \overload replace()
4009
4010 Replaces every occurrence of the character \a c with the string \a
4011 after and returns a reference to this string.
4012
4013 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4014
4015 \note The text is not rescanned after a replacement.
4016*/
4017QString &QString::replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs)
4018{
4019 const qsizetype alen = after.size();
4020 if (alen == 1)
4021 return replace(c, after.front(), cs);
4022
4023 QVarLengthArray<char16_t> a = qt_from_latin1_to_qvla(after);
4024 return replace(&c, 1, (const QChar *)a.data(), alen, cs);
4025}
4026
4027/*!
4028 \fn bool QString::operator==(const QString &lhs, const QString &rhs)
4029 \overload operator==()
4030
4031 Returns \c true if string \a lhs is equal to string \a rhs; otherwise
4032 returns \c false.
4033
4034 \include qstring.cpp compare-isNull-vs-isEmpty
4035
4036 \sa {Comparing Strings}
4037*/
4038
4039/*!
4040 \fn bool QString::operator==(const QString &lhs, const QLatin1StringView &rhs)
4041
4042 \overload operator==()
4043
4044 Returns \c true if \a lhs is equal to \a rhs; otherwise
4045 returns \c false.
4046*/
4047
4048/*!
4049 \fn bool QString::operator==(const QLatin1StringView &lhs, const QString &rhs)
4050
4051 \overload operator==()
4052
4053 Returns \c true if \a lhs is equal to \a rhs; otherwise
4054 returns \c false.
4055*/
4056
4057/*! \fn bool QString::operator==(const QString &lhs, const QByteArray &rhs)
4058
4059 \overload operator==()
4060
4061 The \a rhs byte array is converted to a QUtf8StringView.
4062
4063 You can disable this operator by defining
4064 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4065 can be useful if you want to ensure that all user-visible strings
4066 go through QObject::tr(), for example.
4067
4068 Returns \c true if string \a lhs is lexically equal to \a rhs.
4069 Otherwise returns \c false.
4070*/
4071
4072/*! \fn bool QString::operator==(const QString &lhs, const char * const &rhs)
4073
4074 \overload operator==()
4075
4076 The \a rhs const char pointer is converted to a QUtf8StringView.
4077
4078 You can disable this operator by defining
4079 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4080 can be useful if you want to ensure that all user-visible strings
4081 go through QObject::tr(), for example.
4082*/
4083
4084/*!
4085 \fn bool QString::operator<(const QString &lhs, const QString &rhs)
4086
4087 \overload operator<()
4088
4089 Returns \c true if string \a lhs is lexically less than string
4090 \a rhs; otherwise returns \c false.
4091
4092 \sa {Comparing Strings}
4093*/
4094
4095/*!
4096 \fn bool QString::operator<(const QString &lhs, const QLatin1StringView &rhs)
4097
4098 \overload operator<()
4099
4100 Returns \c true if \a lhs is lexically less than \a rhs;
4101 otherwise returns \c false.
4102*/
4103
4104/*!
4105 \fn bool QString::operator<(const QLatin1StringView &lhs, const QString &rhs)
4106
4107 \overload operator<()
4108
4109 Returns \c true if \a lhs is lexically less than \a rhs;
4110 otherwise returns \c false.
4111*/
4112
4113/*! \fn bool QString::operator<(const QString &lhs, const QByteArray &rhs)
4114
4115 \overload operator<()
4116
4117 The \a rhs byte array is converted to a QUtf8StringView.
4118 If any NUL characters ('\\0') are embedded in the byte array, they will be
4119 included in the transformation.
4120
4121 You can disable this operator
4122 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4123 can be useful if you want to ensure that all user-visible strings
4124 go through QObject::tr(), for example.
4125*/
4126
4127/*! \fn bool QString::operator<(const QString &lhs, const char * const &rhs)
4128
4129 Returns \c true if string \a lhs is lexically less than string \a rhs.
4130 Otherwise returns \c false.
4131
4132 \overload operator<()
4133
4134 The \a rhs const char pointer is converted to a QUtf8StringView.
4135
4136 You can disable this operator by defining
4137 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4138 can be useful if you want to ensure that all user-visible strings
4139 go through QObject::tr(), for example.
4140*/
4141
4142/*! \fn bool QString::operator<=(const QString &lhs, const QString &rhs)
4143
4144 Returns \c true if string \a lhs is lexically less than or equal to
4145 string \a rhs; otherwise returns \c false.
4146
4147 \sa {Comparing Strings}
4148*/
4149
4150/*!
4151 \fn bool QString::operator<=(const QString &lhs, const QLatin1StringView &rhs)
4152
4153 \overload operator<=()
4154
4155 Returns \c true if \a lhs is lexically less than or equal to \a rhs;
4156 otherwise returns \c false.
4157*/
4158
4159/*!
4160 \fn bool QString::operator<=(const QLatin1StringView &lhs, const QString &rhs)
4161
4162 \overload operator<=()
4163
4164 Returns \c true if \a lhs is lexically less than or equal to \a rhs;
4165 otherwise returns \c false.
4166*/
4167
4168/*! \fn bool QString::operator<=(const QString &lhs, const QByteArray &rhs)
4169
4170 \overload operator<=()
4171
4172 The \a rhs byte array is converted to a QUtf8StringView.
4173 If any NUL characters ('\\0') are embedded in the byte array, they will be
4174 included in the transformation.
4175
4176 You can disable this operator by defining
4177 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4178 can be useful if you want to ensure that all user-visible strings
4179 go through QObject::tr(), for example.
4180*/
4181
4182/*! \fn bool QString::operator<=(const QString &lhs, const char * const &rhs)
4183
4184 \overload operator<=()
4185
4186 The \a rhs const char pointer is converted to a QUtf8StringView.
4187
4188 You can disable this operator by defining
4189 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4190 can be useful if you want to ensure that all user-visible strings
4191 go through QObject::tr(), for example.
4192*/
4193
4194/*! \fn bool QString::operator>(const QString &lhs, const QString &rhs)
4195
4196 Returns \c true if string \a lhs is lexically greater than string \a rhs;
4197 otherwise returns \c false.
4198
4199 \sa {Comparing Strings}
4200*/
4201
4202/*!
4203 \fn bool QString::operator>(const QString &lhs, const QLatin1StringView &rhs)
4204
4205 \overload operator>()
4206
4207 Returns \c true if \a lhs is lexically greater than \a rhs;
4208 otherwise returns \c false.
4209*/
4210
4211/*!
4212 \fn bool QString::operator>(const QLatin1StringView &lhs, const QString &rhs)
4213
4214 \overload operator>()
4215
4216 Returns \c true if \a lhs is lexically greater than \a rhs;
4217 otherwise returns \c false.
4218*/
4219
4220/*! \fn bool QString::operator>(const QString &lhs, const QByteArray &rhs)
4221
4222 \overload operator>()
4223
4224 The \a rhs byte array is converted to a QUtf8StringView.
4225 If any NUL characters ('\\0') are embedded in the byte array, they will be
4226 included in the transformation.
4227
4228 You can disable this operator by defining
4229 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4230 can be useful if you want to ensure that all user-visible strings
4231 go through QObject::tr(), for example.
4232*/
4233
4234/*! \fn bool QString::operator>(const QString &lhs, const char * const &rhs)
4235
4236 \overload operator>()
4237
4238 The \a rhs const char pointer is converted to a QUtf8StringView.
4239
4240 You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
4241 when you compile your applications. This can be useful if you want
4242 to ensure that all user-visible strings go through QObject::tr(),
4243 for example.
4244*/
4245
4246/*! \fn bool QString::operator>=(const QString &lhs, const QString &rhs)
4247
4248 Returns \c true if string \a lhs is lexically greater than or equal to
4249 string \a rhs; otherwise returns \c false.
4250
4251 \sa {Comparing Strings}
4252*/
4253
4254/*!
4255 \fn bool QString::operator>=(const QString &lhs, const QLatin1StringView &rhs)
4256
4257 \overload operator>=()
4258
4259 Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
4260 otherwise returns \c false.
4261*/
4262
4263/*!
4264 \fn bool QString::operator>=(const QLatin1StringView &lhs, const QString &rhs)
4265
4266 \overload operator>=()
4267
4268 Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
4269 otherwise returns \c false.
4270*/
4271
4272/*! \fn bool QString::operator>=(const QString &lhs, const QByteArray &rhs)
4273
4274 \overload operator>=()
4275
4276 The \a rhs byte array is converted to a QUtf8StringView.
4277 If any NUL characters ('\\0') are embedded in the byte array, they will be
4278 included in the transformation.
4279
4280 You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
4281 when you compile your applications. This can be useful if you want
4282 to ensure that all user-visible strings go through QObject::tr(),
4283 for example.
4284*/
4285
4286/*! \fn bool QString::operator>=(const QString &lhs, const char * const &rhs)
4287
4288 \overload operator>=()
4289
4290 The \a rhs const char pointer is converted to a QUtf8StringView.
4291
4292 You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
4293 when you compile your applications. This can be useful if you want
4294 to ensure that all user-visible strings go through QObject::tr(),
4295 for example.
4296*/
4297
4298/*! \fn bool QString::operator!=(const QString &lhs, const QString &rhs)
4299
4300 Returns \c true if string \a lhs is not equal to string \a rhs;
4301 otherwise returns \c false.
4302
4303 \sa {Comparing Strings}
4304*/
4305
4306/*! \fn bool QString::operator!=(const QString &lhs, const QLatin1StringView &rhs)
4307
4308 Returns \c true if string \a lhs is not equal to string \a rhs.
4309 Otherwise returns \c false.
4310
4311 \overload operator!=()
4312*/
4313
4314/*! \fn bool QString::operator!=(const QString &lhs, const QByteArray &rhs)
4315
4316 \overload operator!=()
4317
4318 The \a rhs byte array is converted to a QUtf8StringView.
4319 If any NUL characters ('\\0') are embedded in the byte array, they will be
4320 included in the transformation.
4321
4322 You can disable this operator by defining \l QT_NO_CAST_FROM_ASCII
4323 when you compile your applications. This can be useful if you want
4324 to ensure that all user-visible strings go through QObject::tr(),
4325 for example.
4326*/
4327
4328/*! \fn bool QString::operator!=(const QString &lhs, const char * const &rhs)
4329
4330 \overload operator!=()
4331
4332 The \a rhs const char pointer is converted to a QUtf8StringView.
4333
4334 You can disable this operator by defining
4335 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
4336 can be useful if you want to ensure that all user-visible strings
4337 go through QObject::tr(), for example.
4338*/
4339
4340/*! \fn bool QString::operator==(const QByteArray &lhs, const QString &rhs)
4341
4342 Returns \c true if byte array \a lhs is equal to the UTF-8 encoding of
4343 \a rhs; otherwise returns \c false.
4344
4345 The comparison is case sensitive.
4346
4347 You can disable this operator by defining \c
4348 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4349 then need to call QString::fromUtf8(), QString::fromLatin1(),
4350 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4351 array to a QString before doing the comparison.
4352*/
4353
4354/*! \fn bool QString::operator!=(const QByteArray &lhs, const QString &rhs)
4355
4356 Returns \c true if byte array \a lhs is not equal to the UTF-8 encoding of
4357 \a rhs; otherwise returns \c false.
4358
4359 The comparison is case sensitive.
4360
4361 You can disable this operator by defining \c
4362 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4363 then need to call QString::fromUtf8(), QString::fromLatin1(),
4364 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4365 array to a QString before doing the comparison.
4366*/
4367
4368/*! \fn bool QString::operator<(const QByteArray &lhs, const QString &rhs)
4369
4370 Returns \c true if byte array \a lhs is lexically less than the UTF-8 encoding
4371 of \a rhs; otherwise returns \c false.
4372
4373 The comparison is case sensitive.
4374
4375 You can disable this operator by defining \c
4376 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4377 then need to call QString::fromUtf8(), QString::fromLatin1(),
4378 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4379 array to a QString before doing the comparison.
4380*/
4381
4382/*! \fn bool QString::operator>(const QByteArray &lhs, const QString &rhs)
4383
4384 Returns \c true if byte array \a lhs is lexically greater than the UTF-8
4385 encoding of \a rhs; otherwise returns \c false.
4386
4387 The comparison is case sensitive.
4388
4389 You can disable this operator by defining \c
4390 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4391 then need to call QString::fromUtf8(), QString::fromLatin1(),
4392 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4393 array to a QString before doing the comparison.
4394*/
4395
4396/*! \fn bool QString::operator<=(const QByteArray &lhs, const QString &rhs)
4397
4398 Returns \c true if byte array \a lhs is lexically less than or equal to the
4399 UTF-8 encoding of \a rhs; otherwise returns \c false.
4400
4401 The comparison is case sensitive.
4402
4403 You can disable this operator by defining \c
4404 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4405 then need to call QString::fromUtf8(), QString::fromLatin1(),
4406 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4407 array to a QString before doing the comparison.
4408*/
4409
4410/*! \fn bool QString::operator>=(const QByteArray &lhs, const QString &rhs)
4411
4412 Returns \c true if byte array \a lhs is greater than or equal to the UTF-8
4413 encoding of \a rhs; otherwise returns \c false.
4414
4415 The comparison is case sensitive.
4416
4417 You can disable this operator by defining \c
4418 QT_NO_CAST_FROM_ASCII when you compile your applications. You
4419 then need to call QString::fromUtf8(), QString::fromLatin1(),
4420 or QString::fromLocal8Bit() explicitly if you want to convert the byte
4421 array to a QString before doing the comparison.
4422*/
4423
4424/*!
4425 \fn qsizetype QString::indexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
4426 \include qstring.qdocinc {qstring-first-index-of} {string} {str}
4427
4428 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4429
4430 Example:
4431
4432 \snippet qstring/main.cpp 24
4433
4434 \include qstring.qdocinc negative-index-start-search-from-end
4435
4436 \sa lastIndexOf(), contains(), count()
4437*/
4438
4439/*!
4440 \fn qsizetype QString::indexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
4441 \since 5.14
4442 \overload indexOf()
4443
4444 \include qstring.qdocinc {qstring-first-index-of} {string view} {str}
4445
4446 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4447
4448 \include qstring.qdocinc negative-index-start-search-from-end
4449
4450 \sa QStringView::indexOf(), lastIndexOf(), contains(), count()
4451*/
4452
4453/*!
4454 \fn qsizetype QString::indexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
4455 \since 4.5
4456
4457 \include {qstring.qdocinc} {qstring-first-index-of} {Latin-1 string viewed by} {str}
4458
4459 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4460
4461 Example:
4462
4463 \snippet qstring/main.cpp 24
4464
4465 \include qstring.qdocinc negative-index-start-search-from-end
4466
4467 \sa lastIndexOf(), contains(), count()
4468*/
4469
4470/*!
4471 \fn qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
4472 \overload indexOf()
4473
4474 \include qstring.qdocinc {qstring-first-index-of} {character} {ch}
4475*/
4476
4477/*!
4478 \fn qsizetype QString::lastIndexOf(const QString &str, qsizetype from, Qt::CaseSensitivity cs) const
4479 \include qstring.qdocinc {qstring-last-index-of} {string} {str}
4480
4481 \include qstring.qdocinc negative-index-start-search-from-end
4482
4483 Returns -1 if \a str is not found.
4484
4485 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4486
4487 Example:
4488
4489 \snippet qstring/main.cpp 29
4490
4491 \note When searching for a 0-length \a str, the match at the end of
4492 the data is excluded from the search by a negative \a from, even
4493 though \c{-1} is normally thought of as searching from the end of the
4494 string: the match at the end is \e after the last character, so it is
4495 excluded. To include such a final empty match, either give a positive
4496 value for \a from or omit the \a from parameter entirely.
4497
4498 \sa indexOf(), contains(), count()
4499*/
4500
4501/*!
4502 \fn qsizetype QString::lastIndexOf(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4503 \since 6.2
4504 \overload lastIndexOf()
4505
4506 Returns the index position of the last occurrence of the string \a
4507 str in this string. Returns -1 if \a str is not found.
4508
4509 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4510
4511 Example:
4512
4513 \snippet qstring/main.cpp 29
4514
4515 \sa indexOf(), contains(), count()
4516*/
4517
4518
4519/*!
4520 \fn qsizetype QString::lastIndexOf(QLatin1StringView str, qsizetype from, Qt::CaseSensitivity cs) const
4521 \since 4.5
4522 \overload lastIndexOf()
4523
4524 \include qstring.qdocinc {qstring-last-index-of} {Latin-1 string viewed by} {str}
4525
4526 \include qstring.qdocinc negative-index-start-search-from-end
4527
4528 Returns -1 if \a str is not found.
4529
4530 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4531
4532 Example:
4533
4534 \snippet qstring/main.cpp 29
4535
4536 \note When searching for a 0-length \a str, the match at the end of
4537 the data is excluded from the search by a negative \a from, even
4538 though \c{-1} is normally thought of as searching from the end of the
4539 string: the match at the end is \e after the last character, so it is
4540 excluded. To include such a final empty match, either give a positive
4541 value for \a from or omit the \a from parameter entirely.
4542
4543 \sa indexOf(), contains(), count()
4544*/
4545
4546/*!
4547 \fn qsizetype QString::lastIndexOf(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4548 \since 6.2
4549 \overload lastIndexOf()
4550
4551 Returns the index position of the last occurrence of the string \a
4552 str in this string. Returns -1 if \a str is not found.
4553
4554 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4555
4556 Example:
4557
4558 \snippet qstring/main.cpp 29
4559
4560 \sa indexOf(), contains(), count()
4561*/
4562
4563/*!
4564 \fn qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
4565 \overload lastIndexOf()
4566
4567 \include qstring.qdocinc {qstring-last-index-of} {character} {ch}
4568*/
4569
4570/*!
4571 \fn QString::lastIndexOf(QChar ch, Qt::CaseSensitivity) const
4572 \since 6.3
4573 \overload lastIndexOf()
4574*/
4575
4576/*!
4577 \fn qsizetype QString::lastIndexOf(QStringView str, qsizetype from, Qt::CaseSensitivity cs) const
4578 \since 5.14
4579 \overload lastIndexOf()
4580
4581 \include qstring.qdocinc {qstring-last-index-of} {string view} {str}
4582
4583 \include qstring.qdocinc negative-index-start-search-from-end
4584
4585 Returns -1 if \a str is not found.
4586
4587 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4588
4589 \note When searching for a 0-length \a str, the match at the end of
4590 the data is excluded from the search by a negative \a from, even
4591 though \c{-1} is normally thought of as searching from the end of the
4592 string: the match at the end is \e after the last character, so it is
4593 excluded. To include such a final empty match, either give a positive
4594 value for \a from or omit the \a from parameter entirely.
4595
4596 \sa indexOf(), contains(), count()
4597*/
4598
4599/*!
4600 \fn qsizetype QString::lastIndexOf(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4601 \since 6.2
4602 \overload lastIndexOf()
4603
4604 Returns the index position of the last occurrence of the string view \a
4605 str in this string. Returns -1 if \a str is not found.
4606
4607 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4608
4609 \sa indexOf(), contains(), count()
4610*/
4611
4612#if QT_CONFIG(regularexpression)
4613struct QStringCapture
4614{
4615 qsizetype pos;
4616 qsizetype len;
4617 int no;
4618};
4619Q_DECLARE_TYPEINFO(QStringCapture, Q_PRIMITIVE_TYPE);
4620
4621/*!
4622 \overload replace()
4623 \since 5.0
4624
4625 Replaces every occurrence of the regular expression \a re in the
4626 string with \a after. Returns a reference to the string. For
4627 example:
4628
4629 \snippet qstring/main.cpp 87
4630
4631 For regular expressions containing capturing groups,
4632 occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
4633 with the string captured by the corresponding capturing group.
4634
4635 \snippet qstring/main.cpp 88
4636
4637 \sa indexOf(), lastIndexOf(), remove(), QRegularExpression, QRegularExpressionMatch
4638*/
4639QString &QString::replace(const QRegularExpression &re, const QString &after)
4640{
4641 if (!re.isValid()) {
4642 qtWarnAboutInvalidRegularExpression(re, "QString", "replace");
4643 return *this;
4644 }
4645
4646 const QString copy(*this);
4647 QRegularExpressionMatchIterator iterator = re.globalMatch(copy);
4648 if (!iterator.hasNext()) // no matches at all
4649 return *this;
4650
4651 reallocData(d.size, QArrayData::KeepSize);
4652
4653 qsizetype numCaptures = re.captureCount();
4654
4655 // 1. build the backreferences list, holding where the backreferences
4656 // are in the replacement string
4657 QVarLengthArray<QStringCapture> backReferences;
4658 const qsizetype al = after.size();
4659 const QChar *ac = after.unicode();
4660
4661 for (qsizetype i = 0; i < al - 1; i++) {
4662 if (ac[i] == u'\\') {
4663 int no = ac[i + 1].digitValue();
4664 if (no > 0 && no <= numCaptures) {
4665 QStringCapture backReference;
4666 backReference.pos = i;
4667 backReference.len = 2;
4668
4669 if (i < al - 2) {
4670 int secondDigit = ac[i + 2].digitValue();
4671 if (secondDigit != -1 && ((no * 10) + secondDigit) <= numCaptures) {
4672 no = (no * 10) + secondDigit;
4673 ++backReference.len;
4674 }
4675 }
4676
4677 backReference.no = no;
4678 backReferences.append(backReference);
4679 }
4680 }
4681 }
4682
4683 // 2. iterate on the matches. For every match, copy in chunks
4684 // - the part before the match
4685 // - the after string, with the proper replacements for the backreferences
4686
4687 qsizetype newLength = 0; // length of the new string, with all the replacements
4688 qsizetype lastEnd = 0;
4689 QVarLengthArray<QStringView> chunks;
4690 const QStringView copyView{ copy }, afterView{ after };
4691 while (iterator.hasNext()) {
4692 QRegularExpressionMatch match = iterator.next();
4693 qsizetype len;
4694 // add the part before the match
4695 len = match.capturedStart() - lastEnd;
4696 if (len > 0) {
4697 chunks << copyView.mid(lastEnd, len);
4698 newLength += len;
4699 }
4700
4701 lastEnd = 0;
4702 // add the after string, with replacements for the backreferences
4703 for (const QStringCapture &backReference : std::as_const(backReferences)) {
4704 // part of "after" before the backreference
4705 len = backReference.pos - lastEnd;
4706 if (len > 0) {
4707 chunks << afterView.mid(lastEnd, len);
4708 newLength += len;
4709 }
4710
4711 // backreference itself
4712 len = match.capturedLength(backReference.no);
4713 if (len > 0) {
4714 chunks << copyView.mid(match.capturedStart(backReference.no), len);
4715 newLength += len;
4716 }
4717
4718 lastEnd = backReference.pos + backReference.len;
4719 }
4720
4721 // add the last part of the after string
4722 len = afterView.size() - lastEnd;
4723 if (len > 0) {
4724 chunks << afterView.mid(lastEnd, len);
4725 newLength += len;
4726 }
4727
4728 lastEnd = match.capturedEnd();
4729 }
4730
4731 // 3. trailing string after the last match
4732 if (copyView.size() > lastEnd) {
4733 chunks << copyView.mid(lastEnd);
4734 newLength += copyView.size() - lastEnd;
4735 }
4736
4737 // 4. assemble the chunks together
4738 resize(newLength);
4739 qsizetype i = 0;
4740 QChar *uc = data();
4741 for (const QStringView &chunk : std::as_const(chunks)) {
4742 qsizetype len = chunk.size();
4743 memcpy(uc + i, chunk.constData(), len * sizeof(QChar));
4744 i += len;
4745 }
4746
4747 return *this;
4748}
4749#endif // QT_CONFIG(regularexpression)
4750
4751/*!
4752 Returns the number of (potentially overlapping) occurrences of
4753 the string \a str in this string.
4754
4755 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4756
4757 \sa contains(), indexOf()
4758*/
4759
4760qsizetype QString::count(const QString &str, Qt::CaseSensitivity cs) const
4761{
4762 return QtPrivate::count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs);
4763}
4764
4765/*!
4766 \overload count()
4767
4768 Returns the number of occurrences of character \a ch in the string.
4769
4770 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4771
4772 \sa contains(), indexOf()
4773*/
4774
4775qsizetype QString::count(QChar ch, Qt::CaseSensitivity cs) const
4776{
4777 return QtPrivate::count(QStringView(unicode(), size()), ch, cs);
4778}
4779
4780/*!
4781 \since 6.0
4782 \overload count()
4783 Returns the number of (potentially overlapping) occurrences of the
4784 string view \a str in this string.
4785
4786 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4787
4788 \sa contains(), indexOf()
4789*/
4790qsizetype QString::count(QStringView str, Qt::CaseSensitivity cs) const
4791{
4792 return QtPrivate::count(*this, str, cs);
4793}
4794
4795/*! \fn bool QString::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4796
4797 Returns \c true if this string contains an occurrence of the string
4798 \a str; otherwise returns \c false.
4799
4800 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4801
4802 Example:
4803 \snippet qstring/main.cpp 17
4804
4805 \sa indexOf(), count()
4806*/
4807
4808/*! \fn bool QString::contains(QLatin1StringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4809 \since 5.3
4810
4811 \overload contains()
4812
4813 Returns \c true if this string contains an occurrence of the latin-1 string
4814 \a str; otherwise returns \c false.
4815*/
4816
4817/*! \fn bool QString::contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4818
4819 \overload contains()
4820
4821 Returns \c true if this string contains an occurrence of the
4822 character \a ch; otherwise returns \c false.
4823*/
4824
4825/*! \fn bool QString::contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
4826 \since 5.14
4827 \overload contains()
4828
4829 Returns \c true if this string contains an occurrence of the string view
4830 \a str; otherwise returns \c false.
4831
4832 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
4833
4834 \sa indexOf(), count()
4835*/
4836
4837#if QT_CONFIG(regularexpression)
4838/*!
4839 \since 5.5
4840
4841 Returns the index position of the first match of the regular
4842 expression \a re in the string, searching forward from index
4843 position \a from. Returns -1 if \a re didn't match anywhere.
4844
4845 If the match is successful and \a rmatch is not \nullptr, it also
4846 writes the results of the match into the QRegularExpressionMatch object
4847 pointed to by \a rmatch.
4848
4849 Example:
4850
4851 \snippet qstring/main.cpp 93
4852*/
4853qsizetype QString::indexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
4854{
4855 return QtPrivate::indexOf(QStringView(*this), this, re, from, rmatch);
4856}
4857
4858/*!
4859 \since 5.5
4860
4861 Returns the index position of the last match of the regular
4862 expression \a re in the string, which starts before the index
4863 position \a from.
4864
4865 \include qstring.qdocinc negative-index-start-search-from-end
4866
4867 Returns -1 if \a re didn't match anywhere.
4868
4869 If the match is successful and \a rmatch is not \nullptr, it also
4870 writes the results of the match into the QRegularExpressionMatch object
4871 pointed to by \a rmatch.
4872
4873 Example:
4874
4875 \snippet qstring/main.cpp 94
4876
4877 \note Due to how the regular expression matching algorithm works,
4878 this function will actually match repeatedly from the beginning of
4879 the string until the position \a from is reached.
4880
4881 \note When searching for a regular expression \a re that may match
4882 0 characters, the match at the end of the data is excluded from the
4883 search by a negative \a from, even though \c{-1} is normally
4884 thought of as searching from the end of the string: the match at
4885 the end is \e after the last character, so it is excluded. To
4886 include such a final empty match, either give a positive value for
4887 \a from or omit the \a from parameter entirely.
4888*/
4889qsizetype QString::lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch) const
4890{
4891 return QtPrivate::lastIndexOf(QStringView(*this), this, re, from, rmatch);
4892}
4893
4894/*!
4895 \fn qsizetype QString::lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch = nullptr) const
4896 \since 6.2
4897 \overload lastIndexOf()
4898
4899 Returns the index position of the last match of the regular
4900 expression \a re in the string. Returns -1 if \a re didn't match anywhere.
4901
4902 If the match is successful and \a rmatch is not \nullptr, it also
4903 writes the results of the match into the QRegularExpressionMatch object
4904 pointed to by \a rmatch.
4905
4906 Example:
4907
4908 \snippet qstring/main.cpp 94
4909
4910 \note Due to how the regular expression matching algorithm works,
4911 this function will actually match repeatedly from the beginning of
4912 the string until the end of the string is reached.
4913*/
4914
4915/*!
4916 \since 5.1
4917
4918 Returns \c true if the regular expression \a re matches somewhere in this
4919 string; otherwise returns \c false.
4920
4921 If the match is successful and \a rmatch is not \nullptr, it also
4922 writes the results of the match into the QRegularExpressionMatch object
4923 pointed to by \a rmatch.
4924
4925 \sa QRegularExpression::match()
4926*/
4927
4928bool QString::contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const
4929{
4930 return QtPrivate::contains(QStringView(*this), this, re, rmatch);
4931}
4932
4933/*!
4934 \overload count()
4935 \since 5.0
4936
4937 Returns the number of times the regular expression \a re matches
4938 in the string.
4939
4940 For historical reasons, this function counts overlapping matches,
4941 so in the example below, there are four instances of "ana" or
4942 "ama":
4943
4944 \snippet qstring/main.cpp 95
4945
4946 This behavior is different from simply iterating over the matches
4947 in the string using QRegularExpressionMatchIterator.
4948
4949 \sa QRegularExpression::globalMatch()
4950*/
4951qsizetype QString::count(const QRegularExpression &re) const
4952{
4953 return QtPrivate::count(QStringView(*this), re);
4954}
4955#endif // QT_CONFIG(regularexpression)
4956
4957#if QT_DEPRECATED_SINCE(6, 4)
4958/*! \fn qsizetype QString::count() const
4959 \deprecated [6.4] Use size() or length() instead.
4960 \overload count()
4961
4962 Same as size().
4963*/
4964#endif
4965
4966/*!
4967 \enum QString::SectionFlag
4968
4969 This enum specifies flags that can be used to affect various
4970 aspects of the section() function's behavior with respect to
4971 separators and empty fields.
4972
4973 \value SectionDefault Empty fields are counted, leading and
4974 trailing separators are not included, and the separator is
4975 compared case sensitively.
4976
4977 \value SectionSkipEmpty Treat empty fields as if they don't exist,
4978 i.e. they are not considered as far as \e start and \e end are
4979 concerned.
4980
4981 \value SectionIncludeLeadingSep Include the leading separator (if
4982 any) in the result string.
4983
4984 \value SectionIncludeTrailingSep Include the trailing separator
4985 (if any) in the result string.
4986
4987 \value SectionCaseInsensitiveSeps Compare the separator
4988 case-insensitively.
4989
4990 \sa section()
4991*/
4992
4993/*!
4994 \fn QString QString::section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags) const
4995
4996 This function returns a section of the string.
4997
4998 This string is treated as a sequence of fields separated by the
4999 character, \a sep. The returned string consists of the fields from
5000 position \a start to position \a end inclusive. If \a end is not
5001 specified, all fields from position \a start to the end of the
5002 string are included. Fields are numbered 0, 1, 2, etc., counting
5003 from the left, and -1, -2, etc., counting from right to left.
5004
5005 The \a flags argument can be used to affect some aspects of the
5006 function's behavior, e.g. whether to be case sensitive, whether
5007 to skip empty fields and how to deal with leading and trailing
5008 separators; see \l{SectionFlags}.
5009
5010 \snippet qstring/main.cpp 52
5011
5012 If \a start or \a end is negative, we count fields from the right
5013 of the string, the right-most field being -1, the one from
5014 right-most field being -2, and so on.
5015
5016 \snippet qstring/main.cpp 53
5017
5018 \sa split()
5019*/
5020
5021/*!
5022 \overload section()
5023
5024 \snippet qstring/main.cpp 51
5025 \snippet qstring/main.cpp 54
5026
5027 \sa split()
5028*/
5029
5030QString QString::section(const QString &sep, qsizetype start, qsizetype end, SectionFlags flags) const
5031{
5032 const QList<QStringView> sections = QStringView{ *this }.split(
5033 sep, Qt::KeepEmptyParts, (flags & SectionCaseInsensitiveSeps) ? Qt::CaseInsensitive : Qt::CaseSensitive);
5034 const qsizetype sectionsSize = sections.size();
5035 if (!(flags & SectionSkipEmpty)) {
5036 if (start < 0)
5037 start += sectionsSize;
5038 if (end < 0)
5039 end += sectionsSize;
5040 } else {
5041 qsizetype skip = 0;
5042 for (qsizetype k = 0; k < sectionsSize; ++k) {
5043 if (sections.at(k).isEmpty())
5044 skip++;
5045 }
5046 if (start < 0)
5047 start += sectionsSize - skip;
5048 if (end < 0)
5049 end += sectionsSize - skip;
5050 }
5051 if (start >= sectionsSize || end < 0 || start > end)
5052 return QString();
5053
5054 QString ret;
5055 qsizetype first_i = start, last_i = end;
5056 for (qsizetype x = 0, i = 0; x <= end && i < sectionsSize; ++i) {
5057 const QStringView &section = sections.at(i);
5058 const bool empty = section.isEmpty();
5059 if (x >= start) {
5060 if (x == start)
5061 first_i = i;
5062 if (x == end)
5063 last_i = i;
5064 if (x > start && i > 0)
5065 ret += sep;
5066 ret += section;
5067 }
5068 if (!empty || !(flags & SectionSkipEmpty))
5069 x++;
5070 }
5071 if ((flags & SectionIncludeLeadingSep) && first_i > 0)
5072 ret.prepend(sep);
5073 if ((flags & SectionIncludeTrailingSep) && last_i < sectionsSize - 1)
5074 ret += sep;
5075 return ret;
5076}
5077
5078#if QT_CONFIG(regularexpression)
5079struct qt_section_chunk
5080{
5081 qsizetype length;
5082 QStringView string;
5083};
5084Q_DECLARE_TYPEINFO(qt_section_chunk, Q_RELOCATABLE_TYPE);
5085
5086static QString extractSections(QSpan<qt_section_chunk> sections, qsizetype start, qsizetype end,
5087 QString::SectionFlags flags)
5088{
5089 const qsizetype sectionsSize = sections.size();
5090
5091 if (!(flags & QString::SectionSkipEmpty)) {
5092 if (start < 0)
5093 start += sectionsSize;
5094 if (end < 0)
5095 end += sectionsSize;
5096 } else {
5097 qsizetype skip = 0;
5098 for (qsizetype k = 0; k < sectionsSize; ++k) {
5099 const qt_section_chunk &section = sections[k];
5100 if (section.length == section.string.size())
5101 skip++;
5102 }
5103 if (start < 0)
5104 start += sectionsSize - skip;
5105 if (end < 0)
5106 end += sectionsSize - skip;
5107 }
5108 if (start >= sectionsSize || end < 0 || start > end)
5109 return QString();
5110
5111 QString ret;
5112 qsizetype x = 0;
5113 qsizetype first_i = start, last_i = end;
5114 for (qsizetype i = 0; x <= end && i < sectionsSize; ++i) {
5115 const qt_section_chunk &section = sections[i];
5116 const bool empty = (section.length == section.string.size());
5117 if (x >= start) {
5118 if (x == start)
5119 first_i = i;
5120 if (x == end)
5121 last_i = i;
5122 if (x != start)
5123 ret += section.string;
5124 else
5125 ret += section.string.mid(section.length);
5126 }
5127 if (!empty || !(flags & QString::SectionSkipEmpty))
5128 x++;
5129 }
5130
5131 if ((flags & QString::SectionIncludeLeadingSep) && first_i >= 0) {
5132 const qt_section_chunk &section = sections[first_i];
5133 ret.prepend(section.string.left(section.length));
5134 }
5135
5136 if ((flags & QString::SectionIncludeTrailingSep)
5137 && last_i < sectionsSize - 1) {
5138 const qt_section_chunk &section = sections[last_i + 1];
5139 ret += section.string.left(section.length);
5140 }
5141
5142 return ret;
5143}
5144
5145/*!
5146 \overload section()
5147 \since 5.0
5148
5149 This string is treated as a sequence of fields separated by the
5150 regular expression, \a re.
5151
5152 \snippet qstring/main.cpp 89
5153
5154 \warning Using this QRegularExpression version is much more expensive than
5155 the overloaded string and character versions.
5156
5157 \sa split(), simplified()
5158*/
5159QString QString::section(const QRegularExpression &re, qsizetype start, qsizetype end, SectionFlags flags) const
5160{
5161 if (!re.isValid()) {
5162 qtWarnAboutInvalidRegularExpression(re, "QString", "section");
5163 return QString();
5164 }
5165
5166 const QChar *uc = unicode();
5167 if (!uc)
5168 return QString();
5169
5170 QRegularExpression sep(re);
5171 if (flags & SectionCaseInsensitiveSeps)
5172 sep.setPatternOptions(sep.patternOptions() | QRegularExpression::CaseInsensitiveOption);
5173
5174 QVarLengthArray<qt_section_chunk> sections;
5175 qsizetype n = size(), m = 0, last_m = 0, last_len = 0;
5176 QRegularExpressionMatchIterator iterator = sep.globalMatch(*this);
5177 while (iterator.hasNext()) {
5178 QRegularExpressionMatch match = iterator.next();
5179 m = match.capturedStart();
5180 sections.append(qt_section_chunk{last_len, QStringView{*this}.sliced(last_m, m - last_m)});
5181 last_m = m;
5182 last_len = match.capturedLength();
5183 }
5184 sections.append(qt_section_chunk{last_len, QStringView{*this}.sliced(last_m, n - last_m)});
5185
5186 return extractSections(sections, start, end, flags);
5187}
5188#endif // QT_CONFIG(regularexpression)
5189
5190/*!
5191 \fn QString QString::left(qsizetype n) const &
5192 \fn QString QString::left(qsizetype n) &&
5193
5194 Returns a substring that contains the \a n leftmost characters of
5195 this string (that is, from the beginning of this string up to, but not
5196 including, the element at index position \a n).
5197
5198 If you know that \a n cannot be out of bounds, use first() instead in new
5199 code, because it is faster.
5200
5201 The entire string is returned if \a n is greater than or equal
5202 to size(), or less than zero.
5203
5204 \sa first(), last(), startsWith(), chopped(), chop(), truncate()
5205*/
5206
5207/*!
5208 \fn QString QString::right(qsizetype n) const &
5209 \fn QString QString::right(qsizetype n) &&
5210
5211 Returns a substring that contains the \a n rightmost characters
5212 of the string.
5213
5214 If you know that \a n cannot be out of bounds, use last() instead in new
5215 code, because it is faster.
5216
5217 The entire string is returned if \a n is greater than or equal
5218 to size(), or less than zero.
5219
5220 \sa endsWith(), last(), first(), sliced(), chopped(), chop(), truncate(), slice()
5221*/
5222
5223/*!
5224 \fn QString QString::mid(qsizetype position, qsizetype n) const &
5225 \fn QString QString::mid(qsizetype position, qsizetype n) &&
5226
5227 Returns a string that contains \a n characters of this string, starting
5228 at the specified \a position index up to, but not including, the element
5229 at index position \tt {\a position + \a n}.
5230
5231 If you know that \a position and \a n cannot be out of bounds, use sliced()
5232 instead in new code, because it is faster.
5233
5234 Returns a null string if the \a position index exceeds the
5235 length of the string. If there are less than \a n characters
5236 available in the string starting at the given \a position, or if
5237 \a n is -1 (default), the function returns all characters that
5238 are available from the specified \a position.
5239
5240 \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
5241*/
5242QString QString::mid(qsizetype position, qsizetype n) const &
5243{
5244 qsizetype p = position;
5245 qsizetype l = n;
5246 using namespace QtPrivate;
5247 switch (QContainerImplHelper::mid(size(), &p, &l)) {
5248 case QContainerImplHelper::Null:
5249 return QString();
5250 case QContainerImplHelper::Empty:
5251 return QString(DataPointer::fromRawData(&_empty, 0));
5252 case QContainerImplHelper::Full:
5253 return *this;
5254 case QContainerImplHelper::Subset:
5255 return sliced(p, l);
5256 }
5257 Q_UNREACHABLE_RETURN(QString());
5258}
5259
5260QString QString::mid(qsizetype position, qsizetype n) &&
5261{
5262 qsizetype p = position;
5263 qsizetype l = n;
5264 using namespace QtPrivate;
5265 switch (QContainerImplHelper::mid(size(), &p, &l)) {
5266 case QContainerImplHelper::Null:
5267 return QString();
5268 case QContainerImplHelper::Empty:
5269 resize(0); // keep capacity if we've reserve()d
5270 [[fallthrough]];
5271 case QContainerImplHelper::Full:
5272 return std::move(*this);
5273 case QContainerImplHelper::Subset:
5274 return std::move(*this).sliced(p, l);
5275 }
5276 Q_UNREACHABLE_RETURN(QString());
5277}
5278
5279/*!
5280 \fn QString QString::first(qsizetype n) const &
5281 \fn QString QString::first(qsizetype n) &&
5282 \since 6.0
5283
5284 Returns a string that contains the first \a n characters of this string,
5285 (that is, from the beginning of this string up to, but not including,
5286 the element at index position \a n).
5287
5288 \note The behavior is undefined when \a n < 0 or \a n > size().
5289
5290 \snippet qstring/main.cpp 31
5291
5292 \sa last(), sliced(), startsWith(), chopped(), chop(), truncate(), slice()
5293*/
5294
5295/*!
5296 \fn QString QString::last(qsizetype n) const &
5297 \fn QString QString::last(qsizetype n) &&
5298 \since 6.0
5299
5300 Returns the string that contains the last \a n characters of this string.
5301
5302 \note The behavior is undefined when \a n < 0 or \a n > size().
5303
5304 \snippet qstring/main.cpp 48
5305
5306 \sa first(), sliced(), endsWith(), chopped(), chop(), truncate(), slice()
5307*/
5308
5309/*!
5310 \fn QString QString::sliced(qsizetype pos, qsizetype n) const &
5311 \fn QString QString::sliced(qsizetype pos, qsizetype n) &&
5312 \since 6.0
5313
5314 Returns a string that contains \a n characters of this string, starting
5315 at position \a pos up to, but not including, the element at index position
5316 \tt {\a pos + \a n}.
5317
5318 \note The behavior is undefined when \a pos < 0, \a n < 0,
5319 or \a pos + \a n > size().
5320
5321 \snippet qstring/main.cpp 34
5322
5323 \sa first(), last(), chopped(), chop(), truncate(), slice()
5324*/
5325QString QString::sliced_helper(QString &str, qsizetype pos, qsizetype n)
5326{
5327 if (n == 0)
5328 return QString(DataPointer::fromRawData(&_empty, 0));
5329 DataPointer d = std::move(str.d).sliced(pos, n);
5330 d.data()[n] = 0;
5331 return QString(std::move(d));
5332}
5333
5334/*!
5335 \fn QString QString::sliced(qsizetype pos) const &
5336 \fn QString QString::sliced(qsizetype pos) &&
5337 \since 6.0
5338 \overload
5339
5340 Returns a string that contains the portion of this string starting at
5341 position \a pos and extending to its end.
5342
5343 \note The behavior is undefined when \a pos < 0 or \a pos > size().
5344
5345 \sa first(), last(), chopped(), chop(), truncate(), slice()
5346*/
5347
5348/*!
5349 \fn QString &QString::slice(qsizetype pos, qsizetype n)
5350 \since 6.8
5351
5352 Modifies this string to start at position \a pos, up to, but not including,
5353 the character (code point) at index position \tt {\a pos + \a n}; and
5354 returns a reference to this string.
5355
5356 \note The behavior is undefined if \a pos < 0, \a n < 0,
5357 or \a pos + \a n > size().
5358
5359 \snippet qstring/main.cpp slice97
5360
5361 \sa sliced(), first(), last(), chopped(), chop(), truncate()
5362*/
5363
5364/*!
5365 \fn QString &QString::slice(qsizetype pos)
5366 \since 6.8
5367 \overload
5368
5369 Modifies this string to start at position \a pos and extending to its end,
5370 and returns a reference to this string.
5371
5372 \note The behavior is undefined if \a pos < 0 or \a pos > size().
5373
5374 \sa sliced(), first(), last(), chopped(), chop(), truncate()
5375*/
5376
5377/*!
5378 \fn QString QString::chopped(qsizetype len) const &
5379 \fn QString QString::chopped(qsizetype len) &&
5380 \since 5.10
5381
5382 Returns a string that contains the size() - \a len leftmost characters
5383 of this string.
5384
5385 \note The behavior is undefined if \a len is negative or greater than size().
5386
5387 \sa endsWith(), first(), last(), sliced(), chop(), truncate(), slice()
5388*/
5389
5390/*!
5391 Returns \c true if the string starts with \a s; otherwise returns
5392 \c false.
5393
5394 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
5395
5396 \snippet qstring/main.cpp 65
5397
5398 \sa endsWith()
5399*/
5400bool QString::startsWith(const QString& s, Qt::CaseSensitivity cs) const
5401{
5402 return qt_starts_with_impl(QStringView(*this), QStringView(s), cs);
5403}
5404
5405/*!
5406 \overload startsWith()
5407 */
5408bool QString::startsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
5409{
5410 return qt_starts_with_impl(QStringView(*this), s, cs);
5411}
5412
5413/*!
5414 \overload startsWith()
5415
5416 Returns \c true if the string starts with \a c; otherwise returns
5417 \c false.
5418*/
5419bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
5420{
5421 if (!size())
5422 return false;
5423 if (cs == Qt::CaseSensitive)
5424 return at(0) == c;
5425 return foldCase(at(0)) == foldCase(c);
5426}
5427
5428/*!
5429 \fn bool QString::startsWith(QStringView str, Qt::CaseSensitivity cs) const
5430 \since 5.10
5431 \overload
5432
5433 Returns \c true if the string starts with the string view \a str;
5434 otherwise returns \c false.
5435
5436 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
5437
5438 \sa endsWith()
5439*/
5440
5441/*!
5442 Returns \c true if the string ends with \a s; otherwise returns
5443 \c false.
5444
5445 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
5446
5447 \snippet qstring/main.cpp 20
5448
5449 \sa startsWith()
5450*/
5451bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
5452{
5453 return qt_ends_with_impl(QStringView(*this), QStringView(s), cs);
5454}
5455
5456/*!
5457 \fn bool QString::endsWith(QStringView str, Qt::CaseSensitivity cs) const
5458 \since 5.10
5459 \overload endsWith()
5460 Returns \c true if the string ends with the string view \a str;
5461 otherwise returns \c false.
5462
5463 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
5464
5465 \sa startsWith()
5466*/
5467
5468/*!
5469 \overload endsWith()
5470*/
5471bool QString::endsWith(QLatin1StringView s, Qt::CaseSensitivity cs) const
5472{
5473 return qt_ends_with_impl(QStringView(*this), s, cs);
5474}
5475
5476/*!
5477 Returns \c true if the string ends with \a c; otherwise returns
5478 \c false.
5479
5480 \overload endsWith()
5481 */
5482bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
5483{
5484 if (!size())
5485 return false;
5486 if (cs == Qt::CaseSensitive)
5487 return at(size() - 1) == c;
5488 return foldCase(at(size() - 1)) == foldCase(c);
5489}
5490
5491static bool checkCase(QStringView s, QUnicodeTables::Case c) noexcept
5492{
5493 QStringIterator it(s);
5494 while (it.hasNext()) {
5495 const char32_t uc = it.next();
5496 if (caseConversion(uc)[c].diff)
5497 return false;
5498 }
5499 return true;
5500}
5501
5502bool QtPrivate::isLower(QStringView s) noexcept
5503{
5504 return checkCase(s, QUnicodeTables::LowerCase);
5505}
5506
5507bool QtPrivate::isUpper(QStringView s) noexcept
5508{
5509 return checkCase(s, QUnicodeTables::UpperCase);
5510}
5511
5512/*!
5513 Returns \c true if the string is uppercase, that is, it's identical
5514 to its toUpper() folding.
5515
5516 Note that this does \e not mean that the string does not contain
5517 lowercase letters (some lowercase letters do not have a uppercase
5518 folding; they are left unchanged by toUpper()).
5519 For more information, refer to the Unicode standard, section 3.13.
5520
5521 \since 5.12
5522
5523 \sa QChar::toUpper(), isLower()
5524*/
5525bool QString::isUpper() const
5526{
5527 return QtPrivate::isUpper(qToStringViewIgnoringNull(*this));
5528}
5529
5530/*!
5531 Returns \c true if the string is lowercase, that is, it's identical
5532 to its toLower() folding.
5533
5534 Note that this does \e not mean that the string does not contain
5535 uppercase letters (some uppercase letters do not have a lowercase
5536 folding; they are left unchanged by toLower()).
5537 For more information, refer to the Unicode standard, section 3.13.
5538
5539 \since 5.12
5540
5541 \sa QChar::toLower(), isUpper()
5542 */
5543bool QString::isLower() const
5544{
5545 return QtPrivate::isLower(qToStringViewIgnoringNull(*this));
5546}
5547
5548static QByteArray qt_convert_to_latin1(QStringView string);
5549
5550QByteArray QString::toLatin1_helper(const QString &string)
5551{
5552 return qt_convert_to_latin1(string);
5553}
5554
5555/*!
5556 \since 6.0
5557 \internal
5558 \relates QAnyStringView
5559
5560 Returns a UTF-16 representation of \a string as a QString.
5561
5562 \sa QString::toLatin1(), QStringView::toLatin1(), QtPrivate::convertToUtf8(),
5563 QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUcs4()
5564*/
5565QString QtPrivate::convertToQString(QAnyStringView string)
5566{
5567 return string.visit([] (auto string) { return string.toString(); });
5568}
5569
5570/*!
5571 \since 5.10
5572 \internal
5573 \relates QStringView
5574
5575 Returns a Latin-1 representation of \a string as a QByteArray.
5576
5577 The behavior is undefined if \a string contains non-Latin1 characters.
5578
5579 \sa QString::toLatin1(), QStringView::toLatin1(), QtPrivate::convertToUtf8(),
5580 QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUcs4()
5581*/
5583{
5584 return qt_convert_to_latin1(string);
5585}
5586
5587Q_NEVER_INLINE
5588static QByteArray qt_convert_to_latin1(QStringView string)
5589{
5590 if (Q_UNLIKELY(string.isNull()))
5591 return QByteArray();
5592
5593 QByteArray ba(string.size(), Qt::Uninitialized);
5594
5595 // since we own the only copy, we're going to const_cast the constData;
5596 // that avoids an unnecessary call to detach() and expansion code that will never get used
5597 qt_to_latin1(reinterpret_cast<uchar *>(const_cast<char *>(ba.constData())),
5598 string.utf16(), string.size());
5599 return ba;
5600}
5601
5602QByteArray QString::toLatin1_helper_inplace(QString &s)
5603{
5604 if (!s.isDetached())
5605 return qt_convert_to_latin1(s);
5606
5607 // We can return our own buffer to the caller.
5608 // Conversion to Latin-1 always shrinks the buffer by half.
5609 // This relies on the fact that we use QArrayData for everything behind the scenes
5610
5611 // First, do the in-place conversion. Since isDetached() == true, the data
5612 // was allocated by QArrayData, so the null terminator must be there.
5613 qsizetype length = s.size();
5614 char16_t *sdata = s.d.data();
5615 Q_ASSERT(sdata[length] == u'\0');
5616 qt_to_latin1(reinterpret_cast<uchar *>(sdata), sdata, length + 1);
5617
5618 // Move the internals over to the byte array.
5619 // Kids, avert your eyes. Don't try this at home.
5620 auto ba_d = std::move(s.d).reinterpreted<char>();
5621
5622 // Some sanity checks
5623 Q_ASSERT(ba_d.d->allocatedCapacity() >= ba_d.size);
5624 Q_ASSERT(s.isNull());
5625 Q_ASSERT(s.isEmpty());
5626 Q_ASSERT(s.constData() == QString().constData());
5627
5628 return QByteArray(std::move(ba_d));
5629}
5630
5631/*!
5632 \since 6.9
5633 \internal
5634 \relates QLatin1StringView
5635
5636 Returns a UTF-8 representation of \a string as a QByteArray.
5637*/
5638QByteArray QtPrivate::convertToUtf8(QLatin1StringView string)
5639{
5640 if (Q_UNLIKELY(string.isNull()))
5641 return QByteArray();
5642
5643 // create a QByteArray with the worst case scenario size
5644 QByteArray ba(string.size() * 2, Qt::Uninitialized);
5645 const qsizetype sz = QUtf8::convertFromLatin1(ba.data(), string) - ba.data();
5646 ba.truncate(sz);
5647
5648 return ba;
5649}
5650
5651// QLatin1 methods that use helpers from qstring.cpp
5652char16_t *QLatin1::convertToUnicode(char16_t *out, QLatin1StringView in) noexcept
5653{
5654 const qsizetype len = in.size();
5655 qt_from_latin1(out, in.data(), len);
5656 return std::next(out, len);
5657}
5658
5659char *QLatin1::convertFromUnicode(char *out, QStringView in) noexcept
5660{
5661 const qsizetype len = in.size();
5662 qt_to_latin1(reinterpret_cast<uchar *>(out), in.utf16(), len);
5663 return out + len;
5664}
5665
5666/*!
5667 \fn QByteArray QString::toLatin1() const
5668
5669 Returns a Latin-1 representation of the string as a QByteArray.
5670
5671 The returned byte array is undefined if the string contains non-Latin1
5672 characters. Those characters may be suppressed or replaced with a
5673 question mark.
5674
5675 \sa fromLatin1(), toUtf8(), toLocal8Bit(), QStringEncoder
5676*/
5677
5678static QByteArray qt_convert_to_local_8bit(QStringView string);
5679
5680/*!
5681 \fn QByteArray QString::toLocal8Bit() const
5682
5683 Returns the local 8-bit representation of the string as a
5684 QByteArray.
5685
5686 \include qstring.qdocinc {qstring-local-8-bit-equivalent} {toUtf8}
5687
5688 If this string contains any characters that cannot be encoded in the
5689 local 8-bit encoding, the returned byte array is undefined. Those
5690 characters may be suppressed or replaced by another.
5691
5692 \sa fromLocal8Bit(), toLatin1(), toUtf8(), QStringEncoder
5693*/
5694
5695QByteArray QString::toLocal8Bit_helper(const QChar *data, qsizetype size)
5696{
5697 return qt_convert_to_local_8bit(QStringView(data, size));
5698}
5699
5700static QByteArray qt_convert_to_local_8bit(QStringView string)
5701{
5702 if (string.isNull())
5703 return QByteArray();
5704 QStringEncoder fromUtf16(QStringEncoder::System, QStringEncoder::Flag::Stateless);
5705 return fromUtf16(string);
5706}
5707
5708/*!
5709 \since 5.10
5710 \internal
5711 \relates QStringView
5712
5713 Returns a local 8-bit representation of \a string as a QByteArray.
5714
5715 On Unix systems this is equivalent to toUtf8(), on Windows the systems
5716 current code page is being used.
5717
5718 The behavior is undefined if \a string contains characters not
5719 supported by the locale's 8-bit encoding.
5720
5721 \sa QString::toLocal8Bit(), QStringView::toLocal8Bit()
5722*/
5724{
5725 return qt_convert_to_local_8bit(string);
5726}
5727
5728static QByteArray qt_convert_to_utf8(QStringView str);
5729
5730/*!
5731 \fn QByteArray QString::toUtf8() const
5732
5733 Returns a UTF-8 representation of the string as a QByteArray.
5734
5735 UTF-8 is a Unicode codec and can represent all characters in a Unicode
5736 string like QString.
5737
5738 \sa fromUtf8(), toLatin1(), toLocal8Bit(), QStringEncoder
5739*/
5740
5741QByteArray QString::toUtf8_helper(const QString &str)
5742{
5743 return qt_convert_to_utf8(str);
5744}
5745
5746static QByteArray qt_convert_to_utf8(QStringView str)
5747{
5748 if (str.isNull())
5749 return QByteArray();
5750
5751 return QUtf8::convertFromUnicode(str);
5752}
5753
5754/*!
5755 \since 5.10
5756 \internal
5757 \relates QStringView
5758
5759 Returns a UTF-8 representation of \a string as a QByteArray.
5760
5761 UTF-8 is a Unicode codec and can represent all characters in a Unicode
5762 string like QStringView.
5763
5764 \sa QString::toUtf8(), QStringView::toUtf8()
5765*/
5767{
5768 return qt_convert_to_utf8(string);
5769}
5770
5771static QList<uint> qt_convert_to_ucs4(QStringView string);
5772
5773/*!
5774 \since 4.2
5775
5776 Returns a UCS-4/UTF-32 representation of the string as a QList<uint>.
5777
5778 UTF-32 is a Unicode codec and therefore it is lossless. All characters from
5779 this string will be encoded in UTF-32. Any invalid sequence of code units in
5780 this string is replaced by the Unicode replacement character
5781 (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
5782
5783 The returned list is not 0-terminated.
5784
5785 \sa fromUtf8(), toUtf8(), toLatin1(), toLocal8Bit(), QStringEncoder,
5786 fromUcs4(), toWCharArray()
5787*/
5788QList<uint> QString::toUcs4() const
5789{
5790 return qt_convert_to_ucs4(*this);
5791}
5792
5793static QList<uint> qt_convert_to_ucs4(QStringView string)
5794{
5795 QList<uint> v(string.size());
5796 uint *a = const_cast<uint*>(v.constData());
5797 QStringIterator it(string);
5798 while (it.hasNext())
5799 *a++ = it.next();
5800 v.resize(a - v.constData());
5801 return v;
5802}
5803
5804/*!
5805 \since 5.10
5806 \internal
5807 \relates QStringView
5808
5809 Returns a UCS-4/UTF-32 representation of \a string as a QList<uint>.
5810
5811 UTF-32 is a Unicode codec and therefore it is lossless. All characters from
5812 this string will be encoded in UTF-32. Any invalid sequence of code units in
5813 this string is replaced by the Unicode replacement character
5814 (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
5815
5816 The returned list is not 0-terminated.
5817
5818 \sa QString::toUcs4(), QStringView::toUcs4(), QtPrivate::convertToLatin1(),
5819 QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUtf8()
5820*/
5821QList<uint> QtPrivate::convertToUcs4(QStringView string)
5822{
5823 return qt_convert_to_ucs4(string);
5824}
5825
5826/*!
5827 \fn QString QString::fromLatin1(QByteArrayView str)
5828 \overload
5829 \since 6.0
5830
5831 Returns a QString initialized with the Latin-1 string \a str.
5832
5833 \note: any null ('\\0') bytes in the byte array will be included in this
5834 string, converted to Unicode null characters (U+0000).
5835*/
5836QString QString::fromLatin1(QByteArrayView ba)
5837{
5838 DataPointer d;
5839 if (!ba.data()) {
5840 // nothing to do
5841 } else if (ba.size() == 0) {
5842 d = DataPointer::fromRawData(&_empty, 0);
5843 } else {
5844 d = DataPointer(ba.size(), ba.size());
5845 Q_CHECK_PTR(d.data());
5846 d.data()[ba.size()] = '\0';
5847 char16_t *dst = d.data();
5848
5849 qt_from_latin1(dst, ba.data(), size_t(ba.size()));
5850 }
5851 return QString(std::move(d));
5852}
5853
5854/*!
5855 \fn QString QString::fromLatin1(const char *str, qsizetype size)
5856 Returns a QString initialized with the first \a size characters
5857 of the Latin-1 string \a str.
5858
5859 If \a size is \c{-1}, \c{strlen(str)} is used instead.
5860
5861 \sa toLatin1(), fromUtf8(), fromLocal8Bit()
5862*/
5863
5864/*!
5865 \fn QString QString::fromLatin1(const QByteArray &str)
5866 \overload
5867 \since 5.0
5868
5869 Returns a QString initialized with the Latin-1 string \a str.
5870
5871 \note: any null ('\\0') bytes in the byte array will be included in this
5872 string, converted to Unicode null characters (U+0000). This behavior is
5873 different from Qt 5.x.
5874*/
5875
5876/*!
5877 \fn QString QString::fromLocal8Bit(const char *str, qsizetype size)
5878 Returns a QString initialized with the first \a size characters
5879 of the 8-bit string \a str.
5880
5881 If \a size is \c{-1}, \c{strlen(str)} is used instead.
5882
5883 \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
5884
5885 \sa toLocal8Bit(), fromLatin1(), fromUtf8()
5886*/
5887
5888/*!
5889 \fn QString QString::fromLocal8Bit(const QByteArray &str)
5890 \overload
5891 \since 5.0
5892
5893 Returns a QString initialized with the 8-bit string \a str.
5894
5895 \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
5896
5897 \note: any null ('\\0') bytes in the byte array will be included in this
5898 string, converted to Unicode null characters (U+0000). This behavior is
5899 different from Qt 5.x.
5900*/
5901
5902/*!
5903 \fn QString QString::fromLocal8Bit(QByteArrayView str)
5904 \overload
5905 \since 6.0
5906
5907 Returns a QString initialized with the 8-bit string \a str.
5908
5909 \include qstring.qdocinc {qstring-local-8-bit-equivalent} {fromUtf8}
5910
5911 \note: any null ('\\0') bytes in the byte array will be included in this
5912 string, converted to Unicode null characters (U+0000).
5913*/
5914QString QString::fromLocal8Bit(QByteArrayView ba)
5915{
5916 if (ba.isNull())
5917 return QString();
5918 if (ba.isEmpty())
5919 return QString(DataPointer::fromRawData(&_empty, 0));
5920 QStringDecoder toUtf16(QStringDecoder::System, QStringDecoder::Flag::Stateless);
5921 return toUtf16(ba);
5922}
5923
5924/*! \fn QString QString::fromUtf8(const char *str, qsizetype size)
5925 Returns a QString initialized with the first \a size bytes
5926 of the UTF-8 string \a str.
5927
5928 If \a size is \c{-1}, \c{strlen(str)} is used instead.
5929
5930 UTF-8 is a Unicode codec and can represent all characters in a Unicode
5931 string like QString. However, invalid sequences are possible with UTF-8
5932 and, if any such are found, they will be replaced with one or more
5933 "replacement characters", or suppressed. These include non-Unicode
5934 sequences, non-characters, overlong sequences or surrogate codepoints
5935 encoded into UTF-8.
5936
5937 This function can be used to process incoming data incrementally as long as
5938 all UTF-8 characters are terminated within the incoming data. Any
5939 unterminated characters at the end of the string will be replaced or
5940 suppressed. In order to do stateful decoding, please use \l QStringDecoder.
5941
5942 \sa toUtf8(), fromLatin1(), fromLocal8Bit()
5943*/
5944
5945/*!
5946 \fn QString QString::fromUtf8(const char8_t *str)
5947 \overload
5948 \since 6.1
5949
5950 This overload is only available when compiling in C++20 mode.
5951*/
5952
5953/*!
5954 \fn QString QString::fromUtf8(const char8_t *str, qsizetype size)
5955 \overload
5956 \since 6.0
5957
5958 This overload is only available when compiling in C++20 mode.
5959*/
5960
5961/*!
5962 \fn QString QString::fromUtf8(const QByteArray &str)
5963 \overload
5964 \since 5.0
5965
5966 Returns a QString initialized with the UTF-8 string \a str.
5967
5968 \note: any null ('\\0') bytes in the byte array will be included in this
5969 string, converted to Unicode null characters (U+0000). This behavior is
5970 different from Qt 5.x.
5971*/
5972
5973/*!
5974 \fn QString QString::fromUtf8(QByteArrayView str)
5975 \overload
5976 \since 6.0
5977
5978 Returns a QString initialized with the UTF-8 string \a str.
5979
5980 \note: any null ('\\0') bytes in the byte array will be included in this
5981 string, converted to Unicode null characters (U+0000).
5982*/
5983QString QString::fromUtf8(QByteArrayView ba)
5984{
5985 if (ba.isNull())
5986 return QString();
5987 if (ba.isEmpty())
5988 return QString(DataPointer::fromRawData(&_empty, 0));
5989 return QUtf8::convertToUnicode(ba);
5990}
5991
5992#ifndef QT_BOOTSTRAPPED
5993/*!
5994 \since 5.3
5995 Returns a QString initialized with the first \a size characters
5996 of the Unicode string \a unicode (ISO-10646-UTF-16 encoded).
5997
5998 If \a size is -1 (default), \a unicode must be '\\0'-terminated.
5999
6000 This function checks for a Byte Order Mark (BOM). If it is missing,
6001 host byte order is assumed.
6002
6003 This function is slow compared to the other Unicode conversions.
6004 Use QString(const QChar *, qsizetype) or QString(const QChar *) if possible.
6005
6006 QString makes a deep copy of the Unicode data.
6007
6008 \sa utf16(), setUtf16(), fromStdU16String()
6009*/
6010QString QString::fromUtf16(const char16_t *unicode, qsizetype size)
6011{
6012 if (!unicode)
6013 return QString();
6014 if (size < 0)
6015 size = QtPrivate::qustrlen(unicode);
6016 QStringDecoder toUtf16(QStringDecoder::Utf16, QStringDecoder::Flag::Stateless);
6017 return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 2));
6018}
6019
6020/*!
6021 \fn QString QString::fromUtf16(const ushort *str, qsizetype size)
6022 \deprecated [6.0] Use the \c char16_t overload instead.
6023*/
6024
6025/*!
6026 \fn QString QString::fromUcs4(const uint *str, qsizetype size)
6027 \since 4.2
6028 \deprecated [6.0] Use the \c char32_t overload instead.
6029*/
6030
6031/*!
6032 \since 5.3
6033
6034 Returns a QString initialized with the first \a size characters
6035 of the Unicode string \a unicode (encoded as UTF-32).
6036
6037 If \a size is -1 (default), \a unicode must be '\\0'-terminated.
6038
6039 \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(),
6040 fromStdU32String()
6041*/
6042QString QString::fromUcs4(const char32_t *unicode, qsizetype size)
6043{
6044 if (!unicode)
6045 return QString();
6046 if (size < 0) {
6047 if constexpr (sizeof(char32_t) == sizeof(wchar_t))
6048 size = wcslen(reinterpret_cast<const wchar_t *>(unicode));
6049 else
6050 size = std::char_traits<char32_t>::length(unicode);
6051 }
6052 QStringDecoder toUtf16(QStringDecoder::Utf32, QStringDecoder::Flag::Stateless);
6053 return toUtf16(QByteArrayView(reinterpret_cast<const char *>(unicode), size * 4));
6054}
6055#endif // !QT_BOOTSTRAPPED
6056
6057/*!
6058 Resizes the string to \a size characters and copies \a unicode
6059 into the string.
6060
6061 If \a unicode is \nullptr, nothing is copied, but the string is still
6062 resized to \a size.
6063
6064 \sa unicode(), setUtf16()
6065*/
6066QString& QString::setUnicode(const QChar *unicode, qsizetype size)
6067{
6068 resize(size);
6069 if (unicode && size)
6070 memcpy(d.data(), unicode, size * sizeof(QChar));
6071 return *this;
6072}
6073
6074/*!
6075 \fn QString::setUnicode(const char16_t *unicode, qsizetype size)
6076 \overload
6077 \since 6.9
6078
6079 \sa unicode(), setUtf16()
6080*/
6081
6082/*!
6083 \fn QString::setUtf16(const char16_t *unicode, qsizetype size)
6084 \since 6.9
6085
6086 Resizes the string to \a size characters and copies \a unicode
6087 into the string.
6088
6089 If \a unicode is \nullptr, nothing is copied, but the string is still
6090 resized to \a size.
6091
6092 Note that unlike fromUtf16(), this function does not consider BOMs and
6093 possibly differing byte ordering.
6094
6095 \sa utf16(), setUnicode()
6096*/
6097
6098/*!
6099 \fn QString &QString::setUtf16(const ushort *unicode, qsizetype size)
6100 \obsolete [6.10] Use the \c char16_t overload instead.
6101*/
6102
6103/*!
6104 \fn QString QString::simplified() const
6105
6106 Returns a string that has whitespace removed from the start
6107 and the end, and that has each sequence of internal whitespace
6108 replaced with a single space.
6109
6110 Whitespace means any character for which QChar::isSpace() returns
6111 \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
6112 '\\f', '\\r', and ' '.
6113
6114 Example:
6115
6116 \snippet qstring/main.cpp 57
6117
6118 \sa trimmed()
6119*/
6120QString QString::simplified_helper(const QString &str)
6121{
6122 return QStringAlgorithms<const QString>::simplified_helper(str);
6123}
6124
6125QString QString::simplified_helper(QString &str)
6126{
6127 return QStringAlgorithms<QString>::simplified_helper(str);
6128}
6129
6130namespace {
6131 template <typename StringView>
6132 StringView qt_trimmed(StringView s) noexcept
6133 {
6134 const auto [begin, end] = QStringAlgorithms<const StringView>::trimmed_helper_positions(s);
6135 return StringView{begin, end};
6136 }
6137}
6138
6139/*!
6140 \fn QStringView QtPrivate::trimmed(QStringView s)
6141 \fn QLatin1StringView QtPrivate::trimmed(QLatin1StringView s)
6142 \internal
6143 \relates QStringView
6144 \since 5.10
6145
6146 Returns \a s with whitespace removed from the start and the end.
6147
6148 Whitespace means any character for which QChar::isSpace() returns
6149 \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
6150 '\\f', '\\r', and ' '.
6151
6152 \sa QString::trimmed(), QStringView::trimmed(), QLatin1StringView::trimmed()
6153*/
6154QStringView QtPrivate::trimmed(QStringView s) noexcept
6155{
6156 return qt_trimmed(s);
6157}
6158
6159QLatin1StringView QtPrivate::trimmed(QLatin1StringView s) noexcept
6160{
6161 return qt_trimmed(s);
6162}
6163
6164/*!
6165 \fn QString QString::trimmed() const
6166
6167 Returns a string that has whitespace removed from the start and
6168 the end.
6169
6170 Whitespace means any character for which QChar::isSpace() returns
6171 \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
6172 '\\f', '\\r', and ' '.
6173
6174 Example:
6175
6176 \snippet qstring/main.cpp 82
6177
6178 Unlike simplified(), trimmed() leaves internal whitespace alone.
6179
6180 \sa simplified()
6181*/
6182QString QString::trimmed_helper(const QString &str)
6183{
6184 return QStringAlgorithms<const QString>::trimmed_helper(str);
6185}
6186
6187QString QString::trimmed_helper(QString &str)
6188{
6189 return QStringAlgorithms<QString>::trimmed_helper(str);
6190}
6191
6192/*! \fn const QChar QString::at(qsizetype position) const
6193
6194 Returns the character at the given index \a position in the
6195 string.
6196
6197 The \a position must be a valid index position in the string
6198 (i.e., 0 <= \a position < size()).
6199
6200 \sa operator[]()
6201*/
6202
6203/*!
6204 \fn QChar &QString::operator[](qsizetype position)
6205
6206 Returns the character at the specified \a position in the string as a
6207 modifiable reference.
6208
6209 Example:
6210
6211 \snippet qstring/main.cpp 85
6212
6213 \sa at()
6214*/
6215
6216/*!
6217 \fn const QChar QString::operator[](qsizetype position) const
6218
6219 \overload operator[]()
6220*/
6221
6222/*!
6223 \fn QChar QString::front() const
6224 \since 5.10
6225
6226 Returns the first character in the string.
6227 Same as \c{at(0)}.
6228
6229 This function is provided for STL compatibility.
6230
6231 \warning Calling this function on an empty string constitutes
6232 undefined behavior.
6233
6234 \sa back(), at(), operator[]()
6235*/
6236
6237/*!
6238 \fn QChar QString::back() const
6239 \since 5.10
6240
6241 Returns the last character in the string.
6242 Same as \c{at(size() - 1)}.
6243
6244 This function is provided for STL compatibility.
6245
6246 \warning Calling this function on an empty string constitutes
6247 undefined behavior.
6248
6249 \sa front(), at(), operator[]()
6250*/
6251
6252/*!
6253 \fn QChar &QString::front()
6254 \since 5.10
6255
6256 Returns a reference to the first character in the string.
6257 Same as \c{operator[](0)}.
6258
6259 This function is provided for STL compatibility.
6260
6261 \warning Calling this function on an empty string constitutes
6262 undefined behavior.
6263
6264 \sa back(), at(), operator[]()
6265*/
6266
6267/*!
6268 \fn QChar &QString::back()
6269 \since 5.10
6270
6271 Returns a reference to the last character in the string.
6272 Same as \c{operator[](size() - 1)}.
6273
6274 This function is provided for STL compatibility.
6275
6276 \warning Calling this function on an empty string constitutes
6277 undefined behavior.
6278
6279 \sa front(), at(), operator[]()
6280*/
6281
6282/*!
6283 \fn void QString::truncate(qsizetype position)
6284
6285 Truncates the string starting from, and including, the element at index
6286 \a position.
6287
6288 If the specified \a position index is beyond the end of the
6289 string, nothing happens.
6290
6291 Example:
6292
6293 \snippet qstring/main.cpp 83
6294
6295 If \a position is negative, it is equivalent to passing zero.
6296
6297 \sa chop(), resize(), first(), QStringView::truncate()
6298*/
6299
6300void QString::truncate(qsizetype pos)
6301{
6302 if (pos < size())
6303 resize(pos);
6304}
6305
6306
6307/*!
6308 Removes \a n characters from the end of the string.
6309
6310 If \a n is greater than or equal to size(), the result is an
6311 empty string; if \a n is negative, it is equivalent to passing zero.
6312
6313 Example:
6314 \snippet qstring/main.cpp 15
6315
6316 If you want to remove characters from the \e beginning of the
6317 string, use remove() instead.
6318
6319 \sa truncate(), resize(), remove(), QStringView::chop()
6320*/
6321void QString::chop(qsizetype n)
6322{
6323 if (n > 0)
6324 resize(d.size - n);
6325}
6326
6327/*!
6328 Sets every character in the string to character \a ch. If \a size
6329 is different from -1 (default), the string is resized to \a
6330 size beforehand.
6331
6332 Example:
6333
6334 \snippet qstring/main.cpp 21
6335
6336 \sa resize()
6337*/
6338
6339QString& QString::fill(QChar ch, qsizetype size)
6340{
6341 resize(size < 0 ? d.size : size);
6342 if (d.size)
6343 std::fill(d.data(), d.data() + d.size, ch.unicode());
6344 return *this;
6345}
6346
6347/*!
6348 \fn qsizetype QString::length() const
6349
6350 Returns the number of characters in this string. Equivalent to
6351 size().
6352
6353 \sa resize()
6354*/
6355
6356/*!
6357 \fn qsizetype QString::size() const
6358
6359 Returns the number of characters in this string.
6360
6361 The last character in the string is at position size() - 1.
6362
6363 Example:
6364 \snippet qstring/main.cpp 58
6365
6366 \sa isEmpty(), resize()
6367*/
6368
6369/*!
6370 \fn qsizetype QString::max_size() const
6371 \fn qsizetype QString::maxSize()
6372 \since 6.8
6373
6374 It returns the maximum number of elements that the string can
6375 theoretically hold. In practice, the number can be much smaller,
6376 limited by the amount of memory available to the system.
6377*/
6378
6379/*! \fn bool QString::isNull() const
6380
6381 Returns \c true if this string is null; otherwise returns \c false.
6382
6383 Example:
6384
6385 \snippet qstring/main.cpp 28
6386
6387 Qt makes a distinction between null strings and empty strings for
6388 historical reasons. For most applications, what matters is
6389 whether or not a string contains any data, and this can be
6390 determined using the isEmpty() function.
6391
6392 \sa isEmpty()
6393*/
6394
6395/*! \fn bool QString::isEmpty() const
6396
6397 Returns \c true if the string has no characters; otherwise returns
6398 \c false.
6399
6400 Example:
6401
6402 \snippet qstring/main.cpp 27
6403
6404 \sa size()
6405*/
6406
6407/*! \fn QString &QString::operator+=(const QString &other)
6408
6409 Appends the string \a other onto the end of this string and
6410 returns a reference to this string.
6411
6412 Example:
6413
6414 \snippet qstring/main.cpp 84
6415
6416 This operation is typically very fast (\l{constant time}),
6417 because QString preallocates extra space at the end of the string
6418 data so it can grow without reallocating the entire string each
6419 time.
6420
6421 \sa append(), prepend()
6422*/
6423
6424/*! \fn QString &QString::operator+=(QLatin1StringView str)
6425
6426 \overload operator+=()
6427
6428 Appends the Latin-1 string viewed by \a str to this string.
6429*/
6430
6431/*! \fn QString &QString::operator+=(QUtf8StringView str)
6432 \since 6.5
6433 \overload operator+=()
6434
6435 Appends the UTF-8 string view \a str to this string.
6436*/
6437
6438/*! \fn QString &QString::operator+=(const QByteArray &ba)
6439
6440 \overload operator+=()
6441
6442 Appends the byte array \a ba to this string. The byte array is converted
6443 to Unicode using the fromUtf8() function. If any NUL characters ('\\0')
6444 are embedded in the \a ba byte array, they will be included in the
6445 transformation.
6446
6447 You can disable this function by defining
6448 \l QT_NO_CAST_FROM_ASCII when you compile your applications. This
6449 can be useful if you want to ensure that all user-visible strings
6450 go through QObject::tr(), for example.
6451*/
6452
6453/*! \fn QString &QString::operator+=(const char *str)
6454
6455 \overload operator+=()
6456
6457 Appends the string \a str to this string. The const char pointer
6458 is converted to Unicode using the fromUtf8() function.
6459
6460 You can disable this function by defining \l QT_NO_CAST_FROM_ASCII
6461 when you compile your applications. This can be useful if you want
6462 to ensure that all user-visible strings go through QObject::tr(),
6463 for example.
6464*/
6465
6466/*! \fn QString &QString::operator+=(QStringView str)
6467 \since 6.0
6468 \overload operator+=()
6469
6470 Appends the string view \a str to this string.
6471*/
6472
6473/*! \fn QString &QString::operator+=(QChar ch)
6474
6475 \overload operator+=()
6476
6477 Appends the character \a ch to the string.
6478*/
6479
6480/*!
6481 \fn bool QString::operator==(const char * const &lhs, const QString &rhs)
6482
6483 \overload operator==()
6484
6485 Returns \c true if \a lhs is equal to \a rhs; otherwise returns \c false.
6486 Note that no string is equal to \a lhs being 0.
6487
6488 Equivalent to \c {lhs != 0 && compare(lhs, rhs) == 0}.
6489*/
6490
6491/*!
6492 \fn bool QString::operator!=(const char * const &lhs, const QString &rhs)
6493
6494 Returns \c true if \a lhs is not equal to \a rhs; otherwise returns
6495 \c false.
6496
6497 For \a lhs != 0, this is equivalent to \c {compare(} \a lhs, \a rhs
6498 \c {) != 0}. Note that no string is equal to \a lhs being 0.
6499*/
6500
6501/*!
6502 \fn bool QString::operator<(const char * const &lhs, const QString &rhs)
6503
6504 Returns \c true if \a lhs is lexically less than \a rhs; otherwise
6505 returns \c false. For \a lhs != 0, this is equivalent to \c
6506 {compare(lhs, rhs) < 0}.
6507
6508 \sa {Comparing Strings}
6509*/
6510
6511/*!
6512 \fn bool QString::operator<=(const char * const &lhs, const QString &rhs)
6513
6514 Returns \c true if \a lhs is lexically less than or equal to \a rhs;
6515 otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
6516 {compare(lhs, rhs) <= 0}.
6517
6518 \sa {Comparing Strings}
6519*/
6520
6521/*!
6522 \fn bool QString::operator>(const char * const &lhs, const QString &rhs)
6523
6524 Returns \c true if \a lhs is lexically greater than \a rhs; otherwise
6525 returns \c false. Equivalent to \c {compare(lhs, rhs) > 0}.
6526
6527 \sa {Comparing Strings}
6528*/
6529
6530/*!
6531 \fn bool QString::operator>=(const char * const &lhs, const QString &rhs)
6532
6533 Returns \c true if \a lhs is lexically greater than or equal to \a rhs;
6534 otherwise returns \c false. For \a lhs != 0, this is equivalent to \c
6535 {compare(lhs, rhs) >= 0}.
6536
6537 \sa {Comparing Strings}
6538*/
6539
6540/*!
6541 \fn QString operator+(const QString &s1, const QString &s2)
6542 \fn QString operator+(QString &&s1, const QString &s2)
6543 \relates QString
6544
6545 Returns a string which is the result of concatenating \a s1 and \a
6546 s2.
6547*/
6548
6549/*!
6550 \fn QString operator+(const QString &s1, const char *s2)
6551 \relates QString
6552
6553 Returns a string which is the result of concatenating \a s1 and \a
6554 s2 (\a s2 is converted to Unicode using the QString::fromUtf8()
6555 function).
6556
6557 \sa QString::fromUtf8()
6558*/
6559
6560/*!
6561 \fn QString operator+(const char *s1, const QString &s2)
6562 \relates QString
6563
6564 Returns a string which is the result of concatenating \a s1 and \a
6565 s2 (\a s1 is converted to Unicode using the QString::fromUtf8()
6566 function).
6567
6568 \sa QString::fromUtf8()
6569*/
6570
6571/*!
6572 \fn QString operator+(QStringView lhs, const QString &rhs)
6573 \fn QString operator+(const QString &lhs, QStringView rhs)
6574
6575 \relates QString
6576 \since 6.9
6577
6578 Returns a string that is the result of concatenating \a lhs and \a rhs.
6579*/
6580
6581/*!
6582 \fn int QString::compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs)
6583 \since 4.2
6584
6585 Compares the string \a s1 with the string \a s2 and returns a negative integer
6586 if \a s1 is less than \a s2, a positive integer if it is greater than \a s2,
6587 and zero if they are equal.
6588
6589 \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
6590
6591 Case sensitive comparison is based exclusively on the numeric
6592 Unicode values of the characters and is very fast, but is not what
6593 a human would expect. Consider sorting user-visible strings with
6594 localeAwareCompare().
6595
6596 \snippet qstring/main.cpp 16
6597
6598//! [compare-isNull-vs-isEmpty]
6599 \note This function treats null strings the same as empty strings,
6600 for more details see \l {Distinction Between Null and Empty Strings}.
6601//! [compare-isNull-vs-isEmpty]
6602
6603 \sa operator==(), operator<(), operator>(), {Comparing Strings}
6604*/
6605
6606/*!
6607 \fn int QString::compare(const QString &s1, QLatin1StringView s2, Qt::CaseSensitivity cs)
6608 \since 4.2
6609 \overload compare()
6610
6611 Performs a comparison of \a s1 and \a s2, using the case
6612 sensitivity setting \a cs.
6613*/
6614
6615/*!
6616 \fn int QString::compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
6617
6618 \since 4.2
6619 \overload compare()
6620
6621 Performs a comparison of \a s1 and \a s2, using the case
6622 sensitivity setting \a cs.
6623*/
6624
6625/*!
6626 \fn int QString::compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
6627
6628 \since 5.12
6629 \overload compare()
6630
6631 Performs a comparison of this with \a s, using the case
6632 sensitivity setting \a cs.
6633*/
6634
6635/*!
6636 \fn int QString::compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
6637
6638 \since 5.14
6639 \overload compare()
6640
6641 Performs a comparison of this with \a ch, using the case
6642 sensitivity setting \a cs.
6643*/
6644
6645/*!
6646 \overload compare()
6647 \since 4.2
6648
6649 Lexically compares this string with the string \a other and returns
6650 a negative integer if this string is less than \a other, a positive
6651 integer if it is greater than \a other, and zero if they are equal.
6652
6653 Same as compare(*this, \a other, \a cs).
6654*/
6655int QString::compare(const QString &other, Qt::CaseSensitivity cs) const noexcept
6656{
6657 return QtPrivate::compareStrings(*this, other, cs);
6658}
6659
6660/*!
6661 \internal
6662 \since 4.5
6663*/
6664int QString::compare_helper(const QChar *data1, qsizetype length1, const QChar *data2, qsizetype length2,
6665 Qt::CaseSensitivity cs) noexcept
6666{
6667 Q_ASSERT(length1 >= 0);
6668 Q_ASSERT(length2 >= 0);
6669 Q_ASSERT(data1 || length1 == 0);
6670 Q_ASSERT(data2 || length2 == 0);
6671 return QtPrivate::compareStrings(QStringView(data1, length1), QStringView(data2, length2), cs);
6672}
6673
6674/*!
6675 \overload compare()
6676 \since 4.2
6677
6678 Same as compare(*this, \a other, \a cs).
6679*/
6680int QString::compare(QLatin1StringView other, Qt::CaseSensitivity cs) const noexcept
6681{
6682 return QtPrivate::compareStrings(*this, other, cs);
6683}
6684
6685/*!
6686 \internal
6687 \since 5.0
6688*/
6689int QString::compare_helper(const QChar *data1, qsizetype length1, const char *data2, qsizetype length2,
6690 Qt::CaseSensitivity cs) noexcept
6691{
6692 Q_ASSERT(length1 >= 0);
6693 Q_ASSERT(data1 || length1 == 0);
6694 if (!data2)
6695 return qt_lencmp(length1, 0);
6696 if (Q_UNLIKELY(length2 < 0))
6697 length2 = qsizetype(strlen(data2));
6698 return QtPrivate::compareStrings(QStringView(data1, length1),
6699 QUtf8StringView(data2, length2), cs);
6700}
6701
6702/*!
6703 \fn int QString::compare(const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
6704 \overload compare()
6705*/
6706
6707/*!
6708 \fn int QString::compare(QStringView s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
6709 \overload compare()
6710*/
6711
6712bool comparesEqual(const QByteArrayView &lhs, const QChar &rhs) noexcept
6713{
6714 return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6715}
6716
6717Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept
6718{
6719 const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6720 return Qt::compareThreeWay(res, 0);
6721}
6722
6723bool comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept
6724{
6725 return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6726}
6727
6728Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept
6729{
6730 const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6731 return Qt::compareThreeWay(res, 0);
6732}
6733
6734bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept
6735{
6736 return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6737}
6738
6739Qt::strong_ordering compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept
6740{
6741 const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6742 return Qt::compareThreeWay(res, 0);
6743}
6744
6745bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept
6746{
6747 return QtPrivate::equalStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6748}
6749
6750Qt::strong_ordering compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept
6751{
6752 const int res = QtPrivate::compareStrings(QUtf8StringView(lhs), QStringView(&rhs, 1));
6753 return Qt::compareThreeWay(res, 0);
6754}
6755
6756/*!
6757 \internal
6758 \since 6.8
6759*/
6760bool QT_FASTCALL QChar::equal_helper(QChar lhs, const char *rhs) noexcept
6761{
6762 return QtPrivate::equalStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
6763}
6764
6765int QT_FASTCALL QChar::compare_helper(QChar lhs, const char *rhs) noexcept
6766{
6767 return QtPrivate::compareStrings(QStringView(&lhs, 1), QUtf8StringView(rhs));
6768}
6769
6770/*!
6771 \internal
6772 \since 6.8
6773*/
6774bool QStringView::equal_helper(QStringView sv, const char *data, qsizetype len)
6775{
6776 Q_ASSERT(len >= 0);
6777 Q_ASSERT(data || len == 0);
6778 return QtPrivate::equalStrings(sv, QUtf8StringView(data, len));
6779}
6780
6781/*!
6782 \internal
6783 \since 6.8
6784*/
6785int QStringView::compare_helper(QStringView sv, const char *data, qsizetype len)
6786{
6787 Q_ASSERT(len >= 0);
6788 Q_ASSERT(data || len == 0);
6789 return QtPrivate::compareStrings(sv, QUtf8StringView(data, len));
6790}
6791
6792/*!
6793 \internal
6794 \since 6.8
6795*/
6796bool QLatin1StringView::equal_helper(QLatin1StringView s1, const char *s2, qsizetype len) noexcept
6797{
6798 // because qlatin1stringview.h can't include qutf8stringview.h
6799 Q_ASSERT(len >= 0);
6800 Q_ASSERT(s2 || len == 0);
6801 return QtPrivate::equalStrings(s1, QUtf8StringView(s2, len));
6802}
6803
6804/*!
6805 \internal
6806 \since 6.6
6807*/
6808int QLatin1StringView::compare_helper(const QLatin1StringView &s1, const char *s2, qsizetype len) noexcept
6809{
6810 // because qlatin1stringview.h can't include qutf8stringview.h
6811 Q_ASSERT(len >= 0);
6812 Q_ASSERT(s2 || len == 0);
6813 return QtPrivate::compareStrings(s1, QUtf8StringView(s2, len));
6814}
6815
6816/*!
6817 \internal
6818 \since 4.5
6819*/
6820int QLatin1StringView::compare_helper(const QChar *data1, qsizetype length1, QLatin1StringView s2,
6821 Qt::CaseSensitivity cs) noexcept
6822{
6823 Q_ASSERT(length1 >= 0);
6824 Q_ASSERT(data1 || length1 == 0);
6825 return QtPrivate::compareStrings(QStringView(data1, length1), s2, cs);
6826}
6827
6828/*!
6829 \fn int QString::localeAwareCompare(const QString & s1, const QString & s2)
6830
6831 Compares \a s1 with \a s2 and returns an integer less than, equal
6832 to, or greater than zero if \a s1 is less than, equal to, or
6833 greater than \a s2.
6834
6835 The comparison is performed in a locale- and also
6836 platform-dependent manner. Use this function to present sorted
6837 lists of strings to the user.
6838
6839 \sa compare(), QLocale, {Comparing Strings}
6840*/
6841
6842/*!
6843 \fn int QString::localeAwareCompare(QStringView other) const
6844 \since 6.0
6845 \overload localeAwareCompare()
6846
6847 Compares this string with the \a other string and returns an
6848 integer less than, equal to, or greater than zero if this string
6849 is less than, equal to, or greater than the \a other string.
6850
6851 The comparison is performed in a locale- and also
6852 platform-dependent manner. Use this function to present sorted
6853 lists of strings to the user.
6854
6855 Same as \c {localeAwareCompare(*this, other)}.
6856
6857 \sa {Comparing Strings}
6858*/
6859
6860/*!
6861 \fn int QString::localeAwareCompare(QStringView s1, QStringView s2)
6862 \since 6.0
6863 \overload localeAwareCompare()
6864
6865 Compares \a s1 with \a s2 and returns an integer less than, equal
6866 to, or greater than zero if \a s1 is less than, equal to, or
6867 greater than \a s2.
6868
6869 The comparison is performed in a locale- and also
6870 platform-dependent manner. Use this function to present sorted
6871 lists of strings to the user.
6872
6873 \sa {Comparing Strings}
6874*/
6875
6876
6877#if !defined(CSTR_LESS_THAN)
6878#define CSTR_LESS_THAN 1
6879#define CSTR_EQUAL 2
6880#define CSTR_GREATER_THAN 3
6881#endif
6882
6883/*!
6884 \overload localeAwareCompare()
6885
6886 Compares this string with the \a other string and returns an
6887 integer less than, equal to, or greater than zero if this string
6888 is less than, equal to, or greater than the \a other string.
6889
6890 The comparison is performed in a locale- and also
6891 platform-dependent manner. Use this function to present sorted
6892 lists of strings to the user.
6893
6894 Same as \c {localeAwareCompare(*this, other)}.
6895
6896 \sa {Comparing Strings}
6897*/
6898int QString::localeAwareCompare(const QString &other) const
6899{
6900 return localeAwareCompare_helper(constData(), size(), other.constData(), other.size());
6901}
6902
6903/*!
6904 \internal
6905 \since 4.5
6906*/
6907int QString::localeAwareCompare_helper(const QChar *data1, qsizetype length1,
6908 const QChar *data2, qsizetype length2)
6909{
6910 Q_ASSERT(length1 >= 0);
6911 Q_ASSERT(data1 || length1 == 0);
6912 Q_ASSERT(length2 >= 0);
6913 Q_ASSERT(data2 || length2 == 0);
6914
6915 // do the right thing for null and empty
6916 if (length1 == 0 || length2 == 0)
6917 return QtPrivate::compareStrings(QStringView(data1, length1), QStringView(data2, length2),
6918 Qt::CaseSensitive);
6919
6920#if QT_CONFIG(icu) || defined(Q_OS_ANDROID)
6921 return QCollator::defaultCompare(QStringView(data1, length1), QStringView(data2, length2));
6922#else
6923 const QString lhs = QString::fromRawData(data1, length1).normalized(QString::NormalizationForm_C);
6924 const QString rhs = QString::fromRawData(data2, length2).normalized(QString::NormalizationForm_C);
6925# if defined(Q_OS_WIN)
6926 int res = CompareStringEx(LOCALE_NAME_USER_DEFAULT, 0, (LPWSTR)lhs.constData(), lhs.length(), (LPWSTR)rhs.constData(), rhs.length(), NULL, NULL, 0);
6927
6928 switch (res) {
6929 case CSTR_LESS_THAN:
6930 return -1;
6931 case CSTR_GREATER_THAN:
6932 return 1;
6933 default:
6934 return 0;
6935 }
6936# elif defined (Q_OS_DARWIN)
6937 // Use CFStringCompare for comparing strings on Mac. This makes Qt order
6938 // strings the same way as native applications do, and also respects
6939 // the "Order for sorted lists" setting in the International preferences
6940 // panel.
6941 const CFStringRef thisString =
6942 CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,
6943 reinterpret_cast<const UniChar *>(lhs.constData()), lhs.length(), kCFAllocatorNull);
6944 const CFStringRef otherString =
6945 CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,
6946 reinterpret_cast<const UniChar *>(rhs.constData()), rhs.length(), kCFAllocatorNull);
6947
6948 const int result = CFStringCompare(thisString, otherString, kCFCompareLocalized);
6949 CFRelease(thisString);
6950 CFRelease(otherString);
6951 return result;
6952# elif defined(Q_OS_UNIX)
6953 // declared in <string.h> (no better than QtPrivate::compareStrings() on Android, sadly)
6954 return strcoll(lhs.toLocal8Bit().constData(), rhs.toLocal8Bit().constData());
6955# else
6956# error "This case shouldn't happen"
6957 return QtPrivate::compareStrings(lhs, rhs, Qt::CaseSensitive);
6958# endif
6959#endif // !QT_CONFIG(icu)
6960}
6961
6962
6963/*!
6964 \fn const QChar *QString::unicode() const
6965
6966 Returns a Unicode representation of the string.
6967 The result remains valid until the string is modified.
6968
6969 \note The returned string may not be '\\0'-terminated.
6970 Use size() to determine the length of the array.
6971
6972 \sa utf16(), fromRawData()
6973*/
6974
6975/*!
6976 \fn const ushort *QString::utf16() const
6977 \obsolete [6.11] Use nullTerminate() and cast data() to \c{const char16_t *}.
6978
6979 Returns the QString as a '\\0\'-terminated array of unsigned
6980 shorts. The result remains valid until the string is modified.
6981
6982 The returned string is in host byte order.
6983
6984 \sa unicode()
6985*/
6986
6987const ushort *QString::utf16() const
6988{
6989 if (!d.isMutable()) {
6990 // ensure '\0'-termination for ::fromRawData strings
6991 const_cast<QString*>(this)->reallocData(d.size, QArrayData::KeepSize);
6992 }
6993 return reinterpret_cast<const ushort *>(d.data());
6994}
6995
6996/*!
6997 \fn QString &QString::nullTerminate()
6998 \since 6.10
6999
7000 If this string data isn't null-terminated, this method will make a deep
7001 copy of the data and make it null-terminated.
7002
7003 A QString is null-terminated by default, however in some cases (e.g.
7004 when using fromRawData()), the string data doesn't necessarily end
7005 with a \c {\0} character, which could be a problem when calling methods
7006 that expect a null-terminated string.
7007
7008 \sa nullTerminated(), fromRawData(), setRawData()
7009*/
7010QString &QString::nullTerminate()
7011{
7012 // ensure '\0'-termination for ::fromRawData strings
7013 if (!d.isMutable())
7014 *this = QString{constData(), size()};
7015 return *this;
7016}
7017
7018/*!
7019 \fn QString QString::nullTerminated() const &
7020 \fn QString QString::nullTerminated() &&
7021 \since 6.10
7022
7023 Returns a copy of this string that is always null-terminated.
7024
7025 \sa nullTerminate(), fromRawData(), setRawData()
7026*/
7027QString QString::nullTerminated() const &
7028{
7029 // ensure '\0'-termination for ::fromRawData strings
7030 if (!d.isMutable())
7031 return QString{constData(), size()};
7032 return *this;
7033}
7034
7035QString QString::nullTerminated() &&
7036{
7037 nullTerminate();
7038 return std::move(*this);
7039}
7040
7041/*!
7042 Returns a string of size \a width that contains this string
7043 padded by the \a fill character.
7044
7045 If \a truncate is \c false and the size() of the string is more than
7046 \a width, then the returned string is a copy of the string.
7047
7048 \snippet qstring/main.cpp 32
7049
7050 If \a truncate is \c true and the size() of the string is more than
7051 \a width, then any characters in a copy of the string after
7052 position \a width are removed, and the copy is returned.
7053
7054 \snippet qstring/main.cpp 33
7055
7056 \sa rightJustified()
7057*/
7058
7059QString QString::leftJustified(qsizetype width, QChar fill, bool truncate) const
7060{
7061 QString result;
7062 qsizetype len = size();
7063 qsizetype padlen = width - len;
7064 if (padlen > 0) {
7065 result.resize(len+padlen);
7066 if (len)
7067 memcpy(result.d.data(), d.data(), sizeof(QChar)*len);
7068 QChar *uc = (QChar*)result.d.data() + len;
7069 while (padlen--)
7070 * uc++ = fill;
7071 } else {
7072 if (truncate)
7073 result = left(width);
7074 else
7075 result = *this;
7076 }
7077 return result;
7078}
7079
7080/*!
7081 Returns a string of size() \a width that contains the \a fill
7082 character followed by the string. For example:
7083
7084 \snippet qstring/main.cpp 49
7085
7086 If \a truncate is \c false and the size() of the string is more than
7087 \a width, then the returned string is a copy of the string.
7088
7089 If \a truncate is true and the size() of the string is more than
7090 \a width, then the resulting string is truncated at position \a
7091 width.
7092
7093 \snippet qstring/main.cpp 50
7094
7095 \sa leftJustified()
7096*/
7097
7098QString QString::rightJustified(qsizetype width, QChar fill, bool truncate) const
7099{
7100 QString result;
7101 qsizetype len = size();
7102 qsizetype padlen = width - len;
7103 if (padlen > 0) {
7104 result.resize(len+padlen);
7105 QChar *uc = (QChar*)result.d.data();
7106 while (padlen--)
7107 * uc++ = fill;
7108 if (len)
7109 memcpy(static_cast<void *>(uc), static_cast<const void *>(d.data()), sizeof(QChar)*len);
7110 } else {
7111 if (truncate)
7112 result = left(width);
7113 else
7114 result = *this;
7115 }
7116 return result;
7117}
7118
7119/*!
7120 \fn QString QString::toLower() const
7121
7122 Returns a lowercase copy of the string.
7123
7124 \snippet qstring/main.cpp 75
7125
7126 The case conversion will always happen in the 'C' locale. For
7127 locale-dependent case folding use QLocale::toLower()
7128
7129 \sa toUpper(), QLocale::toLower()
7130*/
7131
7132namespace QUnicodeTables {
7133/*
7134 \internal
7135 Converts the \a str string starting from the position pointed to by the \a
7136 it iterator, using the Unicode case traits \c Traits, and returns the
7137 result. The input string must not be empty (the convertCase function below
7138 guarantees that).
7139
7140 The string type \c{T} is also a template and is either \c{const QString} or
7141 \c{QString}. This function can do both copy-conversion and in-place
7142 conversion depending on the state of the \a str parameter:
7143 \list
7144 \li \c{T} is \c{const QString}: copy-convert
7145 \li \c{T} is \c{QString} and its refcount != 1: copy-convert
7146 \li \c{T} is \c{QString} and its refcount == 1: in-place convert
7147 \endlist
7148
7149 In copy-convert mode, the local variable \c{s} is detached from the input
7150 \a str. In the in-place convert mode, \a str is in moved-from state and
7151 \c{s} contains the only copy of the string, without reallocation (thus,
7152 \a it is still valid).
7153
7154 There is one pathological case left: when the in-place conversion needs to
7155 reallocate memory to grow the buffer. In that case, we need to adjust the \a
7156 it pointer.
7157 */
7158template <typename T>
7159Q_NEVER_INLINE
7161{
7162 Q_ASSERT(!str.isEmpty());
7163 QString s = std::move(str); // will copy if T is const QString
7164 QChar *pp = s.begin() + it.index(); // will detach if necessary
7165
7166 do {
7167 const auto folded = fullConvertCase(it.next(), which);
7168 if (Q_UNLIKELY(folded.size() > 1)) {
7169 if (folded.chars[0] == *pp && folded.size() == 2) {
7170 // special case: only second actually changed (e.g. surrogate pairs),
7171 // avoid slow case
7172 ++pp;
7173 *pp++ = folded.chars[1];
7174 } else {
7175 // slow path: the string is growing
7176 qsizetype inpos = it.index() - 1;
7178
7179 s.replace(outpos, 1, reinterpret_cast<const QChar *>(folded.data()), folded.size());
7180 pp = const_cast<QChar *>(s.constBegin()) + outpos + folded.size();
7181
7182 // Adjust the input iterator if we are performing an in-place conversion
7183 if constexpr (!std::is_const<T>::value)
7185 }
7186 } else {
7187 *pp++ = folded.chars[0];
7188 }
7189 } while (it.hasNext());
7190
7191 return s;
7192}
7193
7194template <typename T>
7195static QString convertCase(T &str, QUnicodeTables::Case which)
7196{
7197 const QChar *p = str.constBegin();
7198 const QChar *e = p + str.size();
7199
7200 // this avoids out of bounds check in the loop
7201 while (e != p && e[-1].isHighSurrogate())
7202 --e;
7203
7204 QStringIterator it(p, e);
7205 while (it.hasNext()) {
7206 const char32_t uc = it.next();
7207 if (caseConversion(uc)[which].diff) {
7208 it.recede();
7209 return detachAndConvertCase(str, it, which);
7210 }
7211 }
7212 return std::move(str);
7213}
7214} // namespace QUnicodeTables
7215
7216QString QString::toLower_helper(const QString &str)
7217{
7218 return QUnicodeTables::convertCase(str, QUnicodeTables::LowerCase);
7219}
7220
7221QString QString::toLower_helper(QString &str)
7222{
7223 return QUnicodeTables::convertCase(str, QUnicodeTables::LowerCase);
7224}
7225
7226/*!
7227 \fn QString QString::toCaseFolded() const
7228
7229 Returns the case folded equivalent of the string. For most Unicode
7230 characters this is the same as toLower().
7231*/
7232
7233QString QString::toCaseFolded_helper(const QString &str)
7234{
7235 return QUnicodeTables::convertCase(str, QUnicodeTables::CaseFold);
7236}
7237
7238QString QString::toCaseFolded_helper(QString &str)
7239{
7240 return QUnicodeTables::convertCase(str, QUnicodeTables::CaseFold);
7241}
7242
7243/*!
7244 \fn QString QString::toUpper() const
7245
7246 Returns an uppercase copy of the string.
7247
7248 \snippet qstring/main.cpp 81
7249
7250 The case conversion will always happen in the 'C' locale. For
7251 locale-dependent case folding use QLocale::toUpper().
7252
7253 \note In some cases the uppercase form of a string may be longer than the
7254 original.
7255
7256 \note Since 2024, the German language officially prefers to uppercase ß
7257 (U+00DF LATIN SMALL LETTER SHARP S) as ẞ (U+1E9E LATIN CAPITAL LETTER SHARP S).
7258 Qt's implementation follows Unicode, which still mandates the use of "SS".
7259 If you need to implement the new German rules, you need to manually do
7260 \c{replace(u'ß', u'ẞ')} \e{before} calling this function.
7261
7262 \sa toLower(), QLocale::toLower()
7263*/
7264
7265QString QString::toUpper_helper(const QString &str)
7266{
7267 return QUnicodeTables::convertCase(str, QUnicodeTables::UpperCase);
7268}
7269
7270QString QString::toUpper_helper(QString &str)
7271{
7272 return QUnicodeTables::convertCase(str, QUnicodeTables::UpperCase);
7273}
7274
7275/*!
7276 \since 5.5
7277
7278 Safely builds a formatted string from the format string \a cformat
7279 and an arbitrary list of arguments.
7280
7281 The format string supports the conversion specifiers, length modifiers,
7282 and flags provided by printf() in the standard C++ library. The \a cformat
7283 string and \c{%s} arguments must be UTF-8 encoded.
7284
7285 \note The \c{%lc} escape sequence expects a unicode character of type
7286 \c char16_t (as returned by QChar::unicode()), or \c ushort.
7287 The \c{%ls} escape sequence expects a pointer to a zero-terminated array
7288 of unicode characters of type \c char16_t, or \c ushort (as returned by
7289 QString::utf16()). This is at odds with the printf() in the standard C++
7290 library, which defines \c {%lc} to print a wchar_t and \c{%ls} to print
7291 a \c{wchar_t*}, and might also produce compiler warnings on platforms
7292 where the size of \c {wchar_t} is not 16 bits.
7293
7294 \warning We do not recommend using QString::asprintf() in new Qt
7295 code. Instead, consider using QTextStream or arg(), both of
7296 which support Unicode strings seamlessly and are type-safe.
7297 Here is an example that uses QTextStream:
7298
7299 \snippet qstring/main.cpp 64
7300
7301 For \l {QObject::tr()}{translations}, especially if the strings
7302 contains more than one escape sequence, you should consider using
7303 the arg() function instead. This allows the order of the
7304 replacements to be controlled by the translator.
7305
7306 \sa arg()
7307*/
7308
7309QString QString::asprintf(const char *cformat, ...)
7310{
7311 va_list ap;
7312 va_start(ap, cformat);
7313 QString s = vasprintf(cformat, ap);
7314 va_end(ap);
7315 return s;
7316}
7317
7318static void append_utf8(QString &qs, const char *cs, qsizetype len)
7319{
7320 const qsizetype oldSize = qs.size();
7321 qs.resize(oldSize + len);
7322 const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, QByteArrayView(cs, len));
7323 qs.resize(newEnd - qs.constData());
7324}
7325
7326static uint parse_flag_characters(const char * &c) noexcept
7327{
7328 uint flags = QLocaleData::ZeroPadExponent;
7329 while (true) {
7330 switch (*c) {
7331 case '#':
7334 break;
7335 case '0': flags |= QLocaleData::ZeroPadded; break;
7336 case '-': flags |= QLocaleData::LeftAdjusted; break;
7337 case ' ': flags |= QLocaleData::BlankBeforePositive; break;
7338 case '+': flags |= QLocaleData::AlwaysShowSign; break;
7339 case '\'': flags |= QLocaleData::GroupDigits; break;
7340 default: return flags;
7341 }
7342 ++c;
7343 }
7344}
7345
7346static int parse_field_width(const char *&c, qsizetype size)
7347{
7348 Q_ASSERT(isAsciiDigit(*c));
7349 const char *const stop = c + size;
7350
7351 // can't be negative - started with a digit
7352 // contains at least one digit
7353 auto [result, used] = qstrntoull(c, size, 10);
7354 c += used;
7355 if (used <= 0)
7356 return false;
7357 // preserve Qt 5.5 behavior of consuming all digits, no matter how many
7358 while (c < stop && isAsciiDigit(*c))
7359 ++c;
7360 return result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
7361}
7362
7364
7365static inline bool can_consume(const char * &c, char ch) noexcept
7366{
7367 if (*c == ch) {
7368 ++c;
7369 return true;
7370 }
7371 return false;
7372}
7373
7374static LengthMod parse_length_modifier(const char * &c) noexcept
7375{
7376 switch (*c++) {
7377 case 'h': return can_consume(c, 'h') ? lm_hh : lm_h;
7378 case 'l': return can_consume(c, 'l') ? lm_ll : lm_l;
7379 case 'L': return lm_L;
7380 case 'j': return lm_j;
7381 case 'z':
7382 case 'Z': return lm_z;
7383 case 't': return lm_t;
7384 }
7385 --c; // don't consume *c - it wasn't a flag
7386 return lm_none;
7387}
7388
7389/*!
7390 \fn QString QString::vasprintf(const char *cformat, va_list ap)
7391 \since 5.5
7392
7393 Equivalent method to asprintf(), but takes a va_list \a ap
7394 instead a list of variable arguments. See the asprintf()
7395 documentation for an explanation of \a cformat.
7396
7397 This method does not call the va_end macro, the caller
7398 is responsible to call va_end on \a ap.
7399
7400 \sa asprintf()
7401*/
7402
7403QString QString::vasprintf(const char *cformat, va_list ap)
7404{
7405 if (!cformat || !*cformat) {
7406 // Qt 1.x compat
7407 return fromLatin1("");
7408 }
7409
7410 // Parse cformat
7411
7412 QString result;
7413 const char *c = cformat;
7414 const char *formatEnd = cformat + qstrlen(cformat);
7415 for (;;) {
7416 // Copy non-escape chars to result
7417 const char *cb = c;
7418 while (*c != '\0' && *c != '%')
7419 c++;
7420 append_utf8(result, cb, qsizetype(c - cb));
7421
7422 if (*c == '\0')
7423 break;
7424
7425 // Found '%'
7426 const char *escape_start = c;
7427 ++c;
7428
7429 if (*c == '\0') {
7430 result.append(u'%'); // a % at the end of the string - treat as non-escape text
7431 break;
7432 }
7433 if (*c == '%') {
7434 result.append(u'%'); // %%
7435 ++c;
7436 continue;
7437 }
7438
7439 uint flags = parse_flag_characters(c);
7440
7441 if (*c == '\0') {
7442 result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
7443 break;
7444 }
7445
7446 // Parse field width
7447 int width = -1; // -1 means unspecified
7448 if (isAsciiDigit(*c)) {
7449 width = parse_field_width(c, formatEnd - c);
7450 } else if (*c == '*') { // can't parse this in another function, not portably, at least
7451 width = va_arg(ap, int);
7452 if (width < 0)
7453 width = -1; // treat all negative numbers as unspecified
7454 ++c;
7455 }
7456
7457 if (*c == '\0') {
7458 result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
7459 break;
7460 }
7461
7462 // Parse precision
7463 int precision = -1; // -1 means unspecified
7464 if (*c == '.') {
7465 ++c;
7466 precision = 0;
7467 if (isAsciiDigit(*c)) {
7468 precision = parse_field_width(c, formatEnd - c);
7469 } else if (*c == '*') { // can't parse this in another function, not portably, at least
7470 precision = va_arg(ap, int);
7471 if (precision < 0)
7472 precision = -1; // treat all negative numbers as unspecified
7473 ++c;
7474 }
7475 }
7476
7477 if (*c == '\0') {
7478 result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
7479 break;
7480 }
7481
7482 const LengthMod length_mod = parse_length_modifier(c);
7483
7484 if (*c == '\0') {
7485 result.append(QLatin1StringView(escape_start)); // incomplete escape, treat as non-escape text
7486 break;
7487 }
7488
7489 // Parse the conversion specifier and do the conversion
7490 QString subst;
7491 switch (*c) {
7492 case 'd':
7493 case 'i': {
7494 qint64 i;
7495 switch (length_mod) {
7496 case lm_none: i = va_arg(ap, int); break;
7497 case lm_hh: i = va_arg(ap, int); break;
7498 case lm_h: i = va_arg(ap, int); break;
7499 case lm_l: i = va_arg(ap, long int); break;
7500 case lm_ll: i = va_arg(ap, qint64); break;
7501 case lm_j: i = va_arg(ap, long int); break;
7502
7503 /* ptrdiff_t actually, but it should be the same for us */
7504 case lm_z: i = va_arg(ap, qsizetype); break;
7505 case lm_t: i = va_arg(ap, qsizetype); break;
7506 default: i = 0; break;
7507 }
7508 subst = QLocaleData::c()->longLongToString(i, precision, 10, width, flags);
7509 ++c;
7510 break;
7511 }
7512 case 'o':
7513 case 'u':
7514 case 'x':
7515 case 'X': {
7516 quint64 u;
7517 switch (length_mod) {
7518 case lm_none: u = va_arg(ap, uint); break;
7519 case lm_hh: u = va_arg(ap, uint); break;
7520 case lm_h: u = va_arg(ap, uint); break;
7521 case lm_l: u = va_arg(ap, ulong); break;
7522 case lm_ll: u = va_arg(ap, quint64); break;
7523 case lm_t: u = va_arg(ap, size_t); break;
7524 case lm_z: u = va_arg(ap, size_t); break;
7525 default: u = 0; break;
7526 }
7527
7528 if (isAsciiUpper(*c))
7529 flags |= QLocaleData::CapitalEorX;
7530
7531 int base = 10;
7532 switch (QtMiscUtils::toAsciiLower(*c)) {
7533 case 'o':
7534 base = 8; break;
7535 case 'u':
7536 base = 10; break;
7537 case 'x':
7538 base = 16; break;
7539 default: break;
7540 }
7541 subst = QLocaleData::c()->unsLongLongToString(u, precision, base, width, flags);
7542 ++c;
7543 break;
7544 }
7545 case 'E':
7546 case 'e':
7547 case 'F':
7548 case 'f':
7549 case 'G':
7550 case 'g':
7551 case 'A':
7552 case 'a': {
7553 double d;
7554 if (length_mod == lm_L)
7555 d = va_arg(ap, long double); // not supported - converted to a double
7556 else
7557 d = va_arg(ap, double);
7558
7559 if (isAsciiUpper(*c))
7560 flags |= QLocaleData::CapitalEorX;
7561
7562 QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
7563 switch (QtMiscUtils::toAsciiLower(*c)) {
7564 case 'e': form = QLocaleData::DFExponent; break;
7565 case 'a': // not supported - decimal form used instead
7566 case 'f': form = QLocaleData::DFDecimal; break;
7567 case 'g': form = QLocaleData::DFSignificantDigits; break;
7568 default: break;
7569 }
7570 subst = QLocaleData::c()->doubleToString(d, precision, form, width, flags);
7571 ++c;
7572 break;
7573 }
7574 case 'c': {
7575 if (length_mod == lm_l)
7576 subst = QChar::fromUcs2(va_arg(ap, int));
7577 else
7578 subst = QLatin1Char((uchar) va_arg(ap, int));
7579 ++c;
7580 break;
7581 }
7582 case 's': {
7583 if (length_mod == lm_l) {
7584 const char16_t *buff = va_arg(ap, const char16_t*);
7585 const auto *ch = buff;
7586 while (precision != 0 && *ch != 0) {
7587 ++ch;
7588 --precision;
7589 }
7590 subst.setUtf16(buff, ch - buff);
7591 } else if (precision == -1) {
7592 subst = QString::fromUtf8(va_arg(ap, const char*));
7593 } else {
7594 const char *buff = va_arg(ap, const char*);
7595 subst = QString::fromUtf8(buff, qstrnlen(buff, precision));
7596 }
7597 ++c;
7598 break;
7599 }
7600 case 'p': {
7601 void *arg = va_arg(ap, void*);
7602 const quint64 i = reinterpret_cast<quintptr>(arg);
7603 flags |= QLocaleData::ShowBase;
7604 subst = QLocaleData::c()->unsLongLongToString(i, precision, 16, width, flags);
7605 ++c;
7606 break;
7607 }
7608 case 'n':
7609 switch (length_mod) {
7610 case lm_hh: {
7611 signed char *n = va_arg(ap, signed char*);
7612 *n = result.size();
7613 break;
7614 }
7615 case lm_h: {
7616 short int *n = va_arg(ap, short int*);
7617 *n = result.size();
7618 break;
7619 }
7620 case lm_l: {
7621 long int *n = va_arg(ap, long int*);
7622 *n = result.size();
7623 break;
7624 }
7625 case lm_ll: {
7626 qint64 *n = va_arg(ap, qint64*);
7627 *n = result.size();
7628 break;
7629 }
7630 default: {
7631 int *n = va_arg(ap, int*);
7632 *n = int(result.size());
7633 break;
7634 }
7635 }
7636 ++c;
7637 break;
7638
7639 default: // bad escape, treat as non-escape text
7640 for (const char *cc = escape_start; cc != c; ++cc)
7641 result.append(QLatin1Char(*cc));
7642 continue;
7643 }
7644
7645 if (flags & QLocaleData::LeftAdjusted)
7646 result.append(subst.leftJustified(width));
7647 else
7648 result.append(subst.rightJustified(width));
7649 }
7650
7651 return result;
7652}
7653
7654/*!
7655 \fn QString::toLongLong(bool *ok, int base) const
7656
7657 Returns the string converted to a \c{long long} using base \a
7658 base, which is 10 by default and must be between 2 and 36, or 0.
7659 Returns 0 if the conversion fails.
7660
7661 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7662 to \c false, and success by setting *\a{ok} to \c true.
7663
7664 If \a base is 0, the C language convention is used: if the string begins
7665 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7666 2 is used; otherwise, if the string begins with "0", base 8 is used;
7667 otherwise, base 10 is used.
7668
7669 The string conversion will always happen in the 'C' locale. For
7670 locale-dependent conversion use QLocale::toLongLong()
7671
7672 Example:
7673
7674 \snippet qstring/main.cpp 74
7675
7676 This function ignores leading and trailing whitespace.
7677
7678 \note Support for the "0b" prefix was added in Qt 6.4.
7679
7680 \sa number(), toULongLong(), toInt(), QLocale::toLongLong()
7681*/
7682
7683template <typename Int>
7684static Int toIntegral(QStringView string, bool *ok, int base)
7685{
7686#if defined(QT_CHECK_RANGE)
7687 if (base != 0 && (base < 2 || base > 36)) {
7688 qWarning("QString::toIntegral: Invalid base (%d)", base);
7689 base = 10;
7690 }
7691#endif
7692
7693 QVarLengthArray<uchar> latin1(string.size());
7694 qt_to_latin1(latin1.data(), string.utf16(), string.size());
7695 QSimpleParsedNumber<Int> r;
7696 if constexpr (std::is_signed_v<Int>)
7697 r = QLocaleData::bytearrayToLongLong(latin1, base);
7698 else
7699 r = QLocaleData::bytearrayToUnsLongLong(latin1, base);
7700 if (ok)
7701 *ok = r.ok();
7702 return r.result;
7703}
7704
7705qlonglong QString::toIntegral_helper(QStringView string, bool *ok, int base)
7706{
7707 return toIntegral<qlonglong>(string, ok, base);
7708}
7709
7710/*!
7711 \fn QString::toULongLong(bool *ok, int base) const
7712
7713 Returns the string converted to an \c{unsigned long long} using base \a
7714 base, which is 10 by default and must be between 2 and 36, or 0.
7715 Returns 0 if the conversion fails.
7716
7717 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7718 to \c false, and success by setting *\a{ok} to \c true.
7719
7720 If \a base is 0, the C language convention is used: if the string begins
7721 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7722 2 is used; otherwise, if the string begins with "0", base 8 is used;
7723 otherwise, base 10 is used.
7724
7725 The string conversion will always happen in the 'C' locale. For
7726 locale-dependent conversion use QLocale::toULongLong()
7727
7728 Example:
7729
7730 \snippet qstring/main.cpp 79
7731
7732 This function ignores leading and trailing whitespace.
7733
7734 \note Support for the "0b" prefix was added in Qt 6.4.
7735
7736 \sa number(), toLongLong(), QLocale::toULongLong()
7737*/
7738
7739qulonglong QString::toIntegral_helper(QStringView string, bool *ok, uint base)
7740{
7741 return toIntegral<qulonglong>(string, ok, base);
7742}
7743
7744/*!
7745 \fn long QString::toLong(bool *ok, int base) const
7746
7747 Returns the string converted to a \c long using base \a
7748 base, which is 10 by default and must be between 2 and 36, or 0.
7749 Returns 0 if the conversion fails.
7750
7751 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7752 to \c false, and success by setting *\a{ok} to \c true.
7753
7754 If \a base is 0, the C language convention is used: if the string begins
7755 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7756 2 is used; otherwise, if the string begins with "0", base 8 is used;
7757 otherwise, base 10 is used.
7758
7759 The string conversion will always happen in the 'C' locale. For
7760 locale-dependent conversion use QLocale::toLongLong()
7761
7762 Example:
7763
7764 \snippet qstring/main.cpp 73
7765
7766 This function ignores leading and trailing whitespace.
7767
7768 \note Support for the "0b" prefix was added in Qt 6.4.
7769
7770 \sa number(), toULong(), toInt(), QLocale::toInt()
7771*/
7772
7773/*!
7774 \fn ulong QString::toULong(bool *ok, int base) const
7775
7776 Returns the string converted to an \c{unsigned long} using base \a
7777 base, which is 10 by default and must be between 2 and 36, or 0.
7778 Returns 0 if the conversion fails.
7779
7780 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7781 to \c false, and success by setting *\a{ok} to \c true.
7782
7783 If \a base is 0, the C language convention is used: if the string begins
7784 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7785 2 is used; otherwise, if the string begins with "0", base 8 is used;
7786 otherwise, base 10 is used.
7787
7788 The string conversion will always happen in the 'C' locale. For
7789 locale-dependent conversion use QLocale::toULongLong()
7790
7791 Example:
7792
7793 \snippet qstring/main.cpp 78
7794
7795 This function ignores leading and trailing whitespace.
7796
7797 \note Support for the "0b" prefix was added in Qt 6.4.
7798
7799 \sa number(), QLocale::toUInt()
7800*/
7801
7802/*!
7803 \fn int QString::toInt(bool *ok, int base) const
7804 Returns the string converted to an \c int using base \a
7805 base, which is 10 by default and must be between 2 and 36, or 0.
7806 Returns 0 if the conversion fails.
7807
7808 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7809 to \c false, and success by setting *\a{ok} to \c true.
7810
7811 If \a base is 0, the C language convention is used: if the string begins
7812 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7813 2 is used; otherwise, if the string begins with "0", base 8 is used;
7814 otherwise, base 10 is used.
7815
7816 The string conversion will always happen in the 'C' locale. For
7817 locale-dependent conversion use QLocale::toInt()
7818
7819 Example:
7820
7821 \snippet qstring/main.cpp 72
7822
7823 This function ignores leading and trailing whitespace.
7824
7825 \note Support for the "0b" prefix was added in Qt 6.4.
7826
7827 \sa number(), toUInt(), toDouble(), QLocale::toInt()
7828*/
7829
7830/*!
7831 \fn uint QString::toUInt(bool *ok, int base) const
7832 Returns the string converted to an \c{unsigned int} using base \a
7833 base, which is 10 by default and must be between 2 and 36, or 0.
7834 Returns 0 if the conversion fails.
7835
7836 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7837 to \c false, and success by setting *\a{ok} to \c true.
7838
7839 If \a base is 0, the C language convention is used: if the string begins
7840 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7841 2 is used; otherwise, if the string begins with "0", base 8 is used;
7842 otherwise, base 10 is used.
7843
7844 The string conversion will always happen in the 'C' locale. For
7845 locale-dependent conversion use QLocale::toUInt()
7846
7847 Example:
7848
7849 \snippet qstring/main.cpp 77
7850
7851 This function ignores leading and trailing whitespace.
7852
7853 \note Support for the "0b" prefix was added in Qt 6.4.
7854
7855 \sa number(), toInt(), QLocale::toUInt()
7856*/
7857
7858/*!
7859 \fn short QString::toShort(bool *ok, int base) const
7860
7861 Returns the string converted to a \c short using base \a
7862 base, which is 10 by default and must be between 2 and 36, or 0.
7863 Returns 0 if the conversion fails.
7864
7865 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7866 to \c false, and success by setting *\a{ok} to \c true.
7867
7868 If \a base is 0, the C language convention is used: if the string begins
7869 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7870 2 is used; otherwise, if the string begins with "0", base 8 is used;
7871 otherwise, base 10 is used.
7872
7873 The string conversion will always happen in the 'C' locale. For
7874 locale-dependent conversion use QLocale::toShort()
7875
7876 Example:
7877
7878 \snippet qstring/main.cpp 76
7879
7880 This function ignores leading and trailing whitespace.
7881
7882 \note Support for the "0b" prefix was added in Qt 6.4.
7883
7884 \sa number(), toUShort(), toInt(), QLocale::toShort()
7885*/
7886
7887/*!
7888 \fn ushort QString::toUShort(bool *ok, int base) const
7889
7890 Returns the string converted to an \c{unsigned short} using base \a
7891 base, which is 10 by default and must be between 2 and 36, or 0.
7892 Returns 0 if the conversion fails.
7893
7894 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7895 to \c false, and success by setting *\a{ok} to \c true.
7896
7897 If \a base is 0, the C language convention is used: if the string begins
7898 with "0x", base 16 is used; otherwise, if the string begins with "0b", base
7899 2 is used; otherwise, if the string begins with "0", base 8 is used;
7900 otherwise, base 10 is used.
7901
7902 The string conversion will always happen in the 'C' locale. For
7903 locale-dependent conversion use QLocale::toUShort()
7904
7905 Example:
7906
7907 \snippet qstring/main.cpp 80
7908
7909 This function ignores leading and trailing whitespace.
7910
7911 \note Support for the "0b" prefix was added in Qt 6.4.
7912
7913 \sa number(), toShort(), QLocale::toUShort()
7914*/
7915
7916/*!
7917 Returns the string converted to a \c double value.
7918
7919 Returns an infinity if the conversion overflows or 0.0 if the
7920 conversion fails for other reasons (e.g. underflow).
7921
7922 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7923 to \c false, and success by setting *\a{ok} to \c true.
7924
7925 \snippet qstring/main.cpp 66
7926
7927 \warning The QString content may only contain valid numerical characters
7928 which includes the plus/minus sign, the character e used in scientific
7929 notation, and the decimal point. Including the unit or additional characters
7930 leads to a conversion error.
7931
7932 \snippet qstring/main.cpp 67
7933
7934 The string conversion will always happen in the 'C' locale. For
7935 locale-dependent conversion use QLocale::toDouble()
7936
7937 \snippet qstring/main.cpp 68
7938
7939 For historical reasons, this function does not handle
7940 thousands group separators. If you need to convert such numbers,
7941 use QLocale::toDouble().
7942
7943 \snippet qstring/main.cpp 69
7944
7945 This function ignores leading and trailing whitespace.
7946
7947 \sa number(), QLocale::setDefault(), QLocale::toDouble(), trimmed()
7948*/
7949
7950double QString::toDouble(bool *ok) const
7951{
7952 return QStringView(*this).toDouble(ok);
7953}
7954
7955double QStringView::toDouble(bool *ok) const
7956{
7957 QStringView string = qt_trimmed(*this);
7958 QVarLengthArray<uchar> latin1(string.size());
7959 qt_to_latin1(latin1.data(), string.utf16(), string.size());
7960 auto r = qt_asciiToDouble(reinterpret_cast<const char *>(latin1.data()), string.size());
7961 if (ok != nullptr)
7962 *ok = r.ok();
7963 return r.result;
7964}
7965
7966/*!
7967 Returns the string converted to a \c float value.
7968
7969 Returns an infinity if the conversion overflows or 0.0 if the
7970 conversion fails for other reasons (e.g. underflow).
7971
7972 If \a ok is not \nullptr, failure is reported by setting *\a{ok}
7973 to \c false, and success by setting *\a{ok} to \c true.
7974
7975 \warning The QString content may only contain valid numerical characters
7976 which includes the plus/minus sign, the character e used in scientific
7977 notation, and the decimal point. Including the unit or additional characters
7978 leads to a conversion error.
7979
7980 The string conversion will always happen in the 'C' locale. For
7981 locale-dependent conversion use QLocale::toFloat()
7982
7983 For historical reasons, this function does not handle
7984 thousands group separators. If you need to convert such numbers,
7985 use QLocale::toFloat().
7986
7987 Example:
7988
7989 \snippet qstring/main.cpp 71
7990
7991 This function ignores leading and trailing whitespace.
7992
7993 \sa number(), toDouble(), toInt(), QLocale::toFloat(), trimmed()
7994*/
7995
7996float QString::toFloat(bool *ok) const
7997{
7998 return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
7999}
8000
8001float QStringView::toFloat(bool *ok) const
8002{
8003 return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
8004}
8005
8006/*! \fn QString &QString::setNum(int n, int base)
8007
8008 Sets the string to the printed value of \a n in the specified \a
8009 base, and returns a reference to the string.
8010
8011 The base is 10 by default and must be between 2 and 36.
8012
8013 \snippet qstring/main.cpp 56
8014
8015 The formatting always uses QLocale::C, i.e., English/UnitedStates.
8016 To get a localized string representation of a number, use
8017 QLocale::toString() with the appropriate locale.
8018
8019 \sa number()
8020*/
8021
8022/*! \fn QString &QString::setNum(uint n, int base)
8023
8024 \overload
8025*/
8026
8027/*! \fn QString &QString::setNum(long n, int base)
8028
8029 \overload
8030*/
8031
8032/*! \fn QString &QString::setNum(ulong n, int base)
8033
8034 \overload
8035*/
8036
8037/*!
8038 \overload
8039*/
8040QString &QString::setNum(qlonglong n, int base)
8041{
8042 return *this = number(n, base);
8043}
8044
8045/*!
8046 \overload
8047*/
8048QString &QString::setNum(qulonglong n, int base)
8049{
8050 return *this = number(n, base);
8051}
8052
8053/*! \fn QString &QString::setNum(short n, int base)
8054
8055 \overload
8056*/
8057
8058/*! \fn QString &QString::setNum(ushort n, int base)
8059
8060 \overload
8061*/
8062
8063/*!
8064 \overload
8065
8066 Sets the string to the printed value of \a n, formatted according to the
8067 given \a format and \a precision, and returns a reference to the string.
8068
8069 \sa number(), QLocale::FloatingPointPrecisionOption, {Number formats}
8070*/
8071
8072QString &QString::setNum(double n, char format, int precision)
8073{
8074 return *this = number(n, format, precision);
8075}
8076
8077/*!
8078 \fn QString &QString::setNum(float n, char format, int precision)
8079 \overload
8080
8081 Sets the string to the printed value of \a n, formatted according
8082 to the given \a format and \a precision, and returns a reference
8083 to the string.
8084
8085 The formatting always uses QLocale::C, i.e., English/UnitedStates.
8086 To get a localized string representation of a number, use
8087 QLocale::toString() with the appropriate locale.
8088
8089 \sa number()
8090*/
8091
8092
8093/*!
8094 \fn QString QString::number(long n, int base)
8095
8096 Returns a string equivalent of the number \a n according to the
8097 specified \a base.
8098
8099 The base is 10 by default and must be between 2
8100 and 36. For bases other than 10, \a n is treated as an
8101 unsigned integer.
8102
8103 The formatting always uses QLocale::C, i.e., English/UnitedStates.
8104 To get a localized string representation of a number, use
8105 QLocale::toString() with the appropriate locale.
8106
8107 \snippet qstring/main.cpp 35
8108
8109 \sa setNum()
8110*/
8111
8112QString QString::number(long n, int base)
8113{
8114 return number(qlonglong(n), base);
8115}
8116
8117/*!
8118 \fn QString QString::number(ulong n, int base)
8119
8120 \overload
8121*/
8122QString QString::number(ulong n, int base)
8123{
8124 return number(qulonglong(n), base);
8125}
8126
8127/*!
8128 \overload
8129*/
8130QString QString::number(int n, int base)
8131{
8132 return number(qlonglong(n), base);
8133}
8134
8135/*!
8136 \overload
8137*/
8138QString QString::number(uint n, int base)
8139{
8140 return number(qulonglong(n), base);
8141}
8142
8143/*!
8144 \overload
8145*/
8146QString QString::number(qlonglong n, int base)
8147{
8148#if defined(QT_CHECK_RANGE)
8149 if (base < 2 || base > 36) {
8150 qWarning("QString::setNum: Invalid base (%d)", base);
8151 base = 10;
8152 }
8153#endif
8154 bool negative = n < 0;
8155 /*
8156 Negating std::numeric_limits<qlonglong>::min() hits undefined behavior, so
8157 taking an absolute value has to take a slight detour.
8158 */
8159 return qulltoBasicLatin(negative ? 1u + qulonglong(-(n + 1)) : qulonglong(n), base, negative);
8160}
8161
8162/*!
8163 \overload
8164*/
8165QString QString::number(qulonglong n, int base)
8166{
8167#if defined(QT_CHECK_RANGE)
8168 if (base < 2 || base > 36) {
8169 qWarning("QString::setNum: Invalid base (%d)", base);
8170 base = 10;
8171 }
8172#endif
8173 return qulltoBasicLatin(n, base, false);
8174}
8175
8176
8177/*!
8178 Returns a string representing the floating-point number \a n.
8179
8180 Returns a string that represents \a n, formatted according to the specified
8181 \a format and \a precision.
8182
8183 For formats with an exponent, the exponent will show its sign and have at
8184 least two digits, left-padding the exponent with zero if needed.
8185
8186 \sa setNum(), QLocale::toString(), QLocale::FloatingPointPrecisionOption, {Number formats}
8187*/
8188QString QString::number(double n, char format, int precision)
8189{
8190 QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
8191
8192 switch (QtMiscUtils::toAsciiLower(format)) {
8193 case 'f':
8194 form = QLocaleData::DFDecimal;
8195 break;
8196 case 'e':
8197 form = QLocaleData::DFExponent;
8198 break;
8199 case 'g':
8200 form = QLocaleData::DFSignificantDigits;
8201 break;
8202 default:
8203#if defined(QT_CHECK_RANGE)
8204 qWarning("QString::setNum: Invalid format char '%c'", format);
8205#endif
8206 break;
8207 }
8208
8209 return qdtoBasicLatin(n, form, precision, isAsciiUpper(format));
8210}
8211
8212namespace {
8213template<class ResultList, class StringSource>
8214static ResultList splitString(const StringSource &source, QStringView sep,
8215 Qt::SplitBehavior behavior, Qt::CaseSensitivity cs)
8216{
8217 ResultList list;
8218 typename StringSource::size_type start = 0;
8219 typename StringSource::size_type end;
8220 typename StringSource::size_type extra = 0;
8221 while ((end = QtPrivate::findString(QStringView(source.constData(), source.size()), start + extra, sep, cs)) != -1) {
8222 if (start != end || behavior == Qt::KeepEmptyParts)
8223 list.append(source.sliced(start, end - start));
8224 start = end + sep.size();
8225 extra = (sep.size() == 0 ? 1 : 0);
8226 }
8227 if (start != source.size() || behavior == Qt::KeepEmptyParts)
8228 list.append(source.sliced(start));
8229 return list;
8230}
8231
8232} // namespace
8233
8234/*!
8235 Splits the string into substrings wherever \a sep occurs, and
8236 returns the list of those strings. If \a sep does not match
8237 anywhere in the string, split() returns a single-element list
8238 containing this string.
8239
8240 \a cs specifies whether \a sep should be matched case
8241 sensitively or case insensitively.
8242
8243 If \a behavior is Qt::SkipEmptyParts, empty entries don't
8244 appear in the result. By default, empty entries are kept.
8245
8246 Example:
8247
8248 \snippet qstring/main.cpp 62
8249
8250 If \a sep is empty, split() returns an empty string, followed
8251 by each of the string's characters, followed by another empty string:
8252
8253 \snippet qstring/main.cpp 62-empty
8254
8255 To understand this behavior, recall that the empty string matches
8256 everywhere, so the above is qualitatively the same as:
8257
8258 \snippet qstring/main.cpp 62-slashes
8259
8260 \sa QStringList::join(), section()
8261
8262 \since 5.14
8263*/
8264QStringList QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8265{
8266 return splitString<QStringList>(*this, sep, behavior, cs);
8267}
8268
8269/*!
8270 \overload
8271 \since 5.14
8272*/
8273QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8274{
8275 return splitString<QStringList>(*this, QStringView(&sep, 1), behavior, cs);
8276}
8277
8278/*!
8279 \fn QList<QStringView> QStringView::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8280 \fn QList<QStringView> QStringView::split(QStringView sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8281
8282
8283 Splits the view into substring views wherever \a sep occurs, and
8284 returns the list of those string views.
8285
8286 See QString::split() for how \a sep, \a behavior and \a cs interact to form
8287 the result.
8288
8289 \note All the returned views are valid as long as the data referenced by
8290 this string view is valid. Destroying the data will cause all views to
8291 become dangling.
8292
8293 \since 6.0
8294*/
8295QList<QStringView> QStringView::split(QStringView sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8296{
8297 return splitString<QList<QStringView>>(QStringView(*this), sep, behavior, cs);
8298}
8299
8300QList<QStringView> QStringView::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
8301{
8302 return split(QStringView(&sep, 1), behavior, cs);
8303}
8304
8305#if QT_CONFIG(regularexpression)
8306namespace {
8307template<class ResultList, typename String, typename MatchingFunction>
8308static ResultList splitString(const String &source, const QRegularExpression &re,
8309 MatchingFunction matchingFunction,
8310 Qt::SplitBehavior behavior)
8311{
8312 ResultList list;
8313 if (!re.isValid()) {
8314 qtWarnAboutInvalidRegularExpression(re, "QString", "split");
8315 return list;
8316 }
8317
8318 qsizetype start = 0;
8319 qsizetype end = 0;
8320 QRegularExpressionMatchIterator iterator = (re.*matchingFunction)(source, 0, QRegularExpression::NormalMatch, QRegularExpression::NoMatchOption);
8321 while (iterator.hasNext()) {
8322 QRegularExpressionMatch match = iterator.next();
8323 end = match.capturedStart();
8324 if (start != end || behavior == Qt::KeepEmptyParts)
8325 list.append(source.sliced(start, end - start));
8326 start = match.capturedEnd();
8327 }
8328
8329 if (start != source.size() || behavior == Qt::KeepEmptyParts)
8330 list.append(source.sliced(start));
8331
8332 return list;
8333}
8334} // namespace
8335
8336/*!
8337 \overload
8338 \since 5.14
8339
8340 Splits the string into substrings wherever the regular expression
8341 \a re matches, and returns the list of those strings. If \a re
8342 does not match anywhere in the string, split() returns a
8343 single-element list containing this string.
8344
8345 Here is an example where we extract the words in a sentence
8346 using one or more whitespace characters as the separator:
8347
8348 \snippet qstring/main.cpp 90
8349
8350 Here is a similar example, but this time we use any sequence of
8351 non-word characters as the separator:
8352
8353 \snippet qstring/main.cpp 91
8354
8355 Here is a third example where we use a zero-length assertion,
8356 \b{\\b} (word boundary), to split the string into an
8357 alternating sequence of non-word and word tokens:
8358
8359 \snippet qstring/main.cpp 92
8360
8361 \sa QStringList::join(), section()
8362*/
8363QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
8364{
8365#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
8366 const auto matchingFunction = qOverload<const QString &, qsizetype, QRegularExpression::MatchType, QRegularExpression::MatchOptions>(&QRegularExpression::globalMatch);
8367#else
8368 const auto matchingFunction = &QRegularExpression::globalMatch;
8369#endif
8370 return splitString<QStringList>(*this,
8371 re,
8372 matchingFunction,
8373 behavior);
8374}
8375
8376/*!
8377 \overload
8378 \since 6.0
8379
8380 Splits the string into substring views wherever the regular expression \a re
8381 matches, and returns the list of those strings. If \a re does not match
8382 anywhere in the string, split() returns a single-element list containing
8383 this string as view.
8384
8385 \note The views in the returned list are sub-views of this view; as such,
8386 they reference the same data as it and only remain valid for as long as that
8387 data remains live.
8388*/
8389QList<QStringView> QStringView::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const
8390{
8391 return splitString<QList<QStringView>>(*this, re, &QRegularExpression::globalMatchView, behavior);
8392}
8393
8394#endif // QT_CONFIG(regularexpression)
8395
8396/*!
8397 \enum QString::NormalizationForm
8398
8399 This enum describes the various normalized forms of Unicode text.
8400
8401 \value NormalizationForm_D Canonical Decomposition
8402 \value NormalizationForm_C Canonical Decomposition followed by Canonical Composition
8403 \value NormalizationForm_KD Compatibility Decomposition
8404 \value NormalizationForm_KC Compatibility Decomposition followed by Canonical Composition
8405
8406 \sa normalized(),
8407 {https://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15}
8408*/
8409
8410/*!
8411 \since 4.5
8412
8413 Returns a copy of this string repeated the specified number of \a times.
8414
8415 If \a times is less than 1, an empty string is returned.
8416
8417 Example:
8418
8419 \snippet code/src_corelib_text_qstring.cpp 8
8420*/
8421QString QString::repeated(qsizetype times) const
8422{
8423 if (d.size == 0)
8424 return *this;
8425
8426 if (times <= 1) {
8427 if (times == 1)
8428 return *this;
8429 return QString();
8430 }
8431
8432 const qsizetype resultSize = times * d.size;
8433
8434 QString result;
8435 result.reserve(resultSize);
8436 if (result.capacity() != resultSize)
8437 return QString(); // not enough memory
8438
8439 memcpy(result.d.data(), d.data(), d.size * sizeof(QChar));
8440
8441 qsizetype sizeSoFar = d.size;
8442 char16_t *end = result.d.data() + sizeSoFar;
8443
8444 const qsizetype halfResultSize = resultSize >> 1;
8445 while (sizeSoFar <= halfResultSize) {
8446 memcpy(end, result.d.data(), sizeSoFar * sizeof(QChar));
8447 end += sizeSoFar;
8448 sizeSoFar <<= 1;
8449 }
8450 memcpy(end, result.d.data(), (resultSize - sizeSoFar) * sizeof(QChar));
8451 result.d.data()[resultSize] = '\0';
8452 result.d.size = resultSize;
8453 return result;
8454}
8455
8456void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, qsizetype from)
8457{
8458 {
8459 // check if it's fully ASCII first, because then we have no work
8460 auto start = reinterpret_cast<const char16_t *>(data->constData());
8461 const char16_t *p = start + from;
8462 if (isAscii_helper(p, p + data->size() - from))
8463 return;
8464 if (p > start + from)
8465 from = p - start - 1; // need one before the non-ASCII to perform NFC
8466 }
8467
8468 if (version == QChar::Unicode_Unassigned) {
8469 version = QChar::currentUnicodeVersion();
8470 } else if (int(version) <= NormalizationCorrectionsVersionMax) {
8471 const QString &s = *data;
8472 QChar *d = nullptr;
8474 if (n.version > version) {
8475 qsizetype pos = from;
8476 if (QChar::requiresSurrogates(n.ucs4)) {
8477 char16_t ucs4High = QChar::highSurrogate(n.ucs4);
8478 char16_t ucs4Low = QChar::lowSurrogate(n.ucs4);
8479
8480 // scan for this codepoint
8481 for ( ; pos < s.size() - 1; ++pos) {
8482 if (s.at(pos).unicode() == ucs4High && s.at(pos + 1).unicode() == ucs4Low)
8483 break;
8484 }
8485 if (pos == s.size())
8486 continue; // no correction necessary
8487
8488 // detach if necessary
8489 if (!d)
8490 d = data->data();
8491 if (QChar::requiresSurrogates(n.old_mapping)) {
8492 // no shrinking
8493 char16_t oldHigh = QChar::highSurrogate(n.old_mapping);
8494 char16_t oldLow = QChar::lowSurrogate(n.old_mapping);
8495 while (pos < s.size() - 1) {
8496 if (s.at(pos).unicode() == ucs4High && s.at(pos + 1).unicode() == ucs4Low) {
8497 d[pos] = QChar(oldHigh);
8498 d[++pos] = QChar(oldLow);
8499 }
8500 ++pos;
8501 }
8502 } else {
8503 // shrinking, so a little harder
8504 char16_t old = char16_t(n.old_mapping);
8505 qsizetype outpos = pos;
8506 for ( ; pos < s.size(); ++outpos, ++pos) {
8507 if (pos < s.size() - 1 && s.at(pos).unicode() == ucs4High
8508 && s.at(pos + 1).unicode() == ucs4Low) {
8509 d[outpos] = QChar(old);
8510 ++pos;
8511 }
8512 }
8513 data->truncate(outpos);
8514 d = nullptr;
8515 }
8516 } else {
8517 Q_ASSERT(!QChar::requiresSurrogates(n.old_mapping)); // BMP maps to BMP
8518 while (pos < s.size()) {
8519 if (s.at(pos).unicode() == n.ucs4) {
8520 if (!d)
8521 d = data->data();
8522 d[pos] = QChar(n.old_mapping);
8523 }
8524 ++pos;
8525 }
8526 }
8527 }
8528 }
8529 }
8530
8531 if (normalizationQuickCheckHelper(data, mode, from, &from))
8532 return;
8533
8534 decomposeHelper(data, mode < QString::NormalizationForm_KD, version, from);
8535
8536 canonicalOrderHelper(data, version, from);
8537
8538 if (mode == QString::NormalizationForm_D || mode == QString::NormalizationForm_KD)
8539 return;
8540
8541 composeHelper(data, version, from);
8542}
8543
8544/*!
8545 Returns the string in the given Unicode normalization \a mode,
8546 according to the given \a version of the Unicode standard.
8547*/
8548QString QString::normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const
8549{
8550 QString copy = *this;
8551 qt_string_normalize(&copy, mode, version, 0);
8552 return copy;
8553}
8554
8555#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
8556static void checkArgEscape(QStringView s)
8557{
8558 // If we're in here, it means that qArgDigitValue has accepted the
8559 // digit. We can skip the check in case we already know it will
8560 // succeed.
8561 if (!supportUnicodeDigitValuesInArg())
8562 return;
8563
8564 const auto isNonAsciiDigit = [](QChar c) {
8565 return c.unicode() < u'0' || c.unicode() > u'9';
8566 };
8567
8568 if (std::any_of(s.begin(), s.end(), isNonAsciiDigit)) {
8569 const auto accumulateDigit = [](int partial, QChar digit) {
8570 return partial * 10 + digit.digitValue();
8571 };
8572 const int parsedNumber = std::accumulate(s.begin(), s.end(), 0, accumulateDigit);
8573
8574 qWarning("QString::arg(): the replacement \"%%%ls\" contains non-ASCII digits;\n"
8575 " it is currently being interpreted as the %d-th substitution.\n"
8576 " This is deprecated; support for non-ASCII digits will be dropped\n"
8577 " in a future version of Qt.",
8578 qUtf16Printable(s.toString()),
8579 parsedNumber);
8580 }
8581}
8582#endif
8583
8585{
8586 int min_escape; // lowest escape sequence number
8587 qsizetype occurrences; // number of occurrences of the lowest escape sequence number
8588 qsizetype locale_occurrences; // number of occurrences of the lowest escape sequence number that
8589 // contain 'L'
8590 qsizetype escape_len; // total length of escape sequences which will be replaced
8591};
8592
8593static ArgEscapeData findArgEscapes(QStringView s)
8594{
8595 const QChar *uc_begin = s.begin();
8596 const QChar *uc_end = s.end();
8597
8598 ArgEscapeData d;
8599
8600 d.min_escape = INT_MAX;
8601 d.occurrences = 0;
8602 d.escape_len = 0;
8603 d.locale_occurrences = 0;
8604
8605 const QChar *c = uc_begin;
8606 while (c != uc_end) {
8607 while (c != uc_end && c->unicode() != '%')
8608 ++c;
8609
8610 if (c == uc_end)
8611 break;
8612 const QChar *escape_start = c;
8613 if (++c == uc_end)
8614 break;
8615
8616 bool locale_arg = false;
8617 if (c->unicode() == 'L') {
8618 locale_arg = true;
8619 if (++c == uc_end)
8620 break;
8621 }
8622
8623 int escape = qArgDigitValue(*c);
8624 if (escape == -1)
8625 continue;
8626
8627 // ### Qt 7: do not allow anything but ASCII digits
8628 // in arg()'s replacements.
8629#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
8630 const QChar *escapeBegin = c;
8631 const QChar *escapeEnd = escapeBegin + 1;
8632#endif
8633
8634 ++c;
8635
8636 if (c != uc_end) {
8637 const int next_escape = qArgDigitValue(*c);
8638 if (next_escape != -1) {
8639 escape = (10 * escape) + next_escape;
8640 ++c;
8641#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
8642 ++escapeEnd;
8643#endif
8644 }
8645 }
8646
8647#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
8648 checkArgEscape(QStringView(escapeBegin, escapeEnd));
8649#endif
8650
8651 if (escape > d.min_escape)
8652 continue;
8653
8654 if (escape < d.min_escape) {
8655 d.min_escape = escape;
8656 d.occurrences = 0;
8657 d.escape_len = 0;
8658 d.locale_occurrences = 0;
8659 }
8660
8661 ++d.occurrences;
8662 if (locale_arg)
8663 ++d.locale_occurrences;
8664 d.escape_len += c - escape_start;
8665 }
8666 return d;
8667}
8668
8669static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetype field_width,
8670 QStringView arg, QStringView larg, QChar fillChar)
8671{
8672 // Negative field-width for right-padding, positive for left-padding:
8673 const qsizetype abs_field_width = qAbs(field_width);
8674 const qsizetype result_len =
8675 s.size() - d.escape_len
8676 + (d.occurrences - d.locale_occurrences) * qMax(abs_field_width, arg.size())
8677 + d.locale_occurrences * qMax(abs_field_width, larg.size());
8678
8679 QString result(result_len, Qt::Uninitialized);
8680 QChar *rc = const_cast<QChar *>(result.unicode());
8681 QChar *const result_end = rc + result_len;
8682 qsizetype repl_cnt = 0;
8683
8684 const QChar *c = s.begin();
8685 const QChar *const uc_end = s.end();
8686 while (c != uc_end) {
8687 Q_ASSERT(d.occurrences > repl_cnt);
8688 /* We don't have to check increments of c against uc_end because, as
8689 long as d.occurrences > repl_cnt, we KNOW there are valid escape
8690 sequences remaining. */
8691
8692 const QChar *text_start = c;
8693 while (c->unicode() != '%')
8694 ++c;
8695
8696 const QChar *escape_start = c++;
8697 const bool localize = c->unicode() == 'L';
8698 if (localize)
8699 ++c;
8700
8701 int escape = qArgDigitValue(*c);
8702 if (escape != -1 && c + 1 != uc_end) {
8703 const int digit = qArgDigitValue(c[1]);
8704 if (digit != -1) {
8705 ++c;
8706 escape = 10 * escape + digit;
8707 }
8708 }
8709
8710 if (escape != d.min_escape) {
8711 memcpy(rc, text_start, (c - text_start) * sizeof(QChar));
8712 rc += c - text_start;
8713 } else {
8714 ++c;
8715
8716 memcpy(rc, text_start, (escape_start - text_start) * sizeof(QChar));
8717 rc += escape_start - text_start;
8718
8719 const QStringView use = localize ? larg : arg;
8720 const qsizetype pad_chars = abs_field_width - use.size();
8721 // (If negative, relevant loops are no-ops: no need to check.)
8722
8723 if (field_width > 0) { // left padded
8724 rc = std::fill_n(rc, pad_chars, fillChar);
8725 }
8726
8727 if (use.size())
8728 memcpy(rc, use.data(), use.size() * sizeof(QChar));
8729 rc += use.size();
8730
8731 if (field_width < 0) { // right padded
8732 rc = std::fill_n(rc, pad_chars, fillChar);
8733 }
8734
8735 if (++repl_cnt == d.occurrences) {
8736 memcpy(rc, c, (uc_end - c) * sizeof(QChar));
8737 rc += uc_end - c;
8738 Q_ASSERT(rc == result_end);
8739 c = uc_end;
8740 }
8741 }
8742 }
8743 Q_ASSERT(rc == result_end);
8744
8745 return result;
8746}
8747
8748/*!
8749 \fn template <typename T, QString::if_string_like<T> = true> QString QString::arg(const T &a, int fieldWidth, QChar fillChar) const
8750
8751 Returns a copy of this string with the lowest-numbered place-marker
8752 replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
8753
8754 \a fieldWidth specifies the minimum amount of space that \a a
8755 shall occupy. If \a a requires less space than \a fieldWidth, it
8756 is padded to \a fieldWidth with character \a fillChar. A positive
8757 \a fieldWidth produces right-aligned text. A negative \a fieldWidth
8758 produces left-aligned text.
8759
8760 This example shows how we might create a \c status string for
8761 reporting progress while processing a list of files:
8762
8763 \snippet qstring/main.cpp 11-qstringview
8764
8765 First, \c arg(i) replaces \c %1. Then \c arg(total) replaces \c
8766 %2. Finally, \c arg(fileName) replaces \c %3.
8767
8768 One advantage of using arg() over asprintf() is that the order of the
8769 numbered place markers can change, if the application's strings are
8770 translated into other languages, but each arg() will still replace
8771 the lowest-numbered unreplaced place-marker, no matter where it
8772 appears. Also, if place-marker \c %i appears more than once in the
8773 string, arg() replaces all of them.
8774
8775 If there is no unreplaced place-marker remaining, a warning message
8776 is printed and the result is undefined. Place-marker numbers must be
8777 in the range 1 to 99.
8778
8779 \note In Qt versions prior to 6.9, this function was overloaded on
8780 \c{char}, QChar, QString, QStringView, and QLatin1StringView and in some
8781 cases, \c{wchar_t} and \c{char16_t} arguments would resolve to the integer
8782 overloads. In Qt versions prior to 5.10, this function lacked the
8783 QStringView and QLatin1StringView overloads.
8784*/
8785QString QString::arg_impl(QAnyStringView a, int fieldWidth, QChar fillChar) const
8786{
8787 ArgEscapeData d = findArgEscapes(*this);
8788
8789 if (Q_UNLIKELY(d.occurrences == 0)) {
8790 qWarning("QString::arg: Argument missing: \"%ls\", \"%ls\"", qUtf16Printable(*this),
8791 qUtf16Printable(a.toString()));
8792 return *this;
8793 }
8794 struct {
8795 QVarLengthArray<char16_t> out;
8796 QStringView operator()(QStringView in) noexcept { return in; }
8797 QStringView operator()(QLatin1StringView in)
8798 {
8799 out.resize(in.size());
8800 qt_from_latin1(out.data(), in.data(), size_t(in.size()));
8801 return out;
8802 }
8803 QStringView operator()(QUtf8StringView in)
8804 {
8805 out.resize(in.size());
8806 return QStringView{out.data(), QUtf8::convertToUnicode(out.data(), in)};
8807 }
8808 } convert;
8809
8810 QStringView sv = a.visit(std::ref(convert));
8811 return replaceArgEscapes(*this, d, fieldWidth, sv, sv, fillChar);
8812}
8813
8814/*!
8815 \fn template <typename T, QString::if_integral_non_char<T> = true> QString QString::arg(T a, int fieldWidth, int base, QChar fillChar) const
8816 \overload arg()
8817
8818 The \a a argument is expressed in base \a base, which is 10 by
8819 default and must be between 2 and 36. For bases other than 10, \a a
8820 is treated as an unsigned integer.
8821
8822 \a fieldWidth specifies the minimum amount of space that \a a is
8823 padded to and filled with the character \a fillChar. A positive
8824 value produces right-aligned text; a negative value produces
8825 left-aligned text.
8826
8827 The '%' can be followed by an 'L', in which case the sequence is
8828 replaced with a localized representation of \a a. The conversion
8829 uses the default locale, set by QLocale::setDefault(). If no default
8830 locale was specified, the system locale is used. The 'L' flag is
8831 ignored if \a base is not 10.
8832
8833 \snippet qstring/main.cpp 12
8834 \snippet qstring/main.cpp 14
8835
8836 \note In Qt versions prior to 6.10.1, this function accepted arguments of
8837 types that implicitly convert to integral types. This is no longer supported,
8838 except for (unscoped) enums, because it also accepted types convertible to
8839 floating-point types, losing precision when those were printed as integers. A
8840 backwards-compatible fix is to cast such types to a C++ type whose displayed
8841 form matches your intent (\c int, \c float, ...).
8842
8843 \note In Qt versions prior to 6.9, this function was overloaded on various
8844 integral types and sometimes incorrectly accepted \c char and \c char16_t
8845 arguments.
8846
8847 \sa {Number formats}
8848*/
8849QString QString::arg_impl(qlonglong a, int fieldWidth, int base, QChar fillChar) const
8850{
8851 ArgEscapeData d = findArgEscapes(*this);
8852
8853 if (d.occurrences == 0) {
8854 qWarning("QString::arg: Argument missing: \"%ls\", %llu", qUtf16Printable(*this), a);
8855 return *this;
8856 }
8857
8858 unsigned flags = QLocaleData::NoFlags;
8859 // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
8860 if (fillChar == u'0')
8861 flags = QLocaleData::ZeroPadded;
8862
8863 QString arg;
8864 if (d.occurrences > d.locale_occurrences) {
8865 arg = QLocaleData::c()->longLongToString(a, -1, base, fieldWidth, flags);
8866 Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
8867 }
8868
8869 QString localeArg;
8870 if (d.locale_occurrences > 0) {
8871 QLocale locale;
8872 if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
8873 flags |= QLocaleData::GroupDigits;
8874 localeArg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags);
8875 Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
8876 }
8877
8878 return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
8879}
8880
8881QString QString::arg_impl(qulonglong a, int fieldWidth, int base, QChar fillChar) const
8882{
8883 ArgEscapeData d = findArgEscapes(*this);
8884
8885 if (d.occurrences == 0) {
8886 qWarning("QString::arg: Argument missing: \"%ls\", %lld", qUtf16Printable(*this), a);
8887 return *this;
8888 }
8889
8890 unsigned flags = QLocaleData::NoFlags;
8891 // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
8892 if (fillChar == u'0')
8893 flags = QLocaleData::ZeroPadded;
8894
8895 QString arg;
8896 if (d.occurrences > d.locale_occurrences) {
8897 arg = QLocaleData::c()->unsLongLongToString(a, -1, base, fieldWidth, flags);
8898 Q_ASSERT(fillChar != u'0' || fieldWidth <= arg.size());
8899 }
8900
8901 QString localeArg;
8902 if (d.locale_occurrences > 0) {
8903 QLocale locale;
8904 if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
8905 flags |= QLocaleData::GroupDigits;
8906 localeArg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags);
8907 Q_ASSERT(fillChar != u'0' || fieldWidth <= localeArg.size());
8908 }
8909
8910 return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
8911}
8912
8913/*!
8914 \fn template <typename T, QString::if_floating_point<T> = true> QString QString::arg(T a, int fieldWidth, char format, int precision, QChar fillChar) const
8915 \overload arg()
8916
8917 Argument \a a is formatted according to the specified \a format and
8918 \a precision. See \l{Floating-point Formats} for details.
8919
8920 \a fieldWidth specifies the minimum amount of space that \a a is
8921 padded to and filled with the character \a fillChar. A positive
8922 value produces right-aligned text; a negative value produces
8923 left-aligned text.
8924
8925 \snippet code/src_corelib_text_qstring.cpp 2
8926
8927 \note In Qt versions prior to 6.9, this function was a regular function
8928 taking \c double. As a consequence of being a template function now, it no
8929 longer accepts arguments that merely implicitly convert to floating-point
8930 types. A backwards-compatible fix is to cast such types to one of the C++
8931 floating-point types.
8932
8933 \sa QLocale::toString(), QLocale::FloatingPointPrecisionOption, {Number formats}
8934*/
8935QString QString::arg_impl(double a, int fieldWidth, char format, int precision, QChar fillChar) const
8936{
8937 ArgEscapeData d = findArgEscapes(*this);
8938
8939 if (d.occurrences == 0) {
8940 qWarning("QString::arg: Argument missing: \"%ls\", %g", qUtf16Printable(*this), a);
8941 return *this;
8942 }
8943
8944 unsigned flags = QLocaleData::NoFlags;
8945 // ZeroPadded sorts out left-padding when the fill is zero, to the right of sign:
8946 if (fillChar == u'0')
8947 flags |= QLocaleData::ZeroPadded;
8948
8949 if (isAsciiUpper(format))
8950 flags |= QLocaleData::CapitalEorX;
8951
8952 QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
8953 switch (QtMiscUtils::toAsciiLower(format)) {
8954 case 'f':
8955 form = QLocaleData::DFDecimal;
8956 break;
8957 case 'e':
8958 form = QLocaleData::DFExponent;
8959 break;
8960 case 'g':
8961 form = QLocaleData::DFSignificantDigits;
8962 break;
8963 default:
8964#if defined(QT_CHECK_RANGE)
8965 qWarning("QString::arg: Invalid format char '%c'", format);
8966#endif
8967 break;
8968 }
8969
8970 QString arg;
8971 if (d.occurrences > d.locale_occurrences) {
8972 arg = QLocaleData::c()->doubleToString(a, precision, form, fieldWidth,
8973 flags | QLocaleData::ZeroPadExponent);
8974 Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
8975 || fieldWidth <= arg.size());
8976 }
8977
8978 QString localeArg;
8979 if (d.locale_occurrences > 0) {
8980 QLocale locale;
8981
8982 const QLocale::NumberOptions numberOptions = locale.numberOptions();
8983 if (!(numberOptions & QLocale::OmitGroupSeparator))
8984 flags |= QLocaleData::GroupDigits;
8985 if (!(numberOptions & QLocale::OmitLeadingZeroInExponent))
8986 flags |= QLocaleData::ZeroPadExponent;
8987 if (numberOptions & QLocale::IncludeTrailingZeroesAfterDot)
8988 flags |= QLocaleData::AddTrailingZeroes;
8989 localeArg = locale.d->m_data->doubleToString(a, precision, form, fieldWidth, flags);
8990 Q_ASSERT(fillChar != u'0' || !qt_is_finite(a)
8991 || fieldWidth <= localeArg.size());
8992 }
8993
8994 return replaceArgEscapes(*this, d, fieldWidth, arg, localeArg, fillChar);
8995}
8996
8997static inline char16_t to_unicode(const QChar c) { return c.unicode(); }
8998static inline char16_t to_unicode(const char c) { return QLatin1Char{c}.unicode(); }
8999
9000template <typename Char>
9001static int getEscape(const Char *uc, qsizetype *pos, qsizetype len)
9002{
9003 qsizetype i = *pos;
9004 ++i;
9005 if (i < len && uc[i] == u'L')
9006 ++i;
9007 if (i < len) {
9008 int escape = to_unicode(uc[i]) - '0';
9009 if (uint(escape) >= 10U)
9010 return -1;
9011 ++i;
9012 if (i < len) {
9013 // there's a second digit
9014 int digit = to_unicode(uc[i]) - '0';
9015 if (uint(digit) < 10U) {
9016 escape = (escape * 10) + digit;
9017 ++i;
9018 }
9019 }
9020 *pos = i;
9021 return escape;
9022 }
9023 return -1;
9024}
9025
9026/*
9027 Algorithm for multiArg:
9028
9029 1. Parse the string as a sequence of verbatim text and placeholders (%L?\d{,3}).
9030 The L is parsed and accepted for compatibility with non-multi-arg, but since
9031 multiArg only accepts strings as replacements, the localization request can
9032 be safely ignored.
9033 2. The result of step (1) is a list of (string-ref,int)-tuples. The string-ref
9034 either points at text to be copied verbatim (in which case the int is -1),
9035 or, initially, at the textual representation of the placeholder. In that case,
9036 the int contains the numerical number as parsed from the placeholder.
9037 3. Next, collect all the non-negative ints found, sort them in ascending order and
9038 remove duplicates.
9039 3a. If the result has more entries than multiArg() was given replacement strings,
9040 we have found placeholders we can't satisfy with replacement strings. That is
9041 fine (there could be another .arg() call coming after this one), so just
9042 truncate the result to the number of actual multiArg() replacement strings.
9043 3b. If the result has less entries than multiArg() was given replacement strings,
9044 the string is missing placeholders. This is an error that the user should be
9045 warned about.
9046 4. The result of step (3) is a mapping from the index of any replacement string to
9047 placeholder number. This is the wrong way around, but since placeholder
9048 numbers could get as large as 999, while we typically don't have more than 9
9049 replacement strings, we trade 4K of sparsely-used memory for doing a reverse lookup
9050 each time we need to map a placeholder number to a replacement string index
9051 (that's a linear search; but still *much* faster than using an associative container).
9052 5. Next, for each of the tuples found in step (1), do the following:
9053 5a. If the int is negative, do nothing.
9054 5b. Otherwise, if the int is found in the result of step (3) at index I, replace
9055 the string-ref with a string-ref for the (complete) I'th replacement string.
9056 5c. Otherwise, do nothing.
9057 6. Concatenate all string refs into a single result string.
9058*/
9059
9060namespace {
9061struct Part
9062{
9063 Part() = default; // for QVarLengthArray; do not use
9064 constexpr Part(QAnyStringView s, int num = -1)
9065 : string{s}, number{num} {}
9066
9067 void reset(QAnyStringView s) noexcept { *this = {s, number}; }
9068
9069 QAnyStringView string;
9070 int number;
9071};
9072} // unnamed namespace
9073
9075
9076namespace {
9077
9078enum { ExpectedParts = 32 };
9079
9080typedef QVarLengthArray<Part, ExpectedParts> ParseResult;
9081typedef QVarLengthArray<int, ExpectedParts/2> ArgIndexToPlaceholderMap;
9082
9083template <typename StringView>
9084static ParseResult parseMultiArgFormatString_impl(StringView s)
9085{
9086 ParseResult result;
9087
9088 const auto uc = s.data();
9089 const auto len = s.size();
9090 const auto end = len - 1;
9091 qsizetype i = 0;
9092 qsizetype last = 0;
9093
9094 while (i < end) {
9095 if (uc[i] == u'%') {
9096 qsizetype percent = i;
9097 int number = getEscape(uc, &i, len);
9098 if (number != -1) {
9099 if (last != percent)
9100 result.push_back(Part{s.sliced(last, percent - last)}); // literal text (incl. failed placeholders)
9101 result.push_back(Part{s.sliced(percent, i - percent), number}); // parsed placeholder
9102 last = i;
9103 continue;
9104 }
9105 }
9106 ++i;
9107 }
9108
9109 if (last < len)
9110 result.push_back(Part{s.sliced(last, len - last)}); // trailing literal text
9111
9112 return result;
9113}
9114
9115static ParseResult parseMultiArgFormatString(QAnyStringView s)
9116{
9117 return s.visit([] (auto s) { return parseMultiArgFormatString_impl(s); });
9118}
9119
9120static ArgIndexToPlaceholderMap makeArgIndexToPlaceholderMap(const ParseResult &parts)
9121{
9122 ArgIndexToPlaceholderMap result;
9123
9124 for (const Part &part : parts) {
9125 if (part.number >= 0)
9126 result.push_back(part.number);
9127 }
9128
9129 std::sort(result.begin(), result.end());
9130 result.erase(std::unique(result.begin(), result.end()),
9131 result.end());
9132
9133 return result;
9134}
9135
9136static qsizetype resolveStringRefsAndReturnTotalSize(ParseResult &parts, const ArgIndexToPlaceholderMap &argIndexToPlaceholderMap, const QtPrivate::ArgBase *args[])
9137{
9138 using namespace QtPrivate;
9139 qsizetype totalSize = 0;
9140 for (Part &part : parts) {
9141 if (part.number != -1) {
9142 const auto it = std::find(argIndexToPlaceholderMap.begin(), argIndexToPlaceholderMap.end(), part.number);
9143 if (it != argIndexToPlaceholderMap.end()) {
9144 const auto &arg = *args[it - argIndexToPlaceholderMap.begin()];
9145 switch (arg.tag) {
9146 case ArgBase::L1:
9147 part.reset(static_cast<const QLatin1StringArg&>(arg).string);
9148 break;
9149 case ArgBase::Any:
9150 part.reset(static_cast<const QAnyStringArg&>(arg).string);
9151 break;
9152 case ArgBase::U16:
9153 part.reset(static_cast<const QStringViewArg&>(arg).string);
9154 break;
9155 }
9156 }
9157 }
9158 totalSize += part.string.size();
9159 }
9160 return totalSize;
9161}
9162
9163} // unnamed namespace
9164
9165QString QtPrivate::argToQString(QAnyStringView pattern, size_t numArgs, const ArgBase **args)
9166{
9167 // Step 1-2 above
9168 ParseResult parts = parseMultiArgFormatString(pattern);
9169
9170 // 3-4
9171 ArgIndexToPlaceholderMap argIndexToPlaceholderMap = makeArgIndexToPlaceholderMap(parts);
9172
9173 if (static_cast<size_t>(argIndexToPlaceholderMap.size()) > numArgs) // 3a
9174 argIndexToPlaceholderMap.resize(qsizetype(numArgs));
9175 else if (Q_UNLIKELY(static_cast<size_t>(argIndexToPlaceholderMap.size()) < numArgs)) // 3b
9176 qWarning("QString::arg: %d argument(s) missing in %ls",
9177 int(numArgs - argIndexToPlaceholderMap.size()), qUtf16Printable(pattern.toString()));
9178
9179 // 5
9180 const qsizetype totalSize = resolveStringRefsAndReturnTotalSize(parts, argIndexToPlaceholderMap, args);
9181
9182 // 6:
9183 QString result(totalSize, Qt::Uninitialized);
9184 auto out = const_cast<QChar*>(result.constData());
9185
9186 struct Concatenate {
9187 QChar *out;
9188 QChar *operator()(QLatin1String part) noexcept
9189 {
9190 if (part.size()) {
9191 qt_from_latin1(reinterpret_cast<char16_t*>(out),
9192 part.data(), part.size());
9193 }
9194 return out + part.size();
9195 }
9196 QChar *operator()(QUtf8StringView part) noexcept
9197 {
9198 return QUtf8::convertToUnicode(out, part);
9199 }
9200 QChar *operator()(QStringView part) noexcept
9201 {
9202 if (part.size())
9203 memcpy(out, part.data(), part.size() * sizeof(QChar));
9204 return out + part.size();
9205 }
9206 };
9207
9208 for (const Part &part : parts)
9209 out = part.string.visit(Concatenate{out});
9210
9211 // UTF-8 decoding may have caused an overestimate of totalSize - correct it:
9212 result.truncate(out - result.cbegin());
9213
9214 return result;
9215}
9216
9217/*! \fn bool QString::isRightToLeft() const
9218
9219 Returns \c true if the string is read right to left.
9220
9221 \sa QStringView::isRightToLeft()
9222*/
9223bool QString::isRightToLeft() const
9224{
9225 return QtPrivate::isRightToLeft(QStringView(*this));
9226}
9227
9228/*!
9229 \fn bool QString::isValidUtf16() const noexcept
9230 \since 5.15
9231
9232 Returns \c true if the string contains valid UTF-16 encoded data,
9233 or \c false otherwise.
9234
9235 Note that this function does not perform any special validation of the
9236 data; it merely checks if it can be successfully decoded from UTF-16.
9237 The data is assumed to be in host byte order; the presence of a BOM
9238 is meaningless.
9239
9240 \sa QStringView::isValidUtf16()
9241*/
9242
9243/*! \fn QChar *QString::data()
9244
9245 Returns a pointer to the data stored in the QString. The pointer
9246 can be used to access and modify the characters that compose the
9247 string.
9248
9249 Unlike constData() and unicode(), the returned data is always
9250 '\\0'-terminated.
9251
9252 Example:
9253
9254 \snippet qstring/main.cpp 19
9255
9256 Note that the pointer remains valid only as long as the string is
9257 not modified by other means. For read-only access, constData() is
9258 faster because it never causes a \l{deep copy} to occur.
9259
9260 \sa constData(), operator[]()
9261*/
9262
9263/*! \fn const QChar *QString::data() const
9264
9265 \overload
9266
9267 \note The returned string may not be '\\0'-terminated.
9268 Use size() to determine the length of the array.
9269
9270 \sa fromRawData()
9271*/
9272
9273/*! \fn const QChar *QString::constData() const
9274
9275 Returns a pointer to the data stored in the QString. The pointer
9276 can be used to access the characters that compose the string.
9277
9278 Note that the pointer remains valid only as long as the string is
9279 not modified.
9280
9281 \note The returned string may not be '\\0'-terminated.
9282 Use size() to determine the length of the array.
9283
9284 \sa data(), operator[](), fromRawData()
9285*/
9286
9287/*! \fn void QString::push_front(const QString &other)
9288
9289 This function is provided for STL compatibility, prepending the
9290 given \a other string to the beginning of this string. It is
9291 equivalent to \c prepend(other).
9292
9293 \sa prepend()
9294*/
9295
9296/*! \fn void QString::push_front(QChar ch)
9297
9298 \overload
9299
9300 Prepends the given \a ch character to the beginning of this string.
9301*/
9302
9303/*! \fn void QString::push_back(const QString &other)
9304
9305 This function is provided for STL compatibility, appending the
9306 given \a other string onto the end of this string. It is
9307 equivalent to \c append(other).
9308
9309 \sa append()
9310*/
9311
9312/*! \fn void QString::push_back(QChar ch)
9313
9314 \overload
9315
9316 Appends the given \a ch character onto the end of this string.
9317*/
9318
9319/*!
9320 \since 6.1
9321
9322 Removes from the string the characters in the half-open range
9323 [ \a first , \a last ). Returns an iterator to the character
9324 immediately after the last erased character (i.e. the character
9325 referred to by \a last before the erase).
9326*/
9327QString::iterator QString::erase(QString::const_iterator first, QString::const_iterator last)
9328{
9329 const auto start = std::distance(cbegin(), first);
9330 const auto len = std::distance(first, last);
9331 remove(start, len);
9332 return begin() + start;
9333}
9334
9335/*!
9336 \fn QString::iterator QString::erase(QString::const_iterator it)
9337
9338 \overload
9339 \since 6.5
9340
9341 Removes the character denoted by \c it from the string.
9342 Returns an iterator to the character immediately after the
9343 erased character.
9344
9345 \code
9346 QString c = "abcdefg";
9347 auto it = c.erase(c.cbegin()); // c is now "bcdefg"; "it" points to "b"
9348 \endcode
9349*/
9350
9351/*! \fn void QString::shrink_to_fit()
9352 \since 5.10
9353
9354 This function is provided for STL compatibility. It is
9355 equivalent to squeeze().
9356
9357 \sa squeeze()
9358*/
9359
9360/*!
9361 \fn std::string QString::toStdString() const
9362
9363 Returns a std::string object with the data contained in this
9364 QString. The Unicode data is converted into 8-bit characters using
9365 the toUtf8() function.
9366
9367 This method is mostly useful to pass a QString to a function
9368 that accepts a std::string object.
9369
9370 \sa toLatin1(), toUtf8(), toLocal8Bit(), QByteArray::toStdString()
9371*/
9372std::string QString::toStdString() const
9373{
9374 std::string result;
9375 if (isEmpty())
9376 return result;
9377
9378 auto writeToBuffer = [this](char *out, size_t) {
9379 char *last = QUtf8::convertFromUnicode(out, *this);
9380 return last - out;
9381 };
9382 size_t maxSize = size() * 3; // worst case for UTF-8
9383#ifdef __cpp_lib_string_resize_and_overwrite
9384 // C++23
9385 result.resize_and_overwrite(maxSize, writeToBuffer);
9386#else
9387 result.resize(maxSize);
9388 result.resize(writeToBuffer(result.data(), result.size()));
9389#endif
9390 return result;
9391}
9392
9393/*!
9394 \fn QString QString::fromRawData(const char16_t *unicode, qsizetype size)
9395 \since 6.10
9396
9397 Constructs a QString that uses the first \a size Unicode characters
9398 in the array \a unicode. The data in \a unicode is \e not
9399 copied. The caller must be able to guarantee that \a unicode will
9400 not be deleted or modified as long as the QString (or an
9401 unmodified copy of it) exists.
9402
9403 Any attempts to modify the QString or copies of it will cause it
9404 to create a deep copy of the data, ensuring that the raw data
9405 isn't modified.
9406
9407 Here is an example of how we can use a QRegularExpression on raw data in
9408 memory without requiring to copy the data into a QString:
9409
9410 \snippet qstring/main.cpp 22
9411 \snippet qstring/main.cpp 23
9412
9413 \warning A string created with fromRawData() is \e not
9414 '\\0'-terminated, unless the raw data contains a '\\0' character
9415 at position \a size. This means unicode() will \e not return a
9416 '\\0'-terminated string (although utf16() does, at the cost of
9417 copying the raw data).
9418
9419 \sa fromUtf16(), setRawData(), data(), constData(),
9420 nullTerminate(), nullTerminated()
9421*/
9422
9423/*!
9424 \fn QString QString::fromRawData(const QChar *unicode, qsizetype size)
9425 \overload
9426*/
9427
9428/*!
9429 \since 4.7
9430
9431 Resets the QString to use the first \a size Unicode characters
9432 in the array \a unicode. The data in \a unicode is \e not
9433 copied. The caller must be able to guarantee that \a unicode will
9434 not be deleted or modified as long as the QString (or an
9435 unmodified copy of it) exists.
9436
9437 This function can be used instead of fromRawData() to re-use
9438 existings QString objects to save memory re-allocations.
9439
9440 \sa fromRawData(), nullTerminate(), nullTerminated()
9441*/
9442QString &QString::setRawData(const QChar *unicode, qsizetype size)
9443{
9444 if (!unicode || !size) {
9445 clear();
9446 }
9447 *this = fromRawData(unicode, size);
9448 return *this;
9449}
9450
9451/*! \fn QString QString::fromStdU16String(const std::u16string &str)
9452 \since 5.5
9453
9454 \include qstring.cpp {from-std-string} {UTF-16} {fromUtf16()}
9455
9456 \sa fromUtf16(), fromStdWString(), fromStdU32String()
9457*/
9458
9459/*!
9460 \fn std::u16string QString::toStdU16String() const
9461 \since 5.5
9462
9463 Returns a std::u16string object with the data contained in this
9464 QString. The Unicode data is the same as returned by the utf16()
9465 method.
9466
9467 \sa utf16(), toStdWString(), toStdU32String()
9468*/
9469
9470/*! \fn QString QString::fromStdU32String(const std::u32string &str)
9471 \since 5.5
9472
9473 \include qstring.cpp {from-std-string} {UTF-32} {fromUcs4()}
9474
9475 \sa fromUcs4(), fromStdWString(), fromStdU16String()
9476*/
9477
9478/*!
9479 \fn std::u32string QString::toStdU32String() const
9480 \since 5.5
9481
9482 Returns a std::u32string object with the data contained in this
9483 QString. The Unicode data is the same as returned by the toUcs4()
9484 method.
9485
9486 \sa toUcs4(), toStdWString(), toStdU16String()
9487*/
9488
9489#if !defined(QT_NO_DATASTREAM)
9490/*!
9491 \fn QDataStream &operator<<(QDataStream &stream, const QString &string)
9492 \relates QString
9493
9494 Writes the given \a string to the specified \a stream.
9495
9496 \sa {Serializing Qt Data Types}
9497*/
9498
9499QDataStream &operator<<(QDataStream &out, const QString &str)
9500{
9501 if (out.version() == 1) {
9502 out << str.toLatin1();
9503 } else {
9504 if (!str.isNull() || out.version() < 3) {
9505 if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
9506 out.writeBytes(reinterpret_cast<const char *>(str.unicode()),
9507 static_cast<qsizetype>(sizeof(QChar) * str.size()));
9508 } else {
9509 QVarLengthArray<char16_t> buffer(str.size());
9510 qbswap<sizeof(char16_t)>(str.constData(), str.size(), buffer.data());
9511 out.writeBytes(reinterpret_cast<const char *>(buffer.data()),
9512 static_cast<qsizetype>(sizeof(char16_t) * buffer.size()));
9513 }
9514 } else {
9515 QDataStream::writeQSizeType(out, -1); // write null marker
9516 }
9517 }
9518 return out;
9519}
9520
9521/*!
9522 \fn QDataStream &operator>>(QDataStream &stream, QString &string)
9523 \relates QString
9524
9525 Reads a string from the specified \a stream into the given \a string.
9526
9527 \sa {Serializing Qt Data Types}
9528*/
9529
9530QDataStream &operator>>(QDataStream &in, QString &str)
9531{
9532 if (in.version() == 1) {
9533 QByteArray l;
9534 in >> l;
9535 str = QString::fromLatin1(l);
9536 } else {
9537 qint64 size = QDataStream::readQSizeType(in);
9538 qsizetype bytes = size;
9539 if (size != bytes || size < -1) {
9540 str.clear();
9541 in.setStatus(QDataStream::SizeLimitExceeded);
9542 return in;
9543 }
9544 if (bytes == -1) { // null string
9545 str = QString();
9546 } else if (bytes > 0) {
9547 if (bytes & 0x1) {
9548 str.clear();
9549 in.setStatus(QDataStream::ReadCorruptData);
9550 return in;
9551 }
9552
9553 const qsizetype Step = 1024 * 1024;
9554 qsizetype len = bytes / 2;
9555 qsizetype allocated = 0;
9556
9557 while (allocated < len) {
9558 int blockSize = qMin(Step, len - allocated);
9559 str.resize(allocated + blockSize);
9560 if (in.readRawData(reinterpret_cast<char *>(str.data()) + allocated * 2,
9561 blockSize * 2) != blockSize * 2) {
9562 str.clear();
9563 in.setStatus(QDataStream::ReadPastEnd);
9564 return in;
9565 }
9566 allocated += blockSize;
9567 }
9568
9569 if ((in.byteOrder() == QDataStream::BigEndian)
9570 != (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
9571 char16_t *data = reinterpret_cast<char16_t *>(str.data());
9572 qbswap<sizeof(*data)>(data, len, data);
9573 }
9574 } else {
9575 str = QString(QLatin1StringView(""));
9576 }
9577 }
9578 return in;
9579}
9580#endif // QT_NO_DATASTREAM
9581
9582/*!
9583 \typedef QString::Data
9584 \internal
9585*/
9586
9587/*!
9588 \typedef QString::DataPtr
9589 \internal
9590*/
9591
9592/*!
9593 \fn DataPtr & QString::data_ptr()
9594 \internal
9595*/
9596
9597/*!
9598 \since 5.11
9599 \internal
9600 \relates QStringView
9601
9602 Returns \c true if the string is read right to left.
9603
9604 \sa QString::isRightToLeft()
9605*/
9606bool QtPrivate::isRightToLeft(QStringView string) noexcept
9607{
9608 int isolateLevel = 0;
9609
9610 for (QStringIterator i(string); i.hasNext();) {
9611 const char32_t c = i.next();
9612
9613 switch (QChar::direction(c)) {
9614 case QChar::DirRLI:
9615 case QChar::DirLRI:
9616 case QChar::DirFSI:
9617 ++isolateLevel;
9618 break;
9619 case QChar::DirPDI:
9620 if (isolateLevel)
9621 --isolateLevel;
9622 break;
9623 case QChar::DirL:
9624 if (isolateLevel)
9625 break;
9626 return false;
9627 case QChar::DirR:
9628 case QChar::DirAL:
9629 if (isolateLevel)
9630 break;
9631 return true;
9632 case QChar::DirEN:
9633 case QChar::DirES:
9634 case QChar::DirET:
9635 case QChar::DirAN:
9636 case QChar::DirCS:
9637 case QChar::DirB:
9638 case QChar::DirS:
9639 case QChar::DirWS:
9640 case QChar::DirON:
9641 case QChar::DirLRE:
9642 case QChar::DirLRO:
9643 case QChar::DirRLE:
9644 case QChar::DirRLO:
9645 case QChar::DirPDF:
9646 case QChar::DirNSM:
9647 case QChar::DirBN:
9648 break;
9649 }
9650 }
9651 return false;
9652}
9653
9654qsizetype QtPrivate::count(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
9655{
9656 qsizetype num = 0;
9657 qsizetype i = -1;
9658 if (haystack.size() > 500 && needle.size() > 5) {
9659 QStringMatcher matcher(needle, cs);
9660 while ((i = matcher.indexIn(haystack, i + 1)) != -1)
9661 ++num;
9662 } else {
9663 while ((i = QtPrivate::findString(haystack, i + 1, needle, cs)) != -1)
9664 ++num;
9665 }
9666 return num;
9667}
9668
9669qsizetype QtPrivate::count(QStringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
9670{
9671 if (cs == Qt::CaseSensitive)
9672 return std::count(haystack.cbegin(), haystack.cend(), needle);
9673
9674 needle = foldCase(needle);
9675 return std::count_if(haystack.cbegin(), haystack.cend(),
9676 [needle](const QChar c) { return foldAndCompare(c, needle); });
9677}
9678
9679qsizetype QtPrivate::count(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9680{
9681 qsizetype num = 0;
9682 qsizetype i = -1;
9683
9684 QLatin1StringMatcher matcher(needle, cs);
9685 while ((i = matcher.indexIn(haystack, i + 1)) != -1)
9686 ++num;
9687
9688 return num;
9689}
9690
9691qsizetype QtPrivate::count(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
9692{
9693 if (haystack.size() < needle.size())
9694 return 0;
9695
9696 if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
9697 return 0;
9698
9699 qsizetype num = 0;
9700 qsizetype i = -1;
9701
9702 QVarLengthArray<uchar> s(needle.size());
9703 qt_to_latin1_unchecked(s.data(), needle.utf16(), needle.size());
9704
9705 QLatin1StringMatcher matcher(QLatin1StringView(reinterpret_cast<char *>(s.data()), s.size()),
9706 cs);
9707 while ((i = matcher.indexIn(haystack, i + 1)) != -1)
9708 ++num;
9709
9710 return num;
9711}
9712
9713qsizetype QtPrivate::count(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9714{
9715 if (haystack.size() < needle.size())
9716 return -1;
9717
9718 QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
9719 return QtPrivate::count(haystack, QStringView(s.data(), s.size()), cs);
9720}
9721
9722qsizetype QtPrivate::count(QLatin1StringView haystack, QChar needle, Qt::CaseSensitivity cs) noexcept
9723{
9724 // non-L1 needles cannot possibly match in L1-only haystacks
9725 if (needle.unicode() > 0xff)
9726 return 0;
9727
9728 if (cs == Qt::CaseSensitive) {
9729 return std::count(haystack.cbegin(), haystack.cend(), needle.toLatin1());
9730 } else {
9731 return std::count_if(haystack.cbegin(), haystack.cend(),
9732 CaseInsensitiveL1::matcher(needle.toLatin1()));
9733 }
9734}
9735
9736/*!
9737 \fn bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
9738 \since 5.10
9739 \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9740 \since 5.10
9741 \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
9742 \since 5.10
9743 \fn bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9744 \since 5.10
9745 \internal
9746 \relates QStringView
9747
9748 Returns \c true if \a haystack starts with \a needle,
9749 otherwise returns \c false.
9750
9751 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
9752
9753 \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
9754*/
9755
9756bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
9757{
9758 return qt_starts_with_impl(haystack, needle, cs);
9759}
9760
9761bool QtPrivate::startsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9762{
9763 return qt_starts_with_impl(haystack, needle, cs);
9764}
9765
9766bool QtPrivate::startsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
9767{
9768 return qt_starts_with_impl(haystack, needle, cs);
9769}
9770
9771bool QtPrivate::startsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9772{
9773 return qt_starts_with_impl(haystack, needle, cs);
9774}
9775
9776/*!
9777 \fn bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
9778 \since 5.10
9779 \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9780 \since 5.10
9781 \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs)
9782 \since 5.10
9783 \fn bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs)
9784 \since 5.10
9785 \internal
9786 \relates QStringView
9787
9788 Returns \c true if \a haystack ends with \a needle,
9789 otherwise returns \c false.
9790
9791 \include qstring.qdocinc {search-comparison-case-sensitivity} {search}
9792
9793 \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1StringView::endsWith()
9794*/
9795
9796bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
9797{
9798 return qt_ends_with_impl(haystack, needle, cs);
9799}
9800
9801bool QtPrivate::endsWith(QStringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9802{
9803 return qt_ends_with_impl(haystack, needle, cs);
9804}
9805
9806bool QtPrivate::endsWith(QLatin1StringView haystack, QStringView needle, Qt::CaseSensitivity cs) noexcept
9807{
9808 return qt_ends_with_impl(haystack, needle, cs);
9809}
9810
9811bool QtPrivate::endsWith(QLatin1StringView haystack, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9812{
9813 return qt_ends_with_impl(haystack, needle, cs);
9814}
9815
9816qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringView needle0, Qt::CaseSensitivity cs) noexcept
9817{
9818 const qsizetype l = haystack0.size();
9819 const qsizetype sl = needle0.size();
9820 if (sl == 1)
9821 return findString(haystack0, from, needle0[0], cs);
9822 if (from < 0)
9823 from += l;
9824 if (std::size_t(sl + from) > std::size_t(l))
9825 return -1;
9826 if (!sl)
9827 return from;
9828 if (!l)
9829 return -1;
9830
9831 /*
9832 We use the Boyer-Moore algorithm in cases where the overhead
9833 for the skip table should pay off, otherwise we use a simple
9834 hash function.
9835 */
9836 if (l > 500 && sl > 5)
9837 return qFindStringBoyerMoore(haystack0, from, needle0, cs);
9838
9839 auto sv = [sl](const char16_t *v) { return QStringView(v, sl); };
9840 /*
9841 We use some hashing for efficiency's sake. Instead of
9842 comparing strings, we compare the hash value of str with that
9843 of a part of this QString. Only if that matches, we call
9844 qt_string_compare().
9845 */
9846 const char16_t *needle = needle0.utf16();
9847 const char16_t *haystack = haystack0.utf16() + from;
9848 const char16_t *end = haystack0.utf16() + (l - sl);
9849 const qregisteruint sl_minus_1 = sl - 1;
9850 qregisteruint hashNeedle = 0, hashHaystack = 0;
9851 qsizetype idx;
9852
9853 if (cs == Qt::CaseSensitive) {
9854 for (idx = 0; idx < sl; ++idx) {
9855 hashNeedle = ((hashNeedle<<1) + needle[idx]);
9856 hashHaystack = ((hashHaystack<<1) + haystack[idx]);
9857 }
9858 hashHaystack -= haystack[sl_minus_1];
9859
9860 while (haystack <= end) {
9861 hashHaystack += haystack[sl_minus_1];
9862 if (hashHaystack == hashNeedle
9863 && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseSensitive) == 0)
9864 return haystack - haystack0.utf16();
9865
9866 REHASH(*haystack);
9867 ++haystack;
9868 }
9869 } else {
9870 const char16_t *haystack_start = haystack0.utf16();
9871 for (idx = 0; idx < sl; ++idx) {
9872 hashNeedle = (hashNeedle<<1) + foldCase(needle + idx, needle);
9873 hashHaystack = (hashHaystack<<1) + foldCase(haystack + idx, haystack_start);
9874 }
9875 hashHaystack -= foldCase(haystack + sl_minus_1, haystack_start);
9876
9877 while (haystack <= end) {
9878 hashHaystack += foldCase(haystack + sl_minus_1, haystack_start);
9879 if (hashHaystack == hashNeedle
9880 && QtPrivate::compareStrings(needle0, sv(haystack), Qt::CaseInsensitive) == 0)
9881 return haystack - haystack0.utf16();
9882
9883 REHASH(foldCase(haystack, haystack_start));
9884 ++haystack;
9885 }
9886 }
9887 return -1;
9888}
9889
9890qsizetype QtPrivate::findString(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9891{
9892 if (haystack.size() < needle.size())
9893 return -1;
9894
9895 QVarLengthArray<char16_t> s = qt_from_latin1_to_qvla(needle);
9896 return QtPrivate::findString(haystack, from, QStringView(reinterpret_cast<const QChar*>(s.constData()), s.size()), cs);
9897}
9898
9899qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
9900{
9901 if (haystack.size() < needle.size())
9902 return -1;
9903
9904 if (!QtPrivate::isLatin1(needle)) // won't find non-L1 UTF-16 needles in a L1 haystack!
9905 return -1;
9906
9907 if (needle.size() == 1) {
9908 const char n = needle.front().toLatin1();
9909 return QtPrivate::findString(haystack, from, QLatin1StringView(&n, 1), cs);
9910 }
9911
9912 QVarLengthArray<char> s(needle.size());
9913 qt_to_latin1_unchecked(reinterpret_cast<uchar *>(s.data()), needle.utf16(), needle.size());
9914 return QtPrivate::findString(haystack, from, QLatin1StringView(s.data(), s.size()), cs);
9915}
9916
9917qsizetype QtPrivate::findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9918{
9919 if (from < 0)
9920 from += haystack.size();
9921 if (from < 0)
9922 return -1;
9923 qsizetype adjustedSize = haystack.size() - from;
9924 if (adjustedSize < needle.size())
9925 return -1;
9926 if (needle.size() == 0)
9927 return from;
9928
9929 if (cs == Qt::CaseSensitive) {
9930
9931 if (needle.size() == 1) {
9932 Q_ASSERT(haystack.data() != nullptr); // see size check above
9933 if (auto it = memchr(haystack.data() + from, needle.front().toLatin1(), adjustedSize))
9934 return static_cast<const char *>(it) - haystack.data();
9935 return -1;
9936 }
9937
9938 const QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseSensitive);
9939 return matcher.indexIn(haystack, from);
9940 }
9941
9942 // If the needle is sufficiently small we simply iteratively search through
9943 // the haystack. When the needle is too long we use a boyer-moore searcher
9944 // from the standard library, if available. If it is not available then the
9945 // QLatin1Strings are converted to QString and compared as such. Though
9946 // initialization is slower the boyer-moore search it employs still makes up
9947 // for it when haystack and needle are sufficiently long.
9948 // The needle size was chosen by testing various lengths using the
9949 // qstringtokenizer benchmark with the
9950 // "tokenize_qlatin1string_qlatin1string" test.
9951#ifdef Q_CC_MSVC
9952 const qsizetype threshold = 1;
9953#else
9954 const qsizetype threshold = 13;
9955#endif
9956 if (needle.size() <= threshold) {
9957 const auto begin = haystack.begin();
9958 const auto end = haystack.end() - needle.size() + 1;
9959 auto ciMatch = CaseInsensitiveL1::matcher(needle[0].toLatin1());
9960 const qsizetype nlen1 = needle.size() - 1;
9961 for (auto it = std::find_if(begin + from, end, ciMatch); it != end;
9962 it = std::find_if(it + 1, end, ciMatch)) {
9963 // In this comparison we skip the first character because we know it's a match
9964 if (!nlen1 || QLatin1StringView(it + 1, nlen1).compare(needle.sliced(1), cs) == 0)
9965 return std::distance(begin, it);
9966 }
9967 return -1;
9968 }
9969
9970 QLatin1StringMatcher matcher(needle, Qt::CaseSensitivity::CaseInsensitive);
9971 return matcher.indexIn(haystack, from);
9972}
9973
9974qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, char16_t needle, Qt::CaseSensitivity cs) noexcept
9975{
9976 return qLastIndexOf(haystack, QChar(needle), from, cs);
9977}
9978
9979qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
9980{
9981 return qLastIndexOf(haystack, from, needle, cs);
9982}
9983
9984qsizetype QtPrivate::lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9985{
9986 return qLastIndexOf(haystack, from, needle, cs);
9987}
9988
9989qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs) noexcept
9990{
9991 return qLastIndexOf(haystack, from, needle, cs);
9992}
9993
9994qsizetype QtPrivate::lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle, Qt::CaseSensitivity cs) noexcept
9995{
9996 return qLastIndexOf(haystack, from, needle, cs);
9997}
9998
9999#if QT_CONFIG(regularexpression)
10000qsizetype QtPrivate::indexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
10001{
10002 if (!re.isValid()) {
10003 qtWarnAboutInvalidRegularExpression(re, "QString(View)", "indexOf");
10004 return -1;
10005 }
10006
10007 QRegularExpressionMatch match = stringHaystack
10008 ? re.match(*stringHaystack, from)
10009 : re.matchView(viewHaystack, from);
10010 if (match.hasMatch()) {
10011 const qsizetype ret = match.capturedStart();
10012 if (rmatch)
10013 *rmatch = std::move(match);
10014 return ret;
10015 }
10016
10017 return -1;
10018}
10019
10020qsizetype QtPrivate::indexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
10021{
10022 return indexOf(haystack, nullptr, re, from, rmatch);
10023}
10024
10025qsizetype QtPrivate::lastIndexOf(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
10026{
10027 if (!re.isValid()) {
10028 qtWarnAboutInvalidRegularExpression(re, "QString(View)", "lastIndexOf");
10029 return -1;
10030 }
10031
10032 qsizetype endpos = (from < 0) ? (viewHaystack.size() + from + 1) : (from + 1);
10033 QRegularExpressionMatchIterator iterator = stringHaystack
10034 ? re.globalMatch(*stringHaystack)
10035 : re.globalMatchView(viewHaystack);
10036 qsizetype lastIndex = -1;
10037 while (iterator.hasNext()) {
10038 QRegularExpressionMatch match = iterator.next();
10039 qsizetype start = match.capturedStart();
10040 if (start < endpos) {
10041 lastIndex = start;
10042 if (rmatch)
10043 *rmatch = std::move(match);
10044 } else {
10045 break;
10046 }
10047 }
10048
10049 return lastIndex;
10050}
10051
10052qsizetype QtPrivate::lastIndexOf(QStringView haystack, const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch)
10053{
10054 return lastIndexOf(haystack, nullptr, re, from, rmatch);
10055}
10056
10057bool QtPrivate::contains(QStringView viewHaystack, const QString *stringHaystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
10058{
10059 if (!re.isValid()) {
10060 qtWarnAboutInvalidRegularExpression(re, "QString(View)", "contains");
10061 return false;
10062 }
10063 QRegularExpressionMatch m = stringHaystack
10064 ? re.match(*stringHaystack)
10065 : re.matchView(viewHaystack);
10066 bool hasMatch = m.hasMatch();
10067 if (hasMatch && rmatch)
10068 *rmatch = std::move(m);
10069 return hasMatch;
10070}
10071
10072bool QtPrivate::contains(QStringView haystack, const QRegularExpression &re, QRegularExpressionMatch *rmatch)
10073{
10074 return contains(haystack, nullptr, re, rmatch);
10075}
10076
10077qsizetype QtPrivate::count(QStringView haystack, const QRegularExpression &re)
10078{
10079 if (!re.isValid()) {
10080 qtWarnAboutInvalidRegularExpression(re, "QString(View)", "count");
10081 return 0;
10082 }
10083 qsizetype count = 0;
10084 qsizetype index = -1;
10085 qsizetype len = haystack.size();
10086 while (index <= len - 1) {
10087 QRegularExpressionMatch match = re.matchView(haystack, index + 1);
10088 if (!match.hasMatch())
10089 break;
10090 count++;
10091
10092 // Search again, from the next character after the beginning of this
10093 // capture. If the capture starts with a surrogate pair, both together
10094 // count as "one character".
10095 index = match.capturedStart();
10096 if (index < len && haystack[index].isHighSurrogate())
10097 ++index;
10098 }
10099 return count;
10100}
10101
10102#endif // QT_CONFIG(regularexpression)
10103
10104/*!
10105 \since 5.0
10106
10107 Converts a plain text string to an HTML string with
10108 HTML metacharacters \c{<}, \c{>}, \c{&}, and \c{"} replaced by HTML
10109 entities.
10110
10111 Example:
10112
10113 \snippet code/src_corelib_text_qstring.cpp 7
10114*/
10115QString QString::toHtmlEscaped() const
10116{
10117 const auto pos = std::u16string_view(*this).find_first_of(u"<>&\"");
10118 if (pos == std::u16string_view::npos)
10119 return *this;
10120 QString rich;
10121 const qsizetype len = size();
10122 rich.reserve(qsizetype(len * 1.1));
10123 rich += qToStringViewIgnoringNull(*this).first(pos);
10124 for (auto ch : qToStringViewIgnoringNull(*this).sliced(pos)) {
10125 if (ch == u'<')
10126 rich += "&lt;"_L1;
10127 else if (ch == u'>')
10128 rich += "&gt;"_L1;
10129 else if (ch == u'&')
10130 rich += "&amp;"_L1;
10131 else if (ch == u'"')
10132 rich += "&quot;"_L1;
10133 else
10134 rich += ch;
10135 }
10136 rich.squeeze();
10137 return rich;
10138}
10139
10140/*!
10141 \macro QStringLiteral(str)
10142 \relates QString
10143
10144 The macro generates the data for a QString out of the string literal \a str
10145 at compile time. Creating a QString from it is free in this case, and the
10146 generated string data is stored in the read-only segment of the compiled
10147 object file.
10148
10149 If you have code that looks like this:
10150
10151 \snippet code/src_corelib_text_qstring.cpp 9
10152
10153 then a temporary QString will be created to be passed as the \c{hasAttribute}
10154 function parameter. This can be quite expensive, as it involves a memory
10155 allocation and the copy/conversion of the data into QString's internal
10156 encoding.
10157
10158 This cost can be avoided by using QStringLiteral instead:
10159
10160 \snippet code/src_corelib_text_qstring.cpp 10
10161
10162 In this case, QString's internal data will be generated at compile time; no
10163 conversion or allocation will occur at runtime.
10164
10165 Using QStringLiteral instead of a double quoted plain C++ string literal can
10166 significantly speed up creation of QString instances from data known at
10167 compile time.
10168
10169 \note QLatin1StringView can still be more efficient than QStringLiteral
10170 when the string is passed to a function that has an overload taking
10171 QLatin1StringView and this overload avoids conversion to QString. For
10172 instance, QString::operator==() can compare to a QLatin1StringView
10173 directly:
10174
10175 \snippet code/src_corelib_text_qstring.cpp 11
10176
10177 \note Some compilers have bugs encoding strings containing characters outside
10178 the US-ASCII character set. Make sure you prefix your string with \c{u} in
10179 those cases. It is optional otherwise.
10180
10181 \note QStringLiteral is interchangeable with \l operator""_s. The latter saves
10182 typing when many string literals are present in the code.
10183
10184 \sa QByteArrayLiteral
10185*/
10186
10187#if QT_DEPRECATED_SINCE(6, 8)
10188/*!
10189 \fn QtLiterals::operator""_qs(const char16_t *str, size_t size)
10190
10191 \relates QString
10192 \since 6.2
10193 \deprecated [6.8] Use \c _s from Qt::StringLiterals namespace instead.
10194
10195 Literal operator that creates a QString out of the first \a size characters in
10196 the char16_t string literal \a str.
10197
10198 The QString is created at compile time, and the generated string data is stored
10199 in the read-only segment of the compiled object file. Duplicate literals may
10200 share the same read-only memory. This functionality is interchangeable with
10201 QStringLiteral, but saves typing when many string literals are present in the
10202 code.
10203
10204 The following code creates a QString:
10205 \code
10206 auto str = u"hello"_qs;
10207 \endcode
10208
10209 \sa QStringLiteral, QtLiterals::operator""_qba(const char *str, size_t size)
10210*/
10211#endif // QT_DEPRECATED_SINCE(6, 8)
10212
10213/*!
10214 \fn Qt::Literals::StringLiterals::operator""_s(const char16_t *str, size_t size)
10215
10216 \relates QString
10217 \since 6.4
10218
10219 Literal operator that creates a QString out of the first \a size characters in
10220 the char16_t string literal \a str.
10221
10222 The QString is created at compile time, and the generated string data is stored
10223 in the read-only segment of the compiled object file. Duplicate literals may
10224 share the same read-only memory. This functionality is interchangeable with
10225 QStringLiteral, but saves typing when many string literals are present in the
10226 code.
10227
10228 The following code creates a QString:
10229 \code
10230 using namespace Qt::StringLiterals;
10231
10232 auto str = u"hello"_s;
10233 \endcode
10234
10235 \sa Qt::Literals::StringLiterals
10236*/
10237
10238/*!
10239 \internal
10240 */
10241void QAbstractConcatenable::appendLatin1To(QLatin1StringView in, QChar *out) noexcept
10242{
10243 qt_from_latin1(reinterpret_cast<char16_t *>(out), in.data(), size_t(in.size()));
10244}
10245
10246/*!
10247 \fn template <typename T> qsizetype erase(QString &s, const T &t)
10248 \relates QString
10249 \since 6.1
10250
10251 Removes all elements that compare equal to \a t from the
10252 string \a s. Returns the number of elements removed, if any.
10253
10254 \sa erase_if
10255*/
10256
10257/*!
10258 \fn template <typename Predicate> qsizetype erase_if(QString &s, Predicate pred)
10259 \relates QString
10260 \since 6.1
10261
10262 Removes all elements for which the predicate \a pred returns true
10263 from the string \a s. Returns the number of elements removed, if
10264 any.
10265
10266 \sa erase
10267*/
10268
10269/*!
10270 \macro const char *qPrintable(const QString &str)
10271 \relates QString
10272
10273 Returns \a str as a \c{const char *}. This is equivalent to
10274 \a{str}.toLocal8Bit().\l{QByteArray::}{constData()}.
10275
10276 The char pointer will be invalid after the statement in which
10277 qPrintable() is used. This is because the array returned by
10278 QString::toLocal8Bit() will fall out of scope.
10279
10280 \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect
10281 %s arguments to be UTF-8 encoded, while qPrintable() converts to
10282 local 8-bit encoding. Therefore qUtf8Printable() should be used
10283 for logging strings instead of qPrintable().
10284
10285 \sa qUtf8Printable()
10286*/
10287
10288/*!
10289 \macro const char *qUtf8Printable(const QString &str)
10290 \relates QString
10291 \since 5.4
10292
10293 Returns \a str as a \c{const char *}. This is equivalent to
10294 \a{str}.toUtf8().\l{QByteArray::}{constData()}.
10295
10296 The char pointer will be invalid after the statement in which
10297 qUtf8Printable() is used. This is because the array returned by
10298 QString::toUtf8() will fall out of scope.
10299
10300 Example:
10301
10302 \snippet code/src_corelib_text_qstring.cpp qUtf8Printable
10303
10304 \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
10305*/
10306
10307/*!
10308 \macro const wchar_t *qUtf16Printable(const QString &str)
10309 \relates QString
10310 \since 5.7
10311
10312 Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
10313 to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
10314
10315 The only useful thing you can do with the return value of this macro is to
10316 pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
10317 the return value is \e{not} a valid \c{const wchar_t*}!
10318
10319 In general, the pointer will be invalid after the statement in which
10320 qUtf16Printable() is used. This is because the pointer may have been
10321 obtained from a temporary expression, which will fall out of scope.
10322
10323 Example:
10324
10325 \snippet code/src_corelib_text_qstring.cpp qUtf16Printable
10326
10327 \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
10328*/
10329
10330QT_END_NAMESPACE
10331
10332#undef REHASH
QString convertToQString(QAnyStringView string)
Definition qstring.cpp:5565
Definition qlist.h:82
char32_t next(char32_t invalidAs=QChar::ReplacementCharacter)
bool hasNext() const
\inmodule QtCore
QList< uint > convertToUcs4(QStringView string)
Definition qstring.cpp:5821
QByteArray convertToUtf8(QStringView string)
Definition qstring.cpp:5766
QByteArray convertToLocal8Bit(QStringView string)
Definition qstring.cpp:5723
QByteArray convertToLatin1(QStringView string)
Definition qstring.cpp:5582
Combined button and popup list for selecting options.
static QString convertCase(T &str, QUnicodeTables::Case which)
Definition qstring.cpp:7195
static constexpr NormalizationCorrection uc_normalization_corrections[]
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Definition qstring.cpp:9756
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Definition qstring.cpp:9796
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLower(QStringView s) noexcept
Definition qstring.cpp:5502
const QString & asString(const QString &s)
Definition qstring.h:1700
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf16(QStringView s) noexcept
Definition qstring.cpp:905
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool equalStrings(QStringView lhs, QStringView rhs) noexcept
Definition qstring.cpp:1373
qsizetype findString(QStringView str, qsizetype from, QChar needle, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isRightToLeft(QStringView string) noexcept
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1StringView s) noexcept
Definition qstring.cpp:850
constexpr bool isLatin1(QLatin1StringView s) noexcept
Definition qstring.h:77
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t * qustrcasechr(QStringView str, char16_t ch) noexcept
Definition qstring.cpp:775
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isUpper(QStringView s) noexcept
Definition qstring.cpp:5507
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t * qustrchr(QStringView str, char16_t ch) noexcept
Definition qstring.cpp:687
void qt_to_latin1_unchecked(uchar *dst, const char16_t *uc, qsizetype len)
Definition qstring.cpp:1188
static char16_t foldCase(char16_t ch) noexcept
Definition qchar.cpp:1696
#define __has_feature(x)
uint QT_FASTCALL fetch1Pixel< QPixelLayout::BPP1LSB >(const uchar *src, int index)
bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)
static bool isAscii_helper(const char16_t *&ptr, const char16_t *end)
Definition qstring.cpp:858
static Int toIntegral(QStringView string, bool *ok, int base)
Definition qstring.cpp:7684
void qt_to_latin1(uchar *dst, const char16_t *src, qsizetype length)
Definition qstring.cpp:1183
Qt::strong_ordering compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept
Definition qstring.cpp:6739
static void append_utf8(QString &qs, const char *cs, qsizetype len)
Definition qstring.cpp:7318
#define ATTRIBUTE_NO_SANITIZE
Definition qstring.cpp:366
bool qt_is_ascii(const char *&ptr, const char *end) noexcept
Definition qstring.cpp:786
static bool checkCase(QStringView s, QUnicodeTables::Case c) noexcept
Definition qstring.cpp:5491
static void replace_helper(QString &str, QSpan< qsizetype > indices, qsizetype blen, QStringView after)
Definition qstring.cpp:3692
Q_CORE_EXPORT void qt_from_latin1(char16_t *dst, const char *str, size_t size) noexcept
Definition qstring.cpp:920
static int ucstrcmp(const char16_t *a, size_t alen, const Char2 *b, size_t blen)
Definition qstring.cpp:1346
bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept
Definition qstring.cpp:6745
Q_DECLARE_TYPEINFO(Part, Q_PRIMITIVE_TYPE)
static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs)
Definition qstring.cpp:3501
static bool needsReallocate(const QString &str, qsizetype newSize)
Definition qstring.cpp:2637
static int qArgDigitValue(QChar ch) noexcept
Definition qstring.cpp:1613
bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept
Definition qstring.cpp:6734
#define REHASH(a)
Definition qstring.cpp:65
bool comparesEqual(const QByteArrayView &lhs, char16_t rhs) noexcept
Definition qstring.cpp:6723
static int ucstrncmp(const char16_t *a, const char16_t *b, size_t l)
Definition qstring.cpp:1264
static Q_NEVER_INLINE int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char *b)
Definition qstring.cpp:1219
static QByteArray qt_convert_to_latin1(QStringView string)
Definition qstring.cpp:5588
static bool ucstreq(const char16_t *a, size_t alen, const Char2 *b)
Definition qstring.cpp:1339
static QList< uint > qt_convert_to_ucs4(QStringView string)
Definition qstring.cpp:5793
qsizetype qFindStringBoyerMoore(QStringView haystack, qsizetype from, QStringView needle, Qt::CaseSensitivity cs)
static QByteArray qt_convert_to_local_8bit(QStringView string)
Definition qstring.cpp:5700
static LengthMod parse_length_modifier(const char *&c) noexcept
Definition qstring.cpp:7374
static ArgEscapeData findArgEscapes(QStringView s)
Definition qstring.cpp:8593
static QByteArray qt_convert_to_utf8(QStringView str)
Definition qstring.cpp:5746
static void qt_to_latin1_internal(uchar *dst, const char16_t *src, qsizetype length)
Definition qstring.cpp:1004
QtPrivate::QCaseInsensitiveLatin1Hash CaseInsensitiveL1
Definition qstring.cpp:1353
LengthMod
Definition qstring.cpp:7363
@ lm_z
Definition qstring.cpp:7363
@ lm_none
Definition qstring.cpp:7363
@ lm_t
Definition qstring.cpp:7363
@ lm_l
Definition qstring.cpp:7363
@ lm_ll
Definition qstring.cpp:7363
@ lm_hh
Definition qstring.cpp:7363
@ lm_L
Definition qstring.cpp:7363
@ lm_h
Definition qstring.cpp:7363
@ lm_j
Definition qstring.cpp:7363
static void insert_helper(QString &str, qsizetype i, const T &toInsert)
Definition qstring.cpp:2976
static int latin1nicmp(const char *lhsChar, qsizetype lSize, const char *rhsChar, qsizetype rSize)
Definition qstring.cpp:1355
Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, const QChar &rhs) noexcept
Definition qstring.cpp:6717
static char16_t to_unicode(const char c)
Definition qstring.cpp:8998
Qt::strong_ordering compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept
Definition qstring.cpp:6750
static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, qsizetype field_width, QStringView arg, QStringView larg, QChar fillChar)
Definition qstring.cpp:8669
static QVarLengthArray< char16_t > qt_from_latin1_to_qvla(QLatin1StringView str)
Definition qstring.cpp:995
static Q_NEVER_INLINE int ucstricmp8(const char *utf8, const char *utf8end, const QChar *utf16, const QChar *utf16end)
Definition qstring.cpp:1237
void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, qsizetype from)
Definition qstring.cpp:8456
static uint parse_flag_characters(const char *&c) noexcept
Definition qstring.cpp:7326
static Q_NEVER_INLINE int ucstricmp(qsizetype alen, const char16_t *a, qsizetype blen, const char16_t *b)
Definition qstring.cpp:1194
static char16_t to_unicode(const QChar c)
Definition qstring.cpp:8997
QDataStream & operator>>(QDataStream &in, QString &str)
Definition qstring.cpp:9530
static int getEscape(const Char *uc, qsizetype *pos, qsizetype len)
Definition qstring.cpp:9001
static int ucstrncmp(const char16_t *a, const char *b, size_t l)
Definition qstring.cpp:1317
static bool can_consume(const char *&c, char ch) noexcept
Definition qstring.cpp:7365
static int parse_field_width(const char *&c, qsizetype size)
Definition qstring.cpp:7346
Qt::strong_ordering compareThreeWay(const QByteArrayView &lhs, char16_t rhs) noexcept
Definition qstring.cpp:6728
#define qUtf16Printable(string)
Definition qstring.h:1717
qsizetype occurrences
Definition qstring.cpp:8587
qsizetype escape_len
Definition qstring.cpp:8590
qsizetype locale_occurrences
Definition qstring.cpp:8588
\inmodule QtCore \reentrant
Definition qchar.h:18
constexpr char16_t unicode() const noexcept
Converts a Latin-1 character to an 16-bit-encoded Unicode representation of the character.
Definition qchar.h:22
constexpr QLatin1Char(char c) noexcept
Constructs a Latin-1 character for c.
Definition qchar.h:20
@ BlankBeforePositive
Definition qlocale_p.h:270
@ AddTrailingZeroes
Definition qlocale_p.h:267
static int difference(char lhs, char rhs)