178 typedef QTypedArrayData<
char16_t> Data;
180 friend class ::tst_QString;
182 template <
typename Iterator>
183 static constexpr bool is_contiguous_iterator_v =
188 std::is_pointer_v<Iterator>;
190 template <
typename Char>
191 using is_compatible_char_helper = std::disjunction<
192 QtPrivate::IsCompatibleCharType<Char>,
193 QtPrivate::IsCompatibleChar32Type<Char>,
194 QtPrivate::IsCompatibleChar8Type<Char>,
195 std::is_same<Char, QLatin1Char>
198 template <
typename T>
199 using is_string_like = std::conjunction<
200 std::negation<QtPrivate::treat_as_integral_arg<std::remove_cv_t<T>>>,
201 std::is_convertible<T, QAnyStringView>
204 template <
typename T>
205 using if_string_like = std::enable_if_t<is_string_like<T>::value,
bool>;
207 template <
typename T>
208 using is_floating_point_like = std::disjunction<
209 #if QFLOAT16_IS_NATIVE
210 std::is_same<q20::remove_cvref_t<T>, QtPrivate::NativeFloat16Type>,
212 std::is_same<q20::remove_cvref_t<T>, qfloat16>,
213 std::is_floating_point<T>
216 template <
typename T>
217 using if_floating_point = std::enable_if_t<is_floating_point_like<T>::value,
bool>;
219 template <
typename T>
220 using if_integral_non_char = std::enable_if_t<std::conjunction_v<
225 std::negation<q23::is_scoped_enum<T>>
228 std::negation<is_floating_point_like<T>>,
229 std::negation<is_string_like<T>>
232 template <
typename Iterator>
233 static constexpr bool is_compatible_iterator_v = std::conjunction_v<
235 typename std::iterator_traits<Iterator>::iterator_category,
236 std::input_iterator_tag
238 is_compatible_char_helper<
typename std::iterator_traits<Iterator>::value_type>
241 template <
typename Iterator>
242 using if_compatible_iterator = std::enable_if_t<is_compatible_iterator_v<Iterator>,
bool>;
245 typedef QStringPrivate DataPointer;
247 constexpr QString()
noexcept;
248 explicit QString(
const QChar *unicode, qsizetype size = -1);
250 QString(qsizetype size, QChar c);
251 inline QString(QLatin1StringView latin1);
252 explicit QString(QStringView sv) : QString(sv.data(), sv.size()) {}
253#if defined(__cpp_char8_t) || defined(Q_QDOC)
255 inline QString(
const char8_t *str)
256 : QString(fromUtf8(str))
259 inline QString(
const QString &)
noexcept;
261 QString &operator=(QChar c);
262 QString &operator=(
const QString &)
noexcept;
263 QString &operator=(QLatin1StringView latin1);
264 inline QString(QString &&other)
noexcept
266 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QString)
267 void swap(QString &other)
noexcept { d.swap(other.d); }
269 static constexpr qsizetype maxSize()
noexcept
272 return Data::maxSize() - 1;
274 constexpr qsizetype size()
const noexcept
276 constexpr size_t MaxSize = maxSize();
277 Q_PRESUME(size_t(d.size) <= MaxSize);
280#if QT_DEPRECATED_SINCE(6
, 4
)
281 QT_DEPRECATED_VERSION_X_6_4(
"Use size() or length() instead.")
282 constexpr qsizetype count()
const {
return size(); }
284 constexpr qsizetype length()
const noexcept {
return size(); }
285 constexpr bool isEmpty()
const noexcept {
return size() == 0; }
286 void resize(qsizetype size);
287 void resize(qsizetype size, QChar fillChar);
288 void resizeForOverwrite(qsizetype size);
290 QString &fill(QChar c, qsizetype size = -1);
291 void truncate(qsizetype pos);
292 void chop(qsizetype n);
294 QString &slice(qsizetype pos)
295 { verify(pos, 0);
return remove(0, pos); }
296 QString &slice(qsizetype pos, qsizetype n)
302 return remove(0, pos);
305 inline qsizetype capacity()
const;
306 inline void reserve(qsizetype size);
307 inline void squeeze();
309 inline const QChar *unicode()
const;
310 inline QChar *data();
311 inline const QChar *data()
const;
312 inline const QChar *constData()
const;
314 inline void detach();
315 inline bool isDetached()
const;
316 inline bool isSharedWith(
const QString &other)
const {
return d.isSharedWith(other.d); }
319 inline const QChar at(qsizetype i)
const;
320 inline const QChar operator[](qsizetype i)
const;
321 [[nodiscard]]
inline QChar &operator[](qsizetype i);
323 [[nodiscard]]
inline QChar front()
const {
return at(0); }
324 [[nodiscard]]
inline QChar &front();
325 [[nodiscard]]
inline QChar back()
const {
return at(size() - 1); }
326 [[nodiscard]]
inline QChar &back();
328#if QT_CORE_REMOVED_SINCE(6
, 9
)
329 [[nodiscard]] QString arg(qlonglong a,
int fieldwidth=0,
int base=10,
330 QChar fillChar = u' ')
const;
331 [[nodiscard]] QString arg(qulonglong a,
int fieldwidth=0,
int base=10,
332 QChar fillChar = u' ')
const;
333 [[nodiscard]]
inline QString arg(
long a,
int fieldwidth=0,
int base=10,
334 QChar fillChar = u' ')
const;
335 [[nodiscard]]
inline QString arg(ulong a,
int fieldwidth=0,
int base=10,
336 QChar fillChar = u' ')
const;
337 [[nodiscard]]
inline QString arg(
int a,
int fieldWidth = 0,
int base = 10,
338 QChar fillChar = u' ')
const;
339 [[nodiscard]]
inline QString arg(uint a,
int fieldWidth = 0,
int base = 10,
340 QChar fillChar = u' ')
const;
341 [[nodiscard]]
inline QString arg(
short a,
int fieldWidth = 0,
int base = 10,
342 QChar fillChar = u' ')
const;
343 [[nodiscard]]
inline QString arg(ushort a,
int fieldWidth = 0,
int base = 10,
344 QChar fillChar = u' ')
const;
345 [[nodiscard]] QString arg(
double a,
int fieldWidth = 0,
char format =
'g',
int precision = -1,
346 QChar fillChar = u' ')
const;
347 [[nodiscard]] QString arg(
char a,
int fieldWidth = 0,
348 QChar fillChar = u' ')
const;
349 [[nodiscard]] QString arg(QChar a,
int fieldWidth = 0,
350 QChar fillChar = u' ')
const;
351 [[nodiscard]] QString arg(
const QString &a,
int fieldWidth = 0,
352 QChar fillChar = u' ')
const;
353 [[nodiscard]] QString arg(QStringView a,
int fieldWidth = 0,
354 QChar fillChar = u' ')
const;
355 [[nodiscard]] QString arg(QLatin1StringView a,
int fieldWidth = 0,
356 QChar fillChar = u' ')
const;
359 template <
typename T, if_integral_non_char<T> =
true>
360 [[nodiscard]] QString arg(T a,
int fieldWidth = 0,
int base = 10,
361 QChar fillChar = u' ')
const
363 using U =
typename std::conditional<
365 std::is_enum_v<T>, std::underlying_type<T>,
366 q20::type_identity<T>
368 if constexpr (std::is_signed_v<U>)
369 return arg_impl(qlonglong(a), fieldWidth, base, fillChar);
371 return arg_impl(qulonglong(a), fieldWidth, base, fillChar);
374 template <
typename T, if_floating_point<T> =
true>
375 [[nodiscard]] QString arg(T a,
int fieldWidth = 0,
char format =
'g',
int precision = -1,
376 QChar fillChar = u' ')
const
377 {
return arg_impl(
double(a), fieldWidth, format, precision, fillChar); }
379 template <
typename T, if_string_like<T> =
true>
380 [[nodiscard]] QString arg(
const T &a,
int fieldWidth = 0, QChar fillChar = u' ')
const
381 {
return arg_impl(QAnyStringView(a), fieldWidth, fillChar); }
384 QString arg_impl(qlonglong a,
int fieldwidth,
int base, QChar fillChar)
const;
385 QString arg_impl(qulonglong a,
int fieldwidth,
int base, QChar fillChar)
const;
386 QString arg_impl(
double a,
int fieldWidth,
char format,
int precision, QChar fillChar)
const;
387 QString arg_impl(QAnyStringView a,
int fieldWidth, QChar fillChar)
const;
390 template <
typename...Args>
395 typename std::enable_if<
396 sizeof...(Args) >= 2 && std::conjunction_v<is_string_like<Args>...>,
400 arg(Args &&...args)
const
401 {
return qToStringViewIgnoringNull(*
this).arg(std::forward<Args>(args)...); }
403 static QString vasprintf(
const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(1, 0);
404 static QString asprintf(
const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2);
406 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 8)
407 qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
408 [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
409 [[nodiscard]] qsizetype indexOf(
const QString &s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
410 [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
411 {
return QtPrivate::findString(*
this, from, s, cs); }
412 [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
413 {
return lastIndexOf(c, -1, cs); }
414 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 8)
415 qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
416 [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const
417 {
return lastIndexOf(s, size(), cs); }
418 [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
419 [[nodiscard]] qsizetype lastIndexOf(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const
420 {
return lastIndexOf(s, size(), cs); }
421 [[nodiscard]] qsizetype lastIndexOf(
const QString &s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
423 [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
424 {
return lastIndexOf(s, size(), cs); }
425 [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
426 {
return QtPrivate::lastIndexOf(*
this, from, s, cs); }
428 [[nodiscard]]
inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
429 [[nodiscard]]
inline bool contains(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
430 [[nodiscard]]
inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
431 [[nodiscard]]
inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
432 [[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
433 [[nodiscard]] qsizetype count(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
434 [[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
436#if QT_CONFIG(regularexpression)
437 [[nodiscard]] qsizetype indexOf(
const QRegularExpression &re, qsizetype from = 0,
438 QRegularExpressionMatch *rmatch =
nullptr)
const;
440 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
443 template <
typename T = QRegularExpressionMatch, std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>,
bool> =
false>
444 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, T *rmatch =
nullptr)
const
445 {
return lastIndexOf(re, size(), rmatch); }
447 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, qsizetype from,
448 QRegularExpressionMatch *rmatch =
nullptr)
const;
449 [[nodiscard]]
bool contains(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
450 [[nodiscard]] qsizetype count(
const QRegularExpression &re)
const;
454 SectionDefault = 0x00,
455 SectionSkipEmpty = 0x01,
456 SectionIncludeLeadingSep = 0x02,
457 SectionIncludeTrailingSep = 0x04,
458 SectionCaseInsensitiveSeps = 0x08
460 Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
462 [[nodiscard]]
inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
463 [[nodiscard]] QString section(
const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
464#if QT_CONFIG(regularexpression)
465 [[nodiscard]] QString section(
const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
468#if QT_CORE_REMOVED_SINCE(6
, 7
)
469 QString left(qsizetype n)
const;
470 QString right(qsizetype n)
const;
471 QString mid(qsizetype position, qsizetype n = -1)
const;
473 QString first(qsizetype n)
const;
474 QString last(qsizetype n)
const;
475 QString sliced(qsizetype pos)
const;
476 QString sliced(qsizetype pos, qsizetype n)
const;
477 QString chopped(qsizetype n)
const;
479 [[nodiscard]] QString left(qsizetype n)
const &
481 if (size_t(n) >= size_t(size()))
485 [[nodiscard]] QString left(qsizetype n) &&
487 if (size_t(n) >= size_t(size()))
488 return std::move(*
this);
489 return std::move(*
this).first(n);
491 [[nodiscard]] QString right(qsizetype n)
const &
493 if (size_t(n) >= size_t(size()))
497 [[nodiscard]] QString right(qsizetype n) &&
499 if (size_t(n) >= size_t(size()))
500 return std::move(*
this);
501 return std::move(*
this).last(n);
503 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1)
const &;
504 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;
506 [[nodiscard]] QString first(qsizetype n)
const &
507 { verify(0, n);
return sliced(0, n); }
508 [[nodiscard]] QString last(qsizetype n)
const &
509 { verify(0, n);
return sliced(size() - n, n); }
510 [[nodiscard]] QString sliced(qsizetype pos)
const &
511 { verify(pos, 0);
return sliced(pos, size() - pos); }
512 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n)
const &
513 { verify(pos, n);
return QString(begin() + pos, n); }
514 [[nodiscard]] QString chopped(qsizetype n)
const &
515 { verify(0, n);
return sliced(0, size() - n); }
517 [[nodiscard]] QString first(qsizetype n) &&
521 return std::move(*
this);
523 [[nodiscard]] QString last(qsizetype n) &&
524 { verify(0, n);
return sliced_helper(*
this, size() - n, n); }
525 [[nodiscard]] QString sliced(qsizetype pos) &&
526 { verify(pos, 0);
return sliced_helper(*
this, pos, size() - pos); }
527 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
528 { verify(pos, n);
return sliced_helper(*
this, pos, n); }
529 [[nodiscard]] QString chopped(qsizetype n) &&
530 { verify(0, n);
return std::move(*
this).first(size() - n); }
532 bool startsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
533 [[nodiscard]]
bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
534 {
return QtPrivate::startsWith(*
this, s, cs); }
535 bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
536 bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
538 bool endsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
539 [[nodiscard]]
bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
540 {
return QtPrivate::endsWith(*
this, s, cs); }
541 bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
542 bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
544 bool isUpper()
const;
545 bool isLower()
const;
547 [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
548 [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
551 [[nodiscard]] QString toLower()
const &
552 {
return toLower_helper(*
this); }
553 [[nodiscard]] QString toLower() &&
554 {
return toLower_helper(*
this); }
555 [[nodiscard]] QString toUpper()
const &
556 {
return toUpper_helper(*
this); }
557 [[nodiscard]] QString toUpper() &&
558 {
return toUpper_helper(*
this); }
559 [[nodiscard]] QString toCaseFolded()
const &
560 {
return toCaseFolded_helper(*
this); }
561 [[nodiscard]] QString toCaseFolded() &&
562 {
return toCaseFolded_helper(*
this); }
563 [[nodiscard]] QString trimmed()
const &
564 {
return trimmed_helper(*
this); }
565 [[nodiscard]] QString trimmed() &&
566 {
return trimmed_helper(*
this); }
567 [[nodiscard]] QString simplified()
const &
568 {
return simplified_helper(*
this); }
569 [[nodiscard]] QString simplified() &&
570 {
return simplified_helper(*
this); }
572 [[nodiscard]] QString toLower()
const;
573 [[nodiscard]] QString toUpper()
const;
574 [[nodiscard]] QString toCaseFolded()
const;
575 [[nodiscard]] QString trimmed()
const;
576 [[nodiscard]] QString simplified()
const;
578 [[nodiscard]] QString toHtmlEscaped()
const;
580 QString &insert(qsizetype i, QChar c);
581 QString &insert(qsizetype i,
const QChar *uc, qsizetype len);
582 inline QString &insert(qsizetype i,
const QString &s) {
return insert(i, s.constData(), s.size()); }
583 inline QString &insert(qsizetype i, QStringView v) {
return insert(i, v.data(), v.size()); }
584 QString &insert(qsizetype i, QLatin1StringView s);
585 QString &insert(qsizetype i, QUtf8StringView s);
587 QString &append(QChar c);
588 QString &append(
const QChar *uc, qsizetype len);
589 QString &append(
const QString &s);
590 inline QString &append(QStringView v) {
return append(v.data(), v.size()); }
591 QString &append(QLatin1StringView s);
592 QString &append(QUtf8StringView s);
594 inline QString &prepend(QChar c) {
return insert(0, c); }
595 inline QString &prepend(
const QChar *uc, qsizetype len) {
return insert(0, uc, len); }
596 inline QString &prepend(
const QString &s) {
return insert(0, s); }
597 inline QString &prepend(QStringView v) {
return prepend(v.data(), v.size()); }
598 inline QString &prepend(QLatin1StringView s) {
return insert(0, s); }
599 QString &prepend(QUtf8StringView s) {
return insert(0, s); }
601 QString &assign(QAnyStringView s);
602 inline QString &assign(qsizetype n, QChar c)
607 template <
typename InputIterator, if_compatible_iterator<InputIterator> =
true>
608 QString &assign(InputIterator first, InputIterator last)
610 using V =
typename std::iterator_traits<InputIterator>::value_type;
611 constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
612 constexpr bool IsFwdIt = std::is_convertible_v<
613 typename std::iterator_traits<InputIterator>::iterator_category,
614 std::forward_iterator_tag
617 if constexpr (is_contiguous_iterator_v<InputIterator>) {
618 const auto p = q20::to_address(first);
619 const auto len = qsizetype(last - first);
621 return assign(QLatin1StringView(
reinterpret_cast<
const char*>(p), len));
622 else if constexpr (
sizeof(V) == 4)
623 return assign_helper(p, len);
625 return assign(QAnyStringView(p, len));
626 }
else if constexpr (
sizeof(V) == 4) {
628 if constexpr (IsFwdIt) {
629 const qsizetype requiredCapacity = 2 * std::distance(first, last);
630 reserve(requiredCapacity);
632 while (first != last) {
633 append(QChar::fromUcs4(*first));
637 }
else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
638 assign_helper_char8(first, last);
639 if (d.constAllocatedCapacity())
640 d.data()[d.size] = u'\0';
643 d->assign(first, last, [](QChar ch) ->
char16_t {
return ch.unicode(); });
644 if (d.constAllocatedCapacity())
645 d.data()[d.size] = u'\0';
650 inline QString &operator+=(QChar c) {
return append(c); }
652 inline QString &operator+=(
const QString &s) {
return append(s); }
653 inline QString &operator+=(QStringView v) {
return append(v); }
654 inline QString &operator+=(QLatin1StringView s) {
return append(s); }
655 QString &operator+=(QUtf8StringView s) {
return append(s); }
657#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
658 template <qsizetype N>
659 QString &insert(qsizetype i,
const char (&ch)[N]) {
return insert(i, QUtf8StringView(ch)); }
660 template <qsizetype N>
661 QString &append(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
662 template <qsizetype N>
663 QString &prepend(
const char (&ch)[N]) {
return prepend(QUtf8StringView(ch)); }
664 template <qsizetype N>
665 QString &operator+=(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
668 QString &remove(qsizetype i, qsizetype len);
669 QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
670 QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
671 QString &remove(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
673 QString &removeAt(qsizetype pos)
674 {
return size_t(pos) < size_t(size()) ? remove(pos, 1) : *
this; }
675 QString &removeFirst() {
return !isEmpty() ? remove(0, 1) : *
this; }
676 QString &removeLast() {
return !isEmpty() ? remove(size() - 1, 1) : *
this; }
678 template <
typename Predicate>
679 QString &removeIf(Predicate pred)
681 removeIf_helper(pred);
685 QString &replace(qsizetype i, qsizetype len, QChar after);
686 QString &replace(qsizetype i, qsizetype len,
const QChar *s, qsizetype slen);
687 QString &replace(qsizetype i, qsizetype len,
const QString &after);
688 QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
689 QString &replace(
const QChar *before, qsizetype blen,
const QChar *after, qsizetype alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
690 QString &replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
691 QString &replace(QLatin1StringView before,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
692 QString &replace(
const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
693 QString &replace(
const QString &before,
const QString &after,
694 Qt::CaseSensitivity cs = Qt::CaseSensitive);
695 QString &replace(QChar c,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
696 QString &replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
697#if QT_CONFIG(regularexpression)
698 QString &replace(
const QRegularExpression &re,
const QString &after);
699 inline QString &remove(
const QRegularExpression &re)
700 {
return replace(re, QString()); }
705 QStringList split(
const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
706 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
708 QStringList split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
709 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
710#ifndef QT_NO_REGULAREXPRESSION
712 QStringList split(
const QRegularExpression &sep,
713 Qt::SplitBehavior behavior = Qt::KeepEmptyParts)
const;
716 template <
typename Needle,
typename...Flags>
717 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &
718 noexcept(
noexcept(qTokenize(std::declval<
const QString &>(), std::forward<Needle>(needle), flags...)))
719 ->
decltype(qTokenize(*
this, std::forward<Needle>(needle), flags...))
720 {
return qTokenize(qToStringViewIgnoringNull(*
this), std::forward<Needle>(needle), flags...); }
722 template <
typename Needle,
typename...Flags>
723 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &&
724 noexcept(
noexcept(qTokenize(std::declval<
const QString>(), std::forward<Needle>(needle), flags...)))
725 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
726 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
728 template <
typename Needle,
typename...Flags>
729 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags) &&
730 noexcept(
noexcept(qTokenize(std::declval<QString>(), std::forward<Needle>(needle), flags...)))
731 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
732 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
735 enum NormalizationForm {
738 NormalizationForm_KD,
741 [[nodiscard]] QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned)
const;
743 [[nodiscard]] QString repeated(qsizetype times)
const;
745 const ushort *utf16()
const;
746 [[nodiscard]] QString nullTerminated()
const &;
747 [[nodiscard]] QString nullTerminated() &&;
748 QString &nullTerminate();
751 [[nodiscard]] QByteArray toLatin1()
const &
752 {
return toLatin1_helper(*
this); }
753 [[nodiscard]] QByteArray toLatin1() &&
754 {
return toLatin1_helper_inplace(*
this); }
755 [[nodiscard]] QByteArray toUtf8()
const &
756 {
return toUtf8_helper(*
this); }
757 [[nodiscard]] QByteArray toUtf8() &&
758 {
return toUtf8_helper(*
this); }
759 [[nodiscard]] QByteArray toLocal8Bit()
const &
760 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
761 [[nodiscard]] QByteArray toLocal8Bit() &&
762 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
764 [[nodiscard]] QByteArray toLatin1()
const;
765 [[nodiscard]] QByteArray toUtf8()
const;
766 [[nodiscard]] QByteArray toLocal8Bit()
const;
768 [[nodiscard]] QList<uint> toUcs4()
const;
771 static QString fromLatin1(QByteArrayView ba);
773 static inline QString fromLatin1(
const QByteArray &ba) {
return fromLatin1(QByteArrayView(ba)); }
774 static inline QString fromLatin1(
const char *str, qsizetype size)
776 return fromLatin1(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
778 static QString fromUtf8(QByteArrayView utf8);
780 static inline QString fromUtf8(
const QByteArray &ba) {
return fromUtf8(QByteArrayView(ba)); }
781 static inline QString fromUtf8(
const char *utf8, qsizetype size)
783 return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
785#if defined(__cpp_char8_t) || defined(Q_QDOC)
787 static inline QString fromUtf8(
const char8_t *str)
788 {
return fromUtf8(
reinterpret_cast<
const char *>(str)); }
790 static inline QString fromUtf8(
const char8_t *str, qsizetype size)
791 {
return fromUtf8(
reinterpret_cast<
const char *>(str), size); }
793 static QString fromLocal8Bit(QByteArrayView ba);
795 static inline QString fromLocal8Bit(
const QByteArray &ba) {
return fromLocal8Bit(QByteArrayView(ba)); }
796 static inline QString fromLocal8Bit(
const char *str, qsizetype size)
798 return fromLocal8Bit(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
800 static QString fromUtf16(
const char16_t *, qsizetype size = -1);
801 static QString fromUcs4(
const char32_t *, qsizetype size = -1);
802 static QString fromRawData(
const char16_t *unicode, qsizetype size)
804 return QString(DataPointer::fromRawData(unicode, size));
806 QT_CORE_INLINE_SINCE(6, 10)
807 static QString fromRawData(
const QChar *, qsizetype size);
809#if QT_DEPRECATED_SINCE(6
, 0
)
810 QT_DEPRECATED_VERSION_X_6_0(
"Use char16_t* overload.")
811 static QString fromUtf16(
const ushort *str, qsizetype size = -1)
812 {
return fromUtf16(
reinterpret_cast<
const char16_t *>(str), size); }
813 QT_DEPRECATED_VERSION_X_6_0(
"Use char32_t* overload.")
814 static QString fromUcs4(
const uint *str, qsizetype size = -1)
815 {
return fromUcs4(
reinterpret_cast<
const char32_t *>(str), size); }
818 inline qsizetype toWCharArray(
wchar_t *array)
const;
819 [[nodiscard]]
static inline QString fromWCharArray(
const wchar_t *string, qsizetype size = -1);
821 QString &setRawData(
const QChar *unicode, qsizetype size);
822 QString &setUnicode(
const QChar *unicode, qsizetype size);
824 QString &setUnicode(
const char16_t *utf16, qsizetype size)
825 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
826 QString &setUtf16(
const char16_t *utf16, qsizetype size)
827 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
829#if !QT_CORE_REMOVED_SINCE(6
, 9
)
832 QString &setUtf16(
const ushort *autf16, qsizetype asize)
833 {
return setUnicode(
reinterpret_cast<
const QChar *>(autf16), asize); }
835 int compare(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
836 int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
837 inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
838 int compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
839 {
return compare(QStringView{&ch, 1}, cs); }
841 static inline int compare(
const QString &s1,
const QString &s2,
842 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
843 {
return s1.compare(s2, cs); }
845 static inline int compare(
const QString &s1, QLatin1StringView s2,
846 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
847 {
return s1.compare(s2, cs); }
848 static inline int compare(QLatin1StringView s1,
const QString &s2,
849 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
850 {
return -s2.compare(s1, cs); }
851 static int compare(
const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
852 {
return s1.compare(s2, cs); }
853 static int compare(QStringView s1,
const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
854 {
return -s2.compare(s1, cs); }
856 int localeAwareCompare(
const QString& s)
const;
857 inline int localeAwareCompare(QStringView s)
const;
858 static int localeAwareCompare(
const QString& s1,
const QString& s2)
859 {
return s1.localeAwareCompare(s2); }
861 static inline int localeAwareCompare(QStringView s1, QStringView s2);
863 short toShort(
bool *ok=
nullptr,
int base=10)
const
864 {
return toIntegral_helper<
short>(*
this, ok, base); }
865 ushort toUShort(
bool *ok=
nullptr,
int base=10)
const
866 {
return toIntegral_helper<ushort>(*
this, ok, base); }
867 int toInt(
bool *ok=
nullptr,
int base=10)
const
868 {
return toIntegral_helper<
int>(*
this, ok, base); }
869 uint toUInt(
bool *ok=
nullptr,
int base=10)
const
870 {
return toIntegral_helper<uint>(*
this, ok, base); }
871 long toLong(
bool *ok=
nullptr,
int base=10)
const
872 {
return toIntegral_helper<
long>(*
this, ok, base); }
873 ulong toULong(
bool *ok=
nullptr,
int base=10)
const
874 {
return toIntegral_helper<ulong>(*
this, ok, base); }
875 QT_CORE_INLINE_SINCE(6, 5)
876 qlonglong toLongLong(
bool *ok=
nullptr,
int base=10)
const;
877 QT_CORE_INLINE_SINCE(6, 5)
878 qulonglong toULongLong(
bool *ok=
nullptr,
int base=10)
const;
879 float toFloat(
bool *ok=
nullptr)
const;
880 double toDouble(
bool *ok=
nullptr)
const;
882 inline QString &setNum(
short,
int base=10);
883 inline QString &setNum(ushort,
int base=10);
884 inline QString &setNum(
int,
int base=10);
885 inline QString &setNum(uint,
int base=10);
886 inline QString &setNum(
long,
int base=10);
887 inline QString &setNum(ulong,
int base=10);
888 QString &setNum(qlonglong,
int base=10);
889 QString &setNum(qulonglong,
int base=10);
890 inline QString &setNum(
float,
char format=
'g',
int precision=6);
891 QString &setNum(
double,
char format=
'g',
int precision=6);
893 static QString number(
int,
int base=10);
894 static QString number(uint,
int base=10);
895 static QString number(
long,
int base=10);
896 static QString number(ulong,
int base=10);
897 static QString number(qlonglong,
int base=10);
898 static QString number(qulonglong,
int base=10);
899 static QString number(
double,
char format=
'g',
int precision=6);
901 friend bool comparesEqual(
const QString &s1,
const QString &s2)
noexcept
902 {
return comparesEqual(QStringView(s1), QStringView(s2)); }
903 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const QString &s2)
noexcept
904 {
return compareThreeWay(QStringView(s1), QStringView(s2)); }
905 Q_DECLARE_STRONGLY_ORDERED(QString)
908 friend bool comparesEqual(
const QString &s1, QUtf8StringView s2)
noexcept
909 {
return QtPrivate::equalStrings(s1, s2); }
911 friend Qt::strong_ordering compareThreeWay(
const QString &s1, QUtf8StringView s2)
noexcept
913 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
914 return Qt::compareThreeWay(res, 0);
916 Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
919 friend bool comparesEqual(
const QString &s1,
const char8_t *s2)
noexcept
920 {
return comparesEqual(s1, QUtf8StringView(s2)); }
921 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char8_t *s2)
noexcept
922 {
return compareThreeWay(s1, QUtf8StringView(s2)); }
923 Q_DECLARE_STRONGLY_ORDERED(QString,
const char8_t *)
926 friend bool comparesEqual(
const QString &s1, QLatin1StringView s2)
noexcept
927 {
return (s1.size() == s2.size()) && QtPrivate::equalStrings(s1, s2); }
928 friend Qt::strong_ordering
929 compareThreeWay(
const QString &s1, QLatin1StringView s2)
noexcept
931 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
932 return Qt::compareThreeWay(res, 0);
934 Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
937 friend bool comparesEqual(
const QString &s1, std::nullptr_t)
noexcept
938 {
return s1.isEmpty(); }
939 friend Qt::strong_ordering compareThreeWay(
const QString &s1, std::nullptr_t)
noexcept
940 {
return s1.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
941 Q_DECLARE_STRONGLY_ORDERED(QString, std::nullptr_t)
943 friend bool comparesEqual(
const QString &s1,
const char16_t *s2)
noexcept
944 {
return comparesEqual(s1, QStringView(s2)); }
945 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char16_t *s2)
noexcept
946 {
return compareThreeWay(s1, QStringView(s2)); }
947 Q_DECLARE_STRONGLY_ORDERED(QString,
const char16_t *)
950 friend bool comparesEqual(
const QString &lhs, QChar rhs)
noexcept
951 {
return lhs.size() == 1 && rhs == lhs.front(); }
952 friend Qt::strong_ordering compareThreeWay(
const QString &lhs, QChar rhs)
noexcept
954 const int res = compare_helper(lhs.data(), lhs.size(), &rhs, 1);
955 return Qt::compareThreeWay(res, 0);
957 Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
960#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
961 template <qsizetype N>
962 inline QString(
const char (&ch)[N])
963 : QString(fromUtf8(ch))
965 template <qsizetype N>
966 QString(
char (&)[N]) =
delete;
967 template <qsizetype N>
968 inline QString &operator=(
const char (&ch)[N])
969 {
return (*
this = fromUtf8(ch, N - 1)); }
970 template <qsizetype N>
971 QString &operator=(
char (&)[N]) =
delete;
973#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
974 QT_ASCII_CAST_WARN
inline QString(
const char *ch)
975 : QString(fromUtf8(ch))
977 QT_ASCII_CAST_WARN
inline QString(
const QByteArray &a)
978 : QString(fromUtf8(a))
980 QT_ASCII_CAST_WARN
inline QString &operator=(
const char *ch)
988 QT_ASCII_CAST_WARN
inline QString &operator=(
const QByteArray &a)
997 QT_ASCII_CAST_WARN
inline QString &prepend(
const char *s)
998 {
return prepend(QUtf8StringView(s)); }
999 QT_ASCII_CAST_WARN
inline QString &prepend(
const QByteArray &s)
1000 {
return prepend(QUtf8StringView(s)); }
1001 QT_ASCII_CAST_WARN
inline QString &append(
const char *s)
1002 {
return append(QUtf8StringView(s)); }
1003 QT_ASCII_CAST_WARN
inline QString &append(
const QByteArray &s)
1004 {
return append(QUtf8StringView(s)); }
1005 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const char *s)
1006 {
return insert(i, QUtf8StringView(s)); }
1007 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const QByteArray &s)
1008 {
return insert(i, QUtf8StringView(s)); }
1009 QT_ASCII_CAST_WARN
inline QString &operator+=(
const char *s)
1010 {
return append(QUtf8StringView(s)); }
1011 QT_ASCII_CAST_WARN
inline QString &operator+=(
const QByteArray &s)
1012 {
return append(QUtf8StringView(s)); }
1014#if QT_CORE_REMOVED_SINCE(6
, 8
)
1015 QT_ASCII_CAST_WARN
inline bool operator==(
const char *s)
const;
1016 QT_ASCII_CAST_WARN
inline bool operator!=(
const char *s)
const;
1017 QT_ASCII_CAST_WARN
inline bool operator<(
const char *s)
const;
1018 QT_ASCII_CAST_WARN
inline bool operator<=(
const char *s)
const;
1019 QT_ASCII_CAST_WARN
inline bool operator>(
const char *s)
const;
1020 QT_ASCII_CAST_WARN
inline bool operator>=(
const char *s)
const;
1022 QT_ASCII_CAST_WARN
inline bool operator==(
const QByteArray &s)
const;
1023 QT_ASCII_CAST_WARN
inline bool operator!=(
const QByteArray &s)
const;
1024 QT_ASCII_CAST_WARN
inline bool operator<(
const QByteArray &s)
const;
1025 QT_ASCII_CAST_WARN
inline bool operator>(
const QByteArray &s)
const;
1026 QT_ASCII_CAST_WARN
inline bool operator<=(
const QByteArray &s)
const;
1027 QT_ASCII_CAST_WARN
inline bool operator>=(
const QByteArray &s)
const;
1029 friend bool comparesEqual(
const QString &lhs, QByteArrayView rhs)
noexcept
1031 return QString::compare_helper(lhs.constData(), lhs.size(),
1032 rhs.constData(), rhs.size()) == 0;
1034 friend Qt::strong_ordering
1035 compareThreeWay(
const QString &lhs, QByteArrayView rhs)
noexcept
1037 const int res = QString::compare_helper(lhs.constData(), lhs.size(),
1038 rhs.constData(), rhs.size());
1039 return Qt::compareThreeWay(res, 0);
1041 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
1043 friend bool comparesEqual(
const QString &lhs,
const QByteArray &rhs)
noexcept
1044 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1045 friend Qt::strong_ordering
1046 compareThreeWay(
const QString &lhs,
const QByteArray &rhs)
noexcept
1048 return compareThreeWay(lhs, QByteArrayView(rhs));
1050 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
1052 friend bool comparesEqual(
const QString &lhs,
const char *rhs)
noexcept
1053 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1054 friend Qt::strong_ordering
1055 compareThreeWay(
const QString &lhs,
const char *rhs)
noexcept
1057 return compareThreeWay(lhs, QByteArrayView(rhs));
1059 Q_DECLARE_STRONGLY_ORDERED(QString,
const char *, QT_ASCII_CAST_WARN)
1064 typedef QChar *iterator;
1065 typedef const QChar *const_iterator;
1066 typedef iterator Iterator;
1067 typedef const_iterator ConstIterator;
1068 typedef std::reverse_iterator<iterator> reverse_iterator;
1069 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
1070 inline iterator begin();
1071 inline const_iterator begin()
const;
1072 inline const_iterator cbegin()
const;
1073 inline const_iterator constBegin()
const;
1074 inline iterator end();
1075 inline const_iterator end()
const;
1076 inline const_iterator cend()
const;
1077 inline const_iterator constEnd()
const;
1078 reverse_iterator rbegin() {
return reverse_iterator(end()); }
1079 reverse_iterator rend() {
return reverse_iterator(begin()); }
1080 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
1081 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
1082 const_reverse_iterator crbegin()
const {
return const_reverse_iterator(end()); }
1083 const_reverse_iterator crend()
const {
return const_reverse_iterator(begin()); }
1086 typedef qsizetype size_type;
1087 typedef qptrdiff difference_type;
1088 typedef const QChar & const_reference;
1089 typedef QChar & reference;
1090 typedef QChar *pointer;
1091 typedef const QChar *const_pointer;
1092 typedef QChar value_type;
1093 inline void push_back(QChar c) { append(c); }
1094 inline void push_back(
const QString &s) { append(s); }
1095 inline void push_front(QChar c) { prepend(c); }
1096 inline void push_front(
const QString &s) { prepend(s); }
1097 void shrink_to_fit() { squeeze(); }
1098 iterator erase(const_iterator first, const_iterator last);
1099 inline iterator erase(const_iterator it) {
return erase(it, it + 1); }
1100 constexpr qsizetype max_size()
const noexcept
1105 static inline QString fromStdString(
const std::string &s);
1106 std::string toStdString()
const;
1107 static inline QString fromStdWString(
const std::wstring &s);
1108 inline std::wstring toStdWString()
const;
1110 static inline QString fromStdU16String(
const std::u16string &s);
1111 inline std::u16string toStdU16String()
const;
1112 static inline QString fromStdU32String(
const std::u32string &s);
1113 inline std::u32string toStdU32String()
const;
1115 Q_IMPLICIT
inline operator std::u16string_view()
const noexcept;
1117#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
1118 static QString fromCFString(CFStringRef string);
1119 CFStringRef toCFString()
const Q_DECL_CF_RETURNS_RETAINED;
1120 static QString fromNSString(
const NSString *string);
1121 NSString *toNSString()
const Q_DECL_NS_RETURNS_AUTORELEASED;
1124#if defined(Q_OS_WASM) || defined(Q_QDOC)
1125 static QString fromEcmaString(emscripten::val jsString);
1126 emscripten::val toEcmaString()
const;
1129 constexpr bool isNull()
const {
return d.isNull(); }
1131 bool isRightToLeft()
const;
1132 [[nodiscard]]
bool isValidUtf16()
const noexcept
1133 {
return QStringView(*
this).isValidUtf16(); }
1135 QString(qsizetype size, Qt::Initialization);
1136 explicit QString(DataPointer &&dd) : d(std::move(dd)) {}
1139#if defined(QT_NO_CAST_FROM_ASCII)
1140#define QSTRING_DECL_DELETED_ASCII_OP Q_DECL_EQ_DELETE_X("This function is not available under QT_NO_CAST_FROM_ASCII")
1141 QString &operator+=(
const char *s) QSTRING_DECL_DELETED_ASCII_OP;
1142 QString &operator+=(
const QByteArray &s) QSTRING_DECL_DELETED_ASCII_OP;
1143 QString(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1144 QString(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1145 QString &operator=(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1146 QString &operator=(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1147#undef QSTRING_DECL_DELETED_ASCII_OP
1151 static const char16_t _empty;
1153 void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
1154 void reallocGrowData(qsizetype n);
1156 QString &assign_helper(
const char32_t *data, qsizetype len);
1158 template <
typename InputIterator>
1159 void assign_helper_char8(InputIterator first, InputIterator last);
1160 static int compare_helper(
const QChar *data1, qsizetype length1,
1161 const QChar *data2, qsizetype length2,
1162 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1163 static int compare_helper(
const QChar *data1, qsizetype length1,
1164 const char *data2, qsizetype length2,
1165 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1166 static int localeAwareCompare_helper(
const QChar *data1, qsizetype length1,
1167 const QChar *data2, qsizetype length2);
1168 static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);
1169 static QString toLower_helper(
const QString &str);
1170 static QString toLower_helper(QString &str);
1171 static QString toUpper_helper(
const QString &str);
1172 static QString toUpper_helper(QString &str);
1173 static QString toCaseFolded_helper(
const QString &str);
1174 static QString toCaseFolded_helper(QString &str);
1175 static QString trimmed_helper(
const QString &str);
1176 static QString trimmed_helper(QString &str);
1177 static QString simplified_helper(
const QString &str);
1178 static QString simplified_helper(QString &str);
1179 static QByteArray toLatin1_helper(
const QString &);
1180 static QByteArray toLatin1_helper_inplace(QString &);
1181 static QByteArray toUtf8_helper(
const QString &);
1182 static QByteArray toLocal8Bit_helper(
const QChar *data, qsizetype size);
1183#if QT_CORE_REMOVED_SINCE(6
, 6
)
1184 static qsizetype toUcs4_helper(
const ushort *uc, qsizetype length, uint *out);
1186 static qsizetype toUcs4_helper(
const char16_t *uc, qsizetype length,
char32_t *out);
1187 static qlonglong toIntegral_helper(QStringView string,
bool *ok,
int base);
1188 static qulonglong toIntegral_helper(QStringView string,
bool *ok, uint base);
1189 template <
typename Predicate>
1190 qsizetype removeIf_helper(Predicate pred)
1192 const qsizetype result = d->eraseIf(pred);
1194 d.data()[d.size] = u'\0';
1198 friend class QStringView;
1199 friend class QByteArray;
1200 friend struct QAbstractConcatenable;
1201 template <
typename T>
friend qsizetype erase(QString &s,
const T &t);
1202 template <
typename Predicate>
friend qsizetype erase_if(QString &s, Predicate pred);
1204 template <
typename T>
static
1205 T toIntegral_helper(QStringView string,
bool *ok,
int base)
1207 using Int64 =
typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
1208 using Int32 =
typename std::conditional<std::is_unsigned<T>::value, uint,
int>::type;
1211 Int64 val = toIntegral_helper(string, ok, Int32(base));
1212 if (T(val) != val) {
1220 Q_ALWAYS_INLINE
constexpr void verify([[maybe_unused]] qsizetype pos = 0,
1221 [[maybe_unused]] qsizetype n = 1)
const
1224 Q_ASSERT(pos <= d.size);
1226 Q_ASSERT(n <= d.size - pos);
1230 inline DataPointer &data_ptr() {
return d; }
1231 inline const DataPointer &data_ptr()
const {
return d; }