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
277 constexpr size_t MaxSize = maxSize();
278 [[assume(size_t(d.size) <= MaxSize)]];
282#if QT_DEPRECATED_SINCE(6
, 4
)
283 QT_DEPRECATED_VERSION_X_6_4(
"Use size() or length() instead.")
284 constexpr qsizetype count()
const {
return size(); }
286 constexpr qsizetype length()
const noexcept {
return size(); }
287 constexpr bool isEmpty()
const noexcept {
return size() == 0; }
288 void resize(qsizetype size);
289 void resize(qsizetype size, QChar fillChar);
290 void resizeForOverwrite(qsizetype size);
292 QString &fill(QChar c, qsizetype size = -1);
293 void truncate(qsizetype pos);
294 void chop(qsizetype n);
296 QString &slice(qsizetype pos)
297 { verify(pos, 0);
return remove(0, pos); }
298 QString &slice(qsizetype pos, qsizetype n)
304 return remove(0, pos);
307 inline qsizetype capacity()
const;
308 inline void reserve(qsizetype size);
309 inline void squeeze();
311 inline const QChar *unicode()
const;
312 inline QChar *data();
313 inline const QChar *data()
const;
314 inline const QChar *constData()
const;
316 inline void detach();
317 inline bool isDetached()
const;
318 inline bool isSharedWith(
const QString &other)
const {
return d.isSharedWith(other.d); }
321 inline const QChar at(qsizetype i)
const;
322 inline const QChar operator[](qsizetype i)
const;
323 [[nodiscard]]
inline QChar &operator[](qsizetype i);
325 [[nodiscard]]
inline QChar front()
const {
return at(0); }
326 [[nodiscard]]
inline QChar &front();
327 [[nodiscard]]
inline QChar back()
const {
return at(size() - 1); }
328 [[nodiscard]]
inline QChar &back();
330#if QT_CORE_REMOVED_SINCE(6
, 9
)
331 [[nodiscard]] QString arg(qlonglong a,
int fieldwidth=0,
int base=10,
332 QChar fillChar = u' ')
const;
333 [[nodiscard]] QString arg(qulonglong a,
int fieldwidth=0,
int base=10,
334 QChar fillChar = u' ')
const;
335 [[nodiscard]]
inline QString arg(
long a,
int fieldwidth=0,
int base=10,
336 QChar fillChar = u' ')
const;
337 [[nodiscard]]
inline QString arg(ulong a,
int fieldwidth=0,
int base=10,
338 QChar fillChar = u' ')
const;
339 [[nodiscard]]
inline QString arg(
int a,
int fieldWidth = 0,
int base = 10,
340 QChar fillChar = u' ')
const;
341 [[nodiscard]]
inline QString arg(uint a,
int fieldWidth = 0,
int base = 10,
342 QChar fillChar = u' ')
const;
343 [[nodiscard]]
inline QString arg(
short a,
int fieldWidth = 0,
int base = 10,
344 QChar fillChar = u' ')
const;
345 [[nodiscard]]
inline QString arg(ushort a,
int fieldWidth = 0,
int base = 10,
346 QChar fillChar = u' ')
const;
347 [[nodiscard]] QString arg(
double a,
int fieldWidth = 0,
char format =
'g',
int precision = -1,
348 QChar fillChar = u' ')
const;
349 [[nodiscard]] QString arg(
char a,
int fieldWidth = 0,
350 QChar fillChar = u' ')
const;
351 [[nodiscard]] QString arg(QChar a,
int fieldWidth = 0,
352 QChar fillChar = u' ')
const;
353 [[nodiscard]] QString arg(
const QString &a,
int fieldWidth = 0,
354 QChar fillChar = u' ')
const;
355 [[nodiscard]] QString arg(QStringView a,
int fieldWidth = 0,
356 QChar fillChar = u' ')
const;
357 [[nodiscard]] QString arg(QLatin1StringView a,
int fieldWidth = 0,
358 QChar fillChar = u' ')
const;
361 template <
typename T, if_integral_non_char<T> =
true>
362 [[nodiscard]] QString arg(T a,
int fieldWidth = 0,
int base = 10,
363 QChar fillChar = u' ')
const
365 using U =
typename std::conditional<
367 std::is_enum_v<T>, std::underlying_type<T>,
368 q20::type_identity<T>
370 if constexpr (std::is_signed_v<U>)
371 return arg_impl(qlonglong(a), fieldWidth, base, fillChar);
373 return arg_impl(qulonglong(a), fieldWidth, base, fillChar);
376 template <
typename T, if_floating_point<T> =
true>
377 [[nodiscard]] QString arg(T a,
int fieldWidth = 0,
char format =
'g',
int precision = -1,
378 QChar fillChar = u' ')
const
379 {
return arg_impl(
double(a), fieldWidth, format, precision, fillChar); }
381 template <
typename T, if_string_like<T> =
true>
382 [[nodiscard]] QString arg(
const T &a,
int fieldWidth = 0, QChar fillChar = u' ')
const
383 {
return arg_impl(QAnyStringView(a), fieldWidth, fillChar); }
386 QString arg_impl(qlonglong a,
int fieldwidth,
int base, QChar fillChar)
const;
387 QString arg_impl(qulonglong a,
int fieldwidth,
int base, QChar fillChar)
const;
388 QString arg_impl(
double a,
int fieldWidth,
char format,
int precision, QChar fillChar)
const;
389 QString arg_impl(QAnyStringView a,
int fieldWidth, QChar fillChar)
const;
392 template <
typename...Args>
397 typename std::enable_if<
398 sizeof...(Args) >= 2 && std::conjunction_v<is_string_like<Args>...>,
402 arg(Args &&...args)
const
403 {
return qToStringViewIgnoringNull(*
this).arg(std::forward<Args>(args)...); }
405 static QString vasprintf(
const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(1, 0);
406 static QString asprintf(
const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2);
408 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 8)
409 qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
410 [[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
411 [[nodiscard]] qsizetype indexOf(
const QString &s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
412 [[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
413 {
return QtPrivate::findString(*
this, from, s, cs); }
414 [[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
415 {
return lastIndexOf(c, -1, cs); }
416 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 8)
417 qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
418 [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const
419 {
return lastIndexOf(s, size(), cs); }
420 [[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
421 [[nodiscard]] qsizetype lastIndexOf(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const
422 {
return lastIndexOf(s, size(), cs); }
423 [[nodiscard]] qsizetype lastIndexOf(
const QString &s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
425 [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
426 {
return lastIndexOf(s, size(), cs); }
427 [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
428 {
return QtPrivate::lastIndexOf(*
this, from, s, cs); }
430 [[nodiscard]]
inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
431 [[nodiscard]]
inline bool contains(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
432 [[nodiscard]]
inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
433 [[nodiscard]]
inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
434 [[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
435 [[nodiscard]] qsizetype count(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
436 [[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
438#if QT_CONFIG(regularexpression)
439 [[nodiscard]] qsizetype indexOf(
const QRegularExpression &re, qsizetype from = 0,
440 QRegularExpressionMatch *rmatch =
nullptr)
const;
442 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
445 template <
typename T = QRegularExpressionMatch, std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>,
bool> =
false>
446 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, T *rmatch =
nullptr)
const
447 {
return lastIndexOf(re, size(), rmatch); }
449 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, qsizetype from,
450 QRegularExpressionMatch *rmatch =
nullptr)
const;
451 [[nodiscard]]
bool contains(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
452 [[nodiscard]] qsizetype count(
const QRegularExpression &re)
const;
456 SectionDefault = 0x00,
457 SectionSkipEmpty = 0x01,
458 SectionIncludeLeadingSep = 0x02,
459 SectionIncludeTrailingSep = 0x04,
460 SectionCaseInsensitiveSeps = 0x08
462 Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
464 [[nodiscard]]
inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
465 [[nodiscard]] QString section(
const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
466#if QT_CONFIG(regularexpression)
467 [[nodiscard]] QString section(
const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
470#if QT_CORE_REMOVED_SINCE(6
, 7
)
471 QString left(qsizetype n)
const;
472 QString right(qsizetype n)
const;
473 QString mid(qsizetype position, qsizetype n = -1)
const;
475 QString first(qsizetype n)
const;
476 QString last(qsizetype n)
const;
477 QString sliced(qsizetype pos)
const;
478 QString sliced(qsizetype pos, qsizetype n)
const;
479 QString chopped(qsizetype n)
const;
481 [[nodiscard]] QString left(qsizetype n)
const &
483 if (size_t(n) >= size_t(size()))
487 [[nodiscard]] QString left(qsizetype n) &&
489 if (size_t(n) >= size_t(size()))
490 return std::move(*
this);
491 return std::move(*
this).first(n);
493 [[nodiscard]] QString right(qsizetype n)
const &
495 if (size_t(n) >= size_t(size()))
499 [[nodiscard]] QString right(qsizetype n) &&
501 if (size_t(n) >= size_t(size()))
502 return std::move(*
this);
503 return std::move(*
this).last(n);
505 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1)
const &;
506 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;
508 [[nodiscard]] QString first(qsizetype n)
const &
509 { verify(0, n);
return sliced(0, n); }
510 [[nodiscard]] QString last(qsizetype n)
const &
511 { verify(0, n);
return sliced(size() - n, n); }
512 [[nodiscard]] QString sliced(qsizetype pos)
const &
513 { verify(pos, 0);
return sliced(pos, size() - pos); }
514 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n)
const &
515 { verify(pos, n);
return QString(begin() + pos, n); }
516 [[nodiscard]] QString chopped(qsizetype n)
const &
517 { verify(0, n);
return sliced(0, size() - n); }
519 [[nodiscard]] QString first(qsizetype n) &&
523 return std::move(*
this);
525 [[nodiscard]] QString last(qsizetype n) &&
526 { verify(0, n);
return sliced_helper(*
this, size() - n, n); }
527 [[nodiscard]] QString sliced(qsizetype pos) &&
528 { verify(pos, 0);
return sliced_helper(*
this, pos, size() - pos); }
529 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
530 { verify(pos, n);
return sliced_helper(*
this, pos, n); }
531 [[nodiscard]] QString chopped(qsizetype n) &&
532 { verify(0, n);
return std::move(*
this).first(size() - n); }
534 bool startsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
535 [[nodiscard]]
bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
536 {
return QtPrivate::startsWith(*
this, s, cs); }
537 bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
538 bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
540 bool endsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
541 [[nodiscard]]
bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
542 {
return QtPrivate::endsWith(*
this, s, cs); }
543 bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
544 bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
546 bool isUpper()
const;
547 bool isLower()
const;
549 [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
550 [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
553 [[nodiscard]] QString toLower()
const &
554 {
return toLower_helper(*
this); }
555 [[nodiscard]] QString toLower() &&
556 {
return toLower_helper(*
this); }
557 [[nodiscard]] QString toUpper()
const &
558 {
return toUpper_helper(*
this); }
559 [[nodiscard]] QString toUpper() &&
560 {
return toUpper_helper(*
this); }
561 [[nodiscard]] QString toCaseFolded()
const &
562 {
return toCaseFolded_helper(*
this); }
563 [[nodiscard]] QString toCaseFolded() &&
564 {
return toCaseFolded_helper(*
this); }
565 [[nodiscard]] QString trimmed()
const &
566 {
return trimmed_helper(*
this); }
567 [[nodiscard]] QString trimmed() &&
568 {
return trimmed_helper(*
this); }
569 [[nodiscard]] QString simplified()
const &
570 {
return simplified_helper(*
this); }
571 [[nodiscard]] QString simplified() &&
572 {
return simplified_helper(*
this); }
574 [[nodiscard]] QString toLower()
const;
575 [[nodiscard]] QString toUpper()
const;
576 [[nodiscard]] QString toCaseFolded()
const;
577 [[nodiscard]] QString trimmed()
const;
578 [[nodiscard]] QString simplified()
const;
580 [[nodiscard]] QString toHtmlEscaped()
const;
582 QString &insert(qsizetype i, QChar c);
583 QString &insert(qsizetype i,
const QChar *uc, qsizetype len);
584 inline QString &insert(qsizetype i,
const QString &s) {
return insert(i, s.constData(), s.size()); }
585 inline QString &insert(qsizetype i, QStringView v) {
return insert(i, v.data(), v.size()); }
586 QString &insert(qsizetype i, QLatin1StringView s);
587 QString &insert(qsizetype i, QUtf8StringView s);
589 QString &append(QChar c);
590 QString &append(
const QChar *uc, qsizetype len);
591 QString &append(
const QString &s);
592 inline QString &append(QStringView v) {
return append(v.data(), v.size()); }
593 QString &append(QLatin1StringView s);
594 QString &append(QUtf8StringView s);
596 inline QString &prepend(QChar c) {
return insert(0, c); }
597 inline QString &prepend(
const QChar *uc, qsizetype len) {
return insert(0, uc, len); }
598 inline QString &prepend(
const QString &s) {
return insert(0, s); }
599 inline QString &prepend(QStringView v) {
return prepend(v.data(), v.size()); }
600 inline QString &prepend(QLatin1StringView s) {
return insert(0, s); }
601 QString &prepend(QUtf8StringView s) {
return insert(0, s); }
603 QString &assign(QAnyStringView s);
604 inline QString &assign(qsizetype n, QChar c)
609 template <
typename InputIterator, if_compatible_iterator<InputIterator> =
true>
610 QString &assign(InputIterator first, InputIterator last)
612 using V =
typename std::iterator_traits<InputIterator>::value_type;
613 constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
614 constexpr bool IsFwdIt = std::is_convertible_v<
615 typename std::iterator_traits<InputIterator>::iterator_category,
616 std::forward_iterator_tag
619 if constexpr (is_contiguous_iterator_v<InputIterator>) {
620 const auto p = q20::to_address(first);
621 const auto len = qsizetype(last - first);
623 return assign(QLatin1StringView(
reinterpret_cast<
const char*>(p), len));
624 else if constexpr (
sizeof(V) == 4)
625 return assign_helper(p, len);
627 return assign(QAnyStringView(p, len));
628 }
else if constexpr (
sizeof(V) == 4) {
630 if constexpr (IsFwdIt) {
631 const qsizetype requiredCapacity = 2 * std::distance(first, last);
632 reserve(requiredCapacity);
634 while (first != last) {
635 append(QChar::fromUcs4(*first));
639 }
else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
640 assign_helper_char8(first, last);
641 if (d.constAllocatedCapacity())
642 d.data()[d.size] = u'\0';
645 d.assign(first, last, [](QChar ch) ->
char16_t {
return ch.unicode(); });
646 if (d.constAllocatedCapacity())
647 d.data()[d.size] = u'\0';
652 inline QString &operator+=(QChar c) {
return append(c); }
654 inline QString &operator+=(
const QString &s) {
return append(s); }
655 inline QString &operator+=(QStringView v) {
return append(v); }
656 inline QString &operator+=(QLatin1StringView s) {
return append(s); }
657 QString &operator+=(QUtf8StringView s) {
return append(s); }
659#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
660 template <qsizetype N>
661 QString &insert(qsizetype i,
const char (&ch)[N]) {
return insert(i, QUtf8StringView(ch)); }
662 template <qsizetype N>
663 QString &append(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
664 template <qsizetype N>
665 QString &prepend(
const char (&ch)[N]) {
return prepend(QUtf8StringView(ch)); }
666 template <qsizetype N>
667 QString &operator+=(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
670 QString &remove(qsizetype i, qsizetype len);
671 QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
672 QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
673 QString &remove(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
675 QString &removeAt(qsizetype pos)
676 {
return size_t(pos) < size_t(size()) ? remove(pos, 1) : *
this; }
677 QString &removeFirst() {
return !isEmpty() ? remove(0, 1) : *
this; }
678 QString &removeLast() {
return !isEmpty() ? remove(size() - 1, 1) : *
this; }
680 template <
typename Predicate>
681 QString &removeIf(Predicate pred)
683 removeIf_helper(pred);
687 QString &replace(qsizetype i, qsizetype len, QChar after);
688 QString &replace(qsizetype i, qsizetype len,
const QChar *s, qsizetype slen);
689 QString &replace(qsizetype i, qsizetype len,
const QString &after);
690 QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
691 QString &replace(
const QChar *before, qsizetype blen,
const QChar *after, qsizetype alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
692 QString &replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
693 QString &replace(QLatin1StringView before,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
694 QString &replace(
const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
695 QString &replace(
const QString &before,
const QString &after,
696 Qt::CaseSensitivity cs = Qt::CaseSensitive);
697 QString &replace(QChar c,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
698 QString &replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
699#if QT_CONFIG(regularexpression)
700 QString &replace(
const QRegularExpression &re,
const QString &after);
701 inline QString &remove(
const QRegularExpression &re)
702 {
return replace(re, QString()); }
707 QStringList split(
const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
708 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
710 QStringList split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
711 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
712#ifndef QT_NO_REGULAREXPRESSION
714 QStringList split(
const QRegularExpression &sep,
715 Qt::SplitBehavior behavior = Qt::KeepEmptyParts)
const;
718 template <
typename Needle,
typename...Flags>
719 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &
720 noexcept(
noexcept(qTokenize(std::declval<
const QString &>(), std::forward<Needle>(needle), flags...)))
721 ->
decltype(qTokenize(*
this, std::forward<Needle>(needle), flags...))
722 {
return qTokenize(qToStringViewIgnoringNull(*
this), std::forward<Needle>(needle), flags...); }
724 template <
typename Needle,
typename...Flags>
725 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &&
726 noexcept(
noexcept(qTokenize(std::declval<
const QString>(), std::forward<Needle>(needle), flags...)))
727 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
728 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
730 template <
typename Needle,
typename...Flags>
731 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags) &&
732 noexcept(
noexcept(qTokenize(std::declval<QString>(), std::forward<Needle>(needle), flags...)))
733 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
734 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
737 enum NormalizationForm {
740 NormalizationForm_KD,
743 [[nodiscard]] QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned)
const;
745 [[nodiscard]] QString repeated(qsizetype times)
const;
747 const ushort *utf16()
const;
748 [[nodiscard]] QString nullTerminated()
const &;
749 [[nodiscard]] QString nullTerminated() &&;
750 QString &nullTerminate();
753 [[nodiscard]] QByteArray toLatin1()
const &
754 {
return toLatin1_helper(*
this); }
755 [[nodiscard]] QByteArray toLatin1() &&
756 {
return toLatin1_helper_inplace(*
this); }
757 [[nodiscard]] QByteArray toUtf8()
const &
758 {
return toUtf8_helper(*
this); }
759 [[nodiscard]] QByteArray toUtf8() &&
760 {
return toUtf8_helper(*
this); }
761 [[nodiscard]] QByteArray toLocal8Bit()
const &
762 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
763 [[nodiscard]] QByteArray toLocal8Bit() &&
764 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
766 [[nodiscard]] QByteArray toLatin1()
const;
767 [[nodiscard]] QByteArray toUtf8()
const;
768 [[nodiscard]] QByteArray toLocal8Bit()
const;
770 [[nodiscard]] QList<uint> toUcs4()
const;
773 static QString fromLatin1(QByteArrayView ba);
775 static inline QString fromLatin1(
const QByteArray &ba) {
return fromLatin1(QByteArrayView(ba)); }
776 static inline QString fromLatin1(
const char *str, qsizetype size)
778 return fromLatin1(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
780 static QString fromUtf8(QByteArrayView utf8);
782 static inline QString fromUtf8(
const QByteArray &ba) {
return fromUtf8(QByteArrayView(ba)); }
783 static inline QString fromUtf8(
const char *utf8, qsizetype size)
785 return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
787#if defined(__cpp_char8_t) || defined(Q_QDOC)
789 static inline QString fromUtf8(
const char8_t *str)
790 {
return fromUtf8(
reinterpret_cast<
const char *>(str)); }
792 static inline QString fromUtf8(
const char8_t *str, qsizetype size)
793 {
return fromUtf8(
reinterpret_cast<
const char *>(str), size); }
795 static QString fromLocal8Bit(QByteArrayView ba);
797 static inline QString fromLocal8Bit(
const QByteArray &ba) {
return fromLocal8Bit(QByteArrayView(ba)); }
798 static inline QString fromLocal8Bit(
const char *str, qsizetype size)
800 return fromLocal8Bit(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
802 static QString fromUtf16(
const char16_t *, qsizetype size = -1);
803 static QString fromUcs4(
const char32_t *, qsizetype size = -1);
804 static QString fromRawData(
const char16_t *unicode, qsizetype size)
806 return QString(DataPointer::fromRawData(unicode, size));
808 QT_CORE_INLINE_SINCE(6, 10)
809 static QString fromRawData(
const QChar *, qsizetype size);
811#if QT_DEPRECATED_SINCE(6
, 0
)
812 QT_DEPRECATED_VERSION_X_6_0(
"Use char16_t* overload.")
813 static QString fromUtf16(
const ushort *str, qsizetype size = -1)
814 {
return fromUtf16(
reinterpret_cast<
const char16_t *>(str), size); }
815 QT_DEPRECATED_VERSION_X_6_0(
"Use char32_t* overload.")
816 static QString fromUcs4(
const uint *str, qsizetype size = -1)
817 {
return fromUcs4(
reinterpret_cast<
const char32_t *>(str), size); }
820 inline qsizetype toWCharArray(
wchar_t *array)
const;
821 [[nodiscard]]
static inline QString fromWCharArray(
const wchar_t *string, qsizetype size = -1);
823 QString &setRawData(
const QChar *unicode, qsizetype size);
824 QString &setUnicode(
const QChar *unicode, qsizetype size);
826 QString &setUnicode(
const char16_t *utf16, qsizetype size)
827 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
828 QString &setUtf16(
const char16_t *utf16, qsizetype size)
829 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
831#if !QT_CORE_REMOVED_SINCE(6
, 9
)
834 QString &setUtf16(
const ushort *autf16, qsizetype asize)
835 {
return setUnicode(
reinterpret_cast<
const QChar *>(autf16), asize); }
837 int compare(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
838 int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
839 inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
840 int compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
841 {
return compare(QStringView{&ch, 1}, cs); }
843 static inline int compare(
const QString &s1,
const QString &s2,
844 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
845 {
return s1.compare(s2, cs); }
847 static inline int compare(
const QString &s1, QLatin1StringView s2,
848 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
849 {
return s1.compare(s2, cs); }
850 static inline int compare(QLatin1StringView s1,
const QString &s2,
851 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
852 {
return -s2.compare(s1, cs); }
853 static int compare(
const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
854 {
return s1.compare(s2, cs); }
855 static int compare(QStringView s1,
const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
856 {
return -s2.compare(s1, cs); }
858 int localeAwareCompare(
const QString& s)
const;
859 inline int localeAwareCompare(QStringView s)
const;
860 static int localeAwareCompare(
const QString& s1,
const QString& s2)
861 {
return s1.localeAwareCompare(s2); }
863 static inline int localeAwareCompare(QStringView s1, QStringView s2);
865 short toShort(
bool *ok=
nullptr,
int base=10)
const
866 {
return toIntegral_helper<
short>(*
this, ok, base); }
867 ushort toUShort(
bool *ok=
nullptr,
int base=10)
const
868 {
return toIntegral_helper<ushort>(*
this, ok, base); }
869 int toInt(
bool *ok=
nullptr,
int base=10)
const
870 {
return toIntegral_helper<
int>(*
this, ok, base); }
871 uint toUInt(
bool *ok=
nullptr,
int base=10)
const
872 {
return toIntegral_helper<uint>(*
this, ok, base); }
873 long toLong(
bool *ok=
nullptr,
int base=10)
const
874 {
return toIntegral_helper<
long>(*
this, ok, base); }
875 ulong toULong(
bool *ok=
nullptr,
int base=10)
const
876 {
return toIntegral_helper<ulong>(*
this, ok, base); }
877 QT_CORE_INLINE_SINCE(6, 5)
878 qlonglong toLongLong(
bool *ok=
nullptr,
int base=10)
const;
879 QT_CORE_INLINE_SINCE(6, 5)
880 qulonglong toULongLong(
bool *ok=
nullptr,
int base=10)
const;
881 float toFloat(
bool *ok=
nullptr)
const;
882 double toDouble(
bool *ok=
nullptr)
const;
884 inline QString &setNum(
short,
int base=10);
885 inline QString &setNum(ushort,
int base=10);
886 inline QString &setNum(
int,
int base=10);
887 inline QString &setNum(uint,
int base=10);
888 inline QString &setNum(
long,
int base=10);
889 inline QString &setNum(ulong,
int base=10);
890 QString &setNum(qlonglong,
int base=10);
891 QString &setNum(qulonglong,
int base=10);
892 inline QString &setNum(
float,
char format=
'g',
int precision=6);
893 QString &setNum(
double,
char format=
'g',
int precision=6);
895 static QString number(
int,
int base=10);
896 static QString number(uint,
int base=10);
897 static QString number(
long,
int base=10);
898 static QString number(ulong,
int base=10);
899 static QString number(qlonglong,
int base=10);
900 static QString number(qulonglong,
int base=10);
901 static QString number(
double,
char format=
'g',
int precision=6);
903 friend bool comparesEqual(
const QString &s1,
const QString &s2)
noexcept
904 {
return comparesEqual(QStringView(s1), QStringView(s2)); }
905 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const QString &s2)
noexcept
906 {
return compareThreeWay(QStringView(s1), QStringView(s2)); }
907 Q_DECLARE_STRONGLY_ORDERED(QString)
910 friend bool comparesEqual(
const QString &s1, QUtf8StringView s2)
noexcept
911 {
return QtPrivate::equalStrings(s1, s2); }
913 friend Qt::strong_ordering compareThreeWay(
const QString &s1, QUtf8StringView s2)
noexcept
915 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
916 return Qt::compareThreeWay(res, 0);
918 Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
921 friend bool comparesEqual(
const QString &s1,
const char8_t *s2)
noexcept
922 {
return comparesEqual(s1, QUtf8StringView(s2)); }
923 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char8_t *s2)
noexcept
924 {
return compareThreeWay(s1, QUtf8StringView(s2)); }
925 Q_DECLARE_STRONGLY_ORDERED(QString,
const char8_t *)
928 friend bool comparesEqual(
const QString &s1, QLatin1StringView s2)
noexcept
929 {
return (s1.size() == s2.size()) && QtPrivate::equalStrings(s1, s2); }
930 friend Qt::strong_ordering
931 compareThreeWay(
const QString &s1, QLatin1StringView s2)
noexcept
933 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
934 return Qt::compareThreeWay(res, 0);
936 Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
939 friend bool comparesEqual(
const QString &s1, std::nullptr_t)
noexcept
940 {
return s1.isEmpty(); }
941 friend Qt::strong_ordering compareThreeWay(
const QString &s1, std::nullptr_t)
noexcept
942 {
return s1.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
943 Q_DECLARE_STRONGLY_ORDERED(QString, std::nullptr_t)
945 friend bool comparesEqual(
const QString &s1,
const char16_t *s2)
noexcept
946 {
return comparesEqual(s1, QStringView(s2)); }
947 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char16_t *s2)
noexcept
948 {
return compareThreeWay(s1, QStringView(s2)); }
949 Q_DECLARE_STRONGLY_ORDERED(QString,
const char16_t *)
952 friend bool comparesEqual(
const QString &lhs, QChar rhs)
noexcept
953 {
return lhs.size() == 1 && rhs == lhs.front(); }
954 friend Qt::strong_ordering compareThreeWay(
const QString &lhs, QChar rhs)
noexcept
956 const int res = compare_helper(lhs.data(), lhs.size(), &rhs, 1);
957 return Qt::compareThreeWay(res, 0);
959 Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
962#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
963 template <qsizetype N>
964 inline QString(
const char (&ch)[N])
965 : QString(fromUtf8(ch))
967 template <qsizetype N>
968 QString(
char (&)[N]) =
delete;
969 template <qsizetype N>
970 inline QString &operator=(
const char (&ch)[N])
971 {
return (*
this = fromUtf8(ch, N - 1)); }
972 template <qsizetype N>
973 QString &operator=(
char (&)[N]) =
delete;
975#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
976 QT_ASCII_CAST_WARN
inline QString(
const char *ch)
977 : QString(fromUtf8(ch))
979 QT_ASCII_CAST_WARN
inline QString(
const QByteArray &a)
980 : QString(fromUtf8(a))
982 QT_ASCII_CAST_WARN
inline QString &operator=(
const char *ch)
990 QT_ASCII_CAST_WARN
inline QString &operator=(
const QByteArray &a)
999 QT_ASCII_CAST_WARN
inline QString &prepend(
const char *s)
1000 {
return prepend(QUtf8StringView(s)); }
1001 QT_ASCII_CAST_WARN
inline QString &prepend(
const QByteArray &s)
1002 {
return prepend(QUtf8StringView(s)); }
1003 QT_ASCII_CAST_WARN
inline QString &append(
const char *s)
1004 {
return append(QUtf8StringView(s)); }
1005 QT_ASCII_CAST_WARN
inline QString &append(
const QByteArray &s)
1006 {
return append(QUtf8StringView(s)); }
1007 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const char *s)
1008 {
return insert(i, QUtf8StringView(s)); }
1009 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const QByteArray &s)
1010 {
return insert(i, QUtf8StringView(s)); }
1011 QT_ASCII_CAST_WARN
inline QString &operator+=(
const char *s)
1012 {
return append(QUtf8StringView(s)); }
1013 QT_ASCII_CAST_WARN
inline QString &operator+=(
const QByteArray &s)
1014 {
return append(QUtf8StringView(s)); }
1016#if QT_CORE_REMOVED_SINCE(6
, 8
)
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;
1021 QT_ASCII_CAST_WARN
inline bool operator>(
const char *s)
const;
1022 QT_ASCII_CAST_WARN
inline bool operator>=(
const char *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;
1028 QT_ASCII_CAST_WARN
inline bool operator<=(
const QByteArray &s)
const;
1029 QT_ASCII_CAST_WARN
inline bool operator>=(
const QByteArray &s)
const;
1031 friend bool comparesEqual(
const QString &lhs, QByteArrayView rhs)
noexcept
1033 return QString::compare_helper(lhs.constData(), lhs.size(),
1034 rhs.constData(), rhs.size()) == 0;
1036 friend Qt::strong_ordering
1037 compareThreeWay(
const QString &lhs, QByteArrayView rhs)
noexcept
1039 const int res = QString::compare_helper(lhs.constData(), lhs.size(),
1040 rhs.constData(), rhs.size());
1041 return Qt::compareThreeWay(res, 0);
1043 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
1045 friend bool comparesEqual(
const QString &lhs,
const QByteArray &rhs)
noexcept
1046 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1047 friend Qt::strong_ordering
1048 compareThreeWay(
const QString &lhs,
const QByteArray &rhs)
noexcept
1050 return compareThreeWay(lhs, QByteArrayView(rhs));
1052 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
1054 friend bool comparesEqual(
const QString &lhs,
const char *rhs)
noexcept
1055 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1056 friend Qt::strong_ordering
1057 compareThreeWay(
const QString &lhs,
const char *rhs)
noexcept
1059 return compareThreeWay(lhs, QByteArrayView(rhs));
1061 Q_DECLARE_STRONGLY_ORDERED(QString,
const char *, QT_ASCII_CAST_WARN)
1066 typedef QChar *iterator;
1067 typedef const QChar *const_iterator;
1068 typedef iterator Iterator;
1069 typedef const_iterator ConstIterator;
1070 typedef std::reverse_iterator<iterator> reverse_iterator;
1071 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
1072 inline iterator begin();
1073 inline const_iterator begin()
const;
1074 inline const_iterator cbegin()
const;
1075 inline const_iterator constBegin()
const;
1076 inline iterator end();
1077 inline const_iterator end()
const;
1078 inline const_iterator cend()
const;
1079 inline const_iterator constEnd()
const;
1080 reverse_iterator rbegin() {
return reverse_iterator(end()); }
1081 reverse_iterator rend() {
return reverse_iterator(begin()); }
1082 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
1083 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
1084 const_reverse_iterator crbegin()
const {
return const_reverse_iterator(end()); }
1085 const_reverse_iterator crend()
const {
return const_reverse_iterator(begin()); }
1088 typedef qsizetype size_type;
1089 typedef qptrdiff difference_type;
1090 typedef const QChar & const_reference;
1091 typedef QChar & reference;
1092 typedef QChar *pointer;
1093 typedef const QChar *const_pointer;
1094 typedef QChar value_type;
1095 inline void push_back(QChar c) { append(c); }
1096 inline void push_back(
const QString &s) { append(s); }
1097 inline void push_front(QChar c) { prepend(c); }
1098 inline void push_front(
const QString &s) { prepend(s); }
1099 void shrink_to_fit() { squeeze(); }
1100 iterator erase(const_iterator first, const_iterator last);
1101 inline iterator erase(const_iterator it) {
return erase(it, it + 1); }
1102 constexpr qsizetype max_size()
const noexcept
1107 static inline QString fromStdString(
const std::string &s);
1108 std::string toStdString()
const;
1109 static inline QString fromStdWString(
const std::wstring &s);
1110 inline std::wstring toStdWString()
const;
1112 static inline QString fromStdU16String(
const std::u16string &s);
1113 inline std::u16string toStdU16String()
const;
1114 static inline QString fromStdU32String(
const std::u32string &s);
1115 inline std::u32string toStdU32String()
const;
1117 Q_IMPLICIT
inline operator std::u16string_view()
const noexcept;
1119#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
1120 static QString fromCFString(CFStringRef string);
1121 CFStringRef toCFString()
const Q_DECL_CF_RETURNS_RETAINED;
1122 static QString fromNSString(
const NSString *string);
1123 NSString *toNSString()
const Q_DECL_NS_RETURNS_AUTORELEASED;
1126#if defined(Q_OS_WASM) || defined(Q_QDOC)
1127 static QString fromEcmaString(emscripten::val jsString);
1128 emscripten::val toEcmaString()
const;
1131 constexpr bool isNull()
const {
return d.isNull(); }
1133 bool isRightToLeft()
const;
1134 [[nodiscard]]
bool isValidUtf16()
const noexcept
1135 {
return QStringView(*
this).isValidUtf16(); }
1137 QString(qsizetype size, Qt::Initialization);
1138 explicit QString(DataPointer &&dd) : d(std::move(dd)) {}
1141#if defined(QT_NO_CAST_FROM_ASCII)
1142#define QSTRING_DECL_DELETED_ASCII_OP Q_DECL_EQ_DELETE_X("This function is not available under QT_NO_CAST_FROM_ASCII")
1143 QString &operator+=(
const char *s) QSTRING_DECL_DELETED_ASCII_OP;
1144 QString &operator+=(
const QByteArray &s) QSTRING_DECL_DELETED_ASCII_OP;
1145 QString(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1146 QString(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1147 QString &operator=(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1148 QString &operator=(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1149#undef QSTRING_DECL_DELETED_ASCII_OP
1153 static const char16_t _empty;
1155 void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
1156 void reallocGrowData(qsizetype n);
1158 QString &assign_helper(
const char32_t *data, qsizetype len);
1160 template <
typename InputIterator>
1161 void assign_helper_char8(InputIterator first, InputIterator last);
1162 static int compare_helper(
const QChar *data1, qsizetype length1,
1163 const QChar *data2, qsizetype length2,
1164 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1165 static int compare_helper(
const QChar *data1, qsizetype length1,
1166 const char *data2, qsizetype length2,
1167 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1168 static int localeAwareCompare_helper(
const QChar *data1, qsizetype length1,
1169 const QChar *data2, qsizetype length2);
1170 static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);
1171 static QString toLower_helper(
const QString &str);
1172 static QString toLower_helper(QString &str);
1173 static QString toUpper_helper(
const QString &str);
1174 static QString toUpper_helper(QString &str);
1175 static QString toCaseFolded_helper(
const QString &str);
1176 static QString toCaseFolded_helper(QString &str);
1177 static QString trimmed_helper(
const QString &str);
1178 static QString trimmed_helper(QString &str);
1179 static QString simplified_helper(
const QString &str);
1180 static QString simplified_helper(QString &str);
1181 static QByteArray toLatin1_helper(
const QString &);
1182 static QByteArray toLatin1_helper_inplace(QString &);
1183 static QByteArray toUtf8_helper(
const QString &);
1184 static QByteArray toLocal8Bit_helper(
const QChar *data, qsizetype size);
1185#if QT_CORE_REMOVED_SINCE(6
, 6
)
1186 static qsizetype toUcs4_helper(
const ushort *uc, qsizetype length, uint *out);
1188 static qsizetype toUcs4_helper(
const char16_t *uc, qsizetype length,
char32_t *out);
1189 static qlonglong toIntegral_helper(QStringView string,
bool *ok,
int base);
1190 static qulonglong toIntegral_helper(QStringView string,
bool *ok, uint base);
1191 template <
typename Predicate>
1192 qsizetype removeIf_helper(Predicate pred)
1194 const qsizetype result = d->eraseIf(pred);
1196 d.data()[d.size] = u'\0';
1200 friend class QStringView;
1201 friend class QByteArray;
1202 friend struct QAbstractConcatenable;
1203 template <
typename T>
friend qsizetype erase(QString &s,
const T &t);
1204 template <
typename Predicate>
friend qsizetype erase_if(QString &s, Predicate pred);
1206 template <
typename T>
static
1207 T toIntegral_helper(QStringView string,
bool *ok,
int base)
1209 using Int64 =
typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
1210 using Int32 =
typename std::conditional<std::is_unsigned<T>::value, uint,
int>::type;
1213 Int64 val = toIntegral_helper(string, ok, Int32(base));
1214 if (T(val) != val) {
1222 Q_ALWAYS_INLINE
constexpr void verify([[maybe_unused]] qsizetype pos = 0,
1223 [[maybe_unused]] qsizetype n = 1)
const
1226 Q_ASSERT(pos <= d.size);
1228 Q_ASSERT(n <= d.size - pos);
1232 inline DataPointer &data_ptr() {
return d; }
1233 inline const DataPointer &data_ptr()
const {
return d; }