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]] QT_CORE_INLINE_SINCE(6, 12)
409 qsizetype indexOf(QLatin1StringView s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
410 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 12)
411 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 QStringView(begin(), size()).indexOf(s, from, 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]] QT_CORE_INLINE_SINCE(6, 12)
421 qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
422 [[nodiscard]] qsizetype lastIndexOf(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const
423 {
return lastIndexOf(s, size(), cs); }
424 [[nodiscard]] QT_CORE_INLINE_SINCE(6, 12)
425 qsizetype lastIndexOf(
const QString &s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
427 [[nodiscard]] qsizetype lastIndexOf(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
428 {
return lastIndexOf(s, size(), cs); }
429 [[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
430 {
return QStringView(begin(), size()).lastIndexOf(s, from, cs); }
432 [[nodiscard]]
inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
433 [[nodiscard]]
inline bool contains(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
434 [[nodiscard]]
inline bool contains(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
435 [[nodiscard]]
inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
436 [[nodiscard]] qsizetype count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
437 [[nodiscard]] qsizetype count(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
438 [[nodiscard]] qsizetype count(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
440#if QT_CONFIG(regularexpression)
441 [[nodiscard]] qsizetype indexOf(
const QRegularExpression &re, qsizetype from = 0,
442 QRegularExpressionMatch *rmatch =
nullptr)
const;
444 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
447 template <
typename T = QRegularExpressionMatch, std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>,
bool> =
false>
448 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, T *rmatch =
nullptr)
const
449 {
return lastIndexOf(re, size(), rmatch); }
451 [[nodiscard]] qsizetype lastIndexOf(
const QRegularExpression &re, qsizetype from,
452 QRegularExpressionMatch *rmatch =
nullptr)
const;
453 [[nodiscard]]
bool contains(
const QRegularExpression &re, QRegularExpressionMatch *rmatch =
nullptr)
const;
454 [[nodiscard]] qsizetype count(
const QRegularExpression &re)
const;
458 SectionDefault = 0x00,
459 SectionSkipEmpty = 0x01,
460 SectionIncludeLeadingSep = 0x02,
461 SectionIncludeTrailingSep = 0x04,
462 SectionCaseInsensitiveSeps = 0x08
464 Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
466 [[nodiscard]]
inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
467 [[nodiscard]] QString section(
const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
468#if QT_CONFIG(regularexpression)
469 [[nodiscard]] QString section(
const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)
const;
472#if QT_CORE_REMOVED_SINCE(6
, 7
)
473 QString left(qsizetype n)
const;
474 QString right(qsizetype n)
const;
475 QString mid(qsizetype position, qsizetype n = -1)
const;
477 QString first(qsizetype n)
const;
478 QString last(qsizetype n)
const;
479 QString sliced(qsizetype pos)
const;
480 QString sliced(qsizetype pos, qsizetype n)
const;
481 QString chopped(qsizetype n)
const;
483 [[nodiscard]] QString left(qsizetype n)
const &
485 if (size_t(n) >= size_t(size()))
489 [[nodiscard]] QString left(qsizetype n) &&
491 if (size_t(n) >= size_t(size()))
492 return std::move(*
this);
493 return std::move(*
this).first(n);
495 [[nodiscard]] QString right(qsizetype n)
const &
497 if (size_t(n) >= size_t(size()))
501 [[nodiscard]] QString right(qsizetype n) &&
503 if (size_t(n) >= size_t(size()))
504 return std::move(*
this);
505 return std::move(*
this).last(n);
507 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1)
const &;
508 [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;
510 [[nodiscard]] QString first(qsizetype n)
const &
511 { verify(0, n);
return sliced(0, n); }
512 [[nodiscard]] QString last(qsizetype n)
const &
513 { verify(0, n);
return sliced(size() - n, n); }
514 [[nodiscard]] QString sliced(qsizetype pos)
const &
515 { verify(pos, 0);
return sliced(pos, size() - pos); }
516 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n)
const &
517 { verify(pos, n);
return QString(begin() + pos, n); }
518 [[nodiscard]] QString chopped(qsizetype n)
const &
519 { verify(0, n);
return sliced(0, size() - n); }
521 [[nodiscard]] QString first(qsizetype n) &&
525 return std::move(*
this);
527 [[nodiscard]] QString last(qsizetype n) &&
528 { verify(0, n);
return sliced_helper(*
this, size() - n, n); }
529 [[nodiscard]] QString sliced(qsizetype pos) &&
530 { verify(pos, 0);
return sliced_helper(*
this, pos, size() - pos); }
531 [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
532 { verify(pos, n);
return sliced_helper(*
this, pos, n); }
533 [[nodiscard]] QString chopped(qsizetype n) &&
534 { verify(0, n); chop(n);
return std::move(*
this); }
536 bool startsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
537 [[nodiscard]]
bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
538 {
return QStringView(begin(), size()).startsWith(s, cs); }
539 bool startsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
540 bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
542 bool endsWith(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
543 [[nodiscard]]
bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
544 {
return QStringView(begin(), size()).endsWith(s, cs); }
545 bool endsWith(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
546 bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
548 bool isUpper()
const;
549 bool isLower()
const;
551 [[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
552 [[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ',
bool trunc =
false)
const;
555 [[nodiscard]] QString toLower()
const &
556 {
return toLower_helper(*
this); }
557 [[nodiscard]] QString toLower() &&
558 {
return toLower_helper(*
this); }
559 [[nodiscard]] QString toUpper()
const &
560 {
return toUpper_helper(*
this); }
561 [[nodiscard]] QString toUpper() &&
562 {
return toUpper_helper(*
this); }
563 [[nodiscard]] QString toCaseFolded()
const &
564 {
return toCaseFolded_helper(*
this); }
565 [[nodiscard]] QString toCaseFolded() &&
566 {
return toCaseFolded_helper(*
this); }
567 [[nodiscard]] QString trimmed()
const &
568 {
return trimmed_helper(*
this); }
569 [[nodiscard]] QString trimmed() &&
570 {
return trimmed_helper(*
this); }
571 [[nodiscard]] QString simplified()
const &
572 {
return simplified_helper(*
this); }
573 [[nodiscard]] QString simplified() &&
574 {
return simplified_helper(*
this); }
576 [[nodiscard]] QString toLower()
const;
577 [[nodiscard]] QString toUpper()
const;
578 [[nodiscard]] QString toCaseFolded()
const;
579 [[nodiscard]] QString trimmed()
const;
580 [[nodiscard]] QString simplified()
const;
582 [[nodiscard]] QString toHtmlEscaped()
const;
584 QString &insert(qsizetype i, QChar c);
585 QString &insert(qsizetype i,
const QChar *uc, qsizetype len);
586 inline QString &insert(qsizetype i,
const QString &s) {
return insert(i, s.constData(), s.size()); }
587 inline QString &insert(qsizetype i, QStringView v) {
return insert(i, v.data(), v.size()); }
588 QString &insert(qsizetype i, QLatin1StringView s);
589 QString &insert(qsizetype i, QUtf8StringView s);
591 QString &append(QChar c);
592 QString &append(
const QChar *uc, qsizetype len);
593 QString &append(
const QString &s);
594 inline QString &append(QStringView v) {
return append(v.data(), v.size()); }
595 QString &append(QLatin1StringView s);
596 QString &append(QUtf8StringView s);
598 inline QString &prepend(QChar c) {
return insert(0, c); }
599 inline QString &prepend(
const QChar *uc, qsizetype len) {
return insert(0, uc, len); }
600 inline QString &prepend(
const QString &s) {
return insert(0, s); }
601 inline QString &prepend(QStringView v) {
return prepend(v.data(), v.size()); }
602 inline QString &prepend(QLatin1StringView s) {
return insert(0, s); }
603 QString &prepend(QUtf8StringView s) {
return insert(0, s); }
605 QString &assign(QAnyStringView s);
606 inline QString &assign(qsizetype n, QChar c)
611 template <
typename InputIterator, if_compatible_iterator<InputIterator> =
true>
612 QString &assign(InputIterator first, InputIterator last)
614 using V =
typename std::iterator_traits<InputIterator>::value_type;
615 constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
616 constexpr bool IsFwdIt = std::is_convertible_v<
617 typename std::iterator_traits<InputIterator>::iterator_category,
618 std::forward_iterator_tag
621 if constexpr (is_contiguous_iterator_v<InputIterator>) {
622 const auto p = q20::to_address(first);
623 const auto len = qsizetype(last - first);
625 return assign(QLatin1StringView(
reinterpret_cast<
const char*>(p), len));
626 else if constexpr (
sizeof(V) == 4)
627 return assign_helper(p, len);
629 return assign(QAnyStringView(p, len));
630 }
else if constexpr (
sizeof(V) == 4) {
632 if constexpr (IsFwdIt) {
633 const qsizetype requiredCapacity = 2 * std::distance(first, last);
634 reserve(requiredCapacity);
636 while (first != last) {
637 append(QChar::fromUcs4(*first));
641 }
else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
642 assign_helper_char8(first, last);
643 if (d.constAllocatedCapacity())
644 d.data()[d.size] = u'\0';
647 d->assign(first, last, [](QChar ch)
noexcept ->
char16_t {
return ch.unicode(); });
648 if (d.constAllocatedCapacity())
649 d.data()[d.size] = u'\0';
654 inline QString &operator+=(QChar c) {
return append(c); }
656 inline QString &operator+=(
const QString &s) {
return append(s); }
657 inline QString &operator+=(QStringView v) {
return append(v); }
658 inline QString &operator+=(QLatin1StringView s) {
return append(s); }
659 QString &operator+=(QUtf8StringView s) {
return append(s); }
661#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
662 template <qsizetype N>
663 QString &insert(qsizetype i,
const char (&ch)[N]) {
return insert(i, QUtf8StringView(ch)); }
664 template <qsizetype N>
665 QString &append(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
666 template <qsizetype N>
667 QString &prepend(
const char (&ch)[N]) {
return prepend(QUtf8StringView(ch)); }
668 template <qsizetype N>
669 QString &operator+=(
const char (&ch)[N]) {
return append(QUtf8StringView(ch)); }
672 QString &remove(qsizetype i, qsizetype len);
673 QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
674 QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
675 QString &remove(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
677 QString &removeAt(qsizetype pos)
678 {
return size_t(pos) < size_t(size()) ? remove(pos, 1) : *
this; }
679 QString &removeFirst() {
return !isEmpty() ? remove(0, 1) : *
this; }
680 QString &removeLast() {
return !isEmpty() ? remove(size() - 1, 1) : *
this; }
682 template <
typename Predicate>
683 QString &removeIf(Predicate pred)
685 removeIf_helper(pred);
689 QString &replace(qsizetype i, qsizetype len, QChar after);
690 QString &replace(qsizetype i, qsizetype len,
const QChar *s, qsizetype slen);
691 QString &replace(qsizetype i, qsizetype len,
const QString &after);
692 QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
693 QString &replace(
const QChar *before, qsizetype blen,
const QChar *after, qsizetype alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
694 QString &replace(QLatin1StringView before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
695 QString &replace(QLatin1StringView before,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
696 QString &replace(
const QString &before, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
697 QString &replace(
const QString &before,
const QString &after,
698 Qt::CaseSensitivity cs = Qt::CaseSensitive);
699 QString &replace(QChar c,
const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
700 QString &replace(QChar c, QLatin1StringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
701#if QT_CONFIG(regularexpression)
702 QString &replace(
const QRegularExpression &re,
const QString &after);
703 inline QString &remove(
const QRegularExpression &re)
704 {
return replace(re, QString()); }
709 QStringList split(
const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
710 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
712 QStringList split(QChar sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts,
713 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const;
714#ifndef QT_NO_REGULAREXPRESSION
716 QStringList split(
const QRegularExpression &sep,
717 Qt::SplitBehavior behavior = Qt::KeepEmptyParts)
const;
720 template <
typename Needle,
typename...Flags>
721 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &
722 noexcept(
noexcept(qTokenize(std::declval<
const QString &>(), std::forward<Needle>(needle), flags...)))
723 ->
decltype(qTokenize(*
this, std::forward<Needle>(needle), flags...))
724 {
return qTokenize(qToStringViewIgnoringNull(*
this), std::forward<Needle>(needle), flags...); }
726 template <
typename Needle,
typename...Flags>
727 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags)
const &&
728 noexcept(
noexcept(qTokenize(std::declval<
const QString>(), std::forward<Needle>(needle), flags...)))
729 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
730 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
732 template <
typename Needle,
typename...Flags>
733 [[nodiscard]]
inline auto tokenize(Needle &&needle, Flags...flags) &&
734 noexcept(
noexcept(qTokenize(std::declval<QString>(), std::forward<Needle>(needle), flags...)))
735 ->
decltype(qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...))
736 {
return qTokenize(std::move(*
this), std::forward<Needle>(needle), flags...); }
739 enum NormalizationForm {
742 NormalizationForm_KD,
745 [[nodiscard]] QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned)
const;
747 [[nodiscard]] QString repeated(qsizetype times)
const;
749 const ushort *utf16()
const;
750 [[nodiscard]] QString nullTerminated()
const &;
751 [[nodiscard]] QString nullTerminated() &&;
752 QString &nullTerminate();
755 [[nodiscard]] QByteArray toLatin1()
const &
756 {
return toLatin1_helper(*
this); }
757 [[nodiscard]] QByteArray toLatin1() &&
758 {
return toLatin1_helper_inplace(*
this); }
759 [[nodiscard]] QByteArray toUtf8()
const &
760 {
return toUtf8_helper(*
this); }
761 [[nodiscard]] QByteArray toUtf8() &&
762 {
return toUtf8_helper(*
this); }
763 [[nodiscard]] QByteArray toLocal8Bit()
const &
764 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
765 [[nodiscard]] QByteArray toLocal8Bit() &&
766 {
return toLocal8Bit_helper(isNull() ?
nullptr : constData(), size()); }
768 [[nodiscard]] QByteArray toLatin1()
const;
769 [[nodiscard]] QByteArray toUtf8()
const;
770 [[nodiscard]] QByteArray toLocal8Bit()
const;
772 [[nodiscard]] QList<uint> toUcs4()
const;
775 static QString fromLatin1(QByteArrayView ba);
777 static inline QString fromLatin1(
const QByteArray &ba) {
return fromLatin1(QByteArrayView(ba)); }
778 static inline QString fromLatin1(
const char *str, qsizetype size)
780 return fromLatin1(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
782 static QString fromUtf8(QByteArrayView utf8);
784 static inline QString fromUtf8(
const QByteArray &ba) {
return fromUtf8(QByteArrayView(ba)); }
785 static inline QString fromUtf8(
const char *utf8, qsizetype size)
787 return fromUtf8(QByteArrayView(utf8, !utf8 || size < 0 ? qstrlen(utf8) : size));
789#if defined(__cpp_char8_t) || defined(Q_QDOC)
791 static inline QString fromUtf8(
const char8_t *str)
792 {
return fromUtf8(
reinterpret_cast<
const char *>(str)); }
794 static inline QString fromUtf8(
const char8_t *str, qsizetype size)
795 {
return fromUtf8(
reinterpret_cast<
const char *>(str), size); }
797 static QString fromLocal8Bit(QByteArrayView ba);
799 static inline QString fromLocal8Bit(
const QByteArray &ba) {
return fromLocal8Bit(QByteArrayView(ba)); }
800 static inline QString fromLocal8Bit(
const char *str, qsizetype size)
802 return fromLocal8Bit(QByteArrayView(str, !str || size < 0 ? qstrlen(str) : size));
804 static QString fromUtf16(
const char16_t *, qsizetype size = -1);
805 static QString fromUcs4(
const char32_t *, qsizetype size = -1);
806 static QString fromRawData(
const char16_t *unicode, qsizetype size)
808 return QString(DataPointer::fromRawData(unicode, size));
810 QT_CORE_INLINE_SINCE(6, 10)
811 static QString fromRawData(
const QChar *, qsizetype size);
813#if QT_DEPRECATED_SINCE(6
, 0
)
814 QT_DEPRECATED_VERSION_X_6_0(
"Use char16_t* overload.")
815 static QString fromUtf16(
const ushort *str, qsizetype size = -1)
816 {
return fromUtf16(
reinterpret_cast<
const char16_t *>(str), size); }
817 QT_DEPRECATED_VERSION_X_6_0(
"Use char32_t* overload.")
818 static QString fromUcs4(
const uint *str, qsizetype size = -1)
819 {
return fromUcs4(
reinterpret_cast<
const char32_t *>(str), size); }
822 inline qsizetype toWCharArray(
wchar_t *array)
const;
823 [[nodiscard]]
static inline QString fromWCharArray(
const wchar_t *string, qsizetype size = -1);
825 QString &setRawData(
const QChar *unicode, qsizetype size);
826 QString &setUnicode(
const QChar *unicode, qsizetype size);
828 QString &setUnicode(
const char16_t *utf16, qsizetype size)
829 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
830 QString &setUtf16(
const char16_t *utf16, qsizetype size)
831 {
return setUnicode(
reinterpret_cast<
const QChar *>(utf16), size); }
833#if !QT_CORE_REMOVED_SINCE(6
, 9
)
836 QString &setUtf16(
const ushort *autf16, qsizetype asize)
837 {
return setUnicode(
reinterpret_cast<
const QChar *>(autf16), asize); }
839 int compare(
const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
840 int compare(QLatin1StringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
841 inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept;
842 int compare(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
843 {
return compare(QStringView{&ch, 1}, cs); }
845 static inline int compare(
const QString &s1,
const QString &s2,
846 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
847 {
return s1.compare(s2, cs); }
849 static inline int compare(
const QString &s1, QLatin1StringView s2,
850 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
851 {
return s1.compare(s2, cs); }
852 static inline int compare(QLatin1StringView s1,
const QString &s2,
853 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
854 {
return -s2.compare(s1, cs); }
855 static int compare(
const QString &s1, QStringView s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
856 {
return s1.compare(s2, cs); }
857 static int compare(QStringView s1,
const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept
858 {
return -s2.compare(s1, cs); }
860 int localeAwareCompare(
const QString& s)
const;
861 inline int localeAwareCompare(QStringView s)
const;
862 static int localeAwareCompare(
const QString& s1,
const QString& s2)
863 {
return s1.localeAwareCompare(s2); }
865 static inline int localeAwareCompare(QStringView s1, QStringView s2);
867 short toShort(
bool *ok=
nullptr,
int base=10)
const
868 {
return toIntegral_helper<
short>(*
this, ok, base); }
869 ushort toUShort(
bool *ok=
nullptr,
int base=10)
const
870 {
return toIntegral_helper<ushort>(*
this, ok, base); }
871 int toInt(
bool *ok=
nullptr,
int base=10)
const
872 {
return toIntegral_helper<
int>(*
this, ok, base); }
873 uint toUInt(
bool *ok=
nullptr,
int base=10)
const
874 {
return toIntegral_helper<uint>(*
this, ok, base); }
875 long toLong(
bool *ok=
nullptr,
int base=10)
const
876 {
return toIntegral_helper<
long>(*
this, ok, base); }
877 ulong toULong(
bool *ok=
nullptr,
int base=10)
const
878 {
return toIntegral_helper<ulong>(*
this, ok, base); }
879 QT_CORE_INLINE_SINCE(6, 5)
880 qlonglong toLongLong(
bool *ok=
nullptr,
int base=10)
const;
881 QT_CORE_INLINE_SINCE(6, 5)
882 qulonglong toULongLong(
bool *ok=
nullptr,
int base=10)
const;
883 float toFloat(
bool *ok=
nullptr)
const;
884 double toDouble(
bool *ok=
nullptr)
const;
886 inline QString &setNum(
short,
int base=10);
887 inline QString &setNum(ushort,
int base=10);
888 inline QString &setNum(
int,
int base=10);
889 inline QString &setNum(uint,
int base=10);
890 inline QString &setNum(
long,
int base=10);
891 inline QString &setNum(ulong,
int base=10);
892 QString &setNum(qlonglong,
int base=10);
893 QString &setNum(qulonglong,
int base=10);
894 inline QString &setNum(
float,
char format=
'g',
int precision=6);
895 QString &setNum(
double,
char format=
'g',
int precision=6);
897 static QString number(
int,
int base=10);
898 static QString number(uint,
int base=10);
899 static QString number(
long,
int base=10);
900 static QString number(ulong,
int base=10);
901 static QString number(qlonglong,
int base=10);
902 static QString number(qulonglong,
int base=10);
903 static QString number(
double,
char format=
'g',
int precision=6);
905 friend bool comparesEqual(
const QString &s1,
const QString &s2)
noexcept
906 {
return comparesEqual(QStringView(s1), QStringView(s2)); }
907 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const QString &s2)
noexcept
908 {
return compareThreeWay(QStringView(s1), QStringView(s2)); }
909 Q_DECLARE_STRONGLY_ORDERED(QString)
912 friend bool comparesEqual(
const QString &s1, QUtf8StringView s2)
noexcept
913 {
return QtPrivate::equalStrings(s1, s2); }
915 friend Qt::strong_ordering compareThreeWay(
const QString &s1, QUtf8StringView s2)
noexcept
917 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
918 return Qt::compareThreeWay(res, 0);
920 Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
923 friend bool comparesEqual(
const QString &s1,
const char8_t *s2)
noexcept
924 {
return comparesEqual(s1, QUtf8StringView(s2)); }
925 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char8_t *s2)
noexcept
926 {
return compareThreeWay(s1, QUtf8StringView(s2)); }
927 Q_DECLARE_STRONGLY_ORDERED(QString,
const char8_t *)
930 friend bool comparesEqual(
const QString &s1, QLatin1StringView s2)
noexcept
931 {
return (s1.size() == s2.size()) && QtPrivate::equalStrings(s1, s2); }
932 friend Qt::strong_ordering
933 compareThreeWay(
const QString &s1, QLatin1StringView s2)
noexcept
935 const int res = QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive);
936 return Qt::compareThreeWay(res, 0);
938 Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
941 friend bool comparesEqual(
const QString &s1, std::nullptr_t)
noexcept
942 {
return s1.isEmpty(); }
943 friend Qt::strong_ordering compareThreeWay(
const QString &s1, std::nullptr_t)
noexcept
944 {
return s1.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
945 Q_DECLARE_STRONGLY_ORDERED(QString, std::nullptr_t)
947 friend bool comparesEqual(
const QString &s1,
const char16_t *s2)
noexcept
948 {
return comparesEqual(s1, QStringView(s2)); }
949 friend Qt::strong_ordering compareThreeWay(
const QString &s1,
const char16_t *s2)
noexcept
950 {
return compareThreeWay(s1, QStringView(s2)); }
951 Q_DECLARE_STRONGLY_ORDERED(QString,
const char16_t *)
954 friend bool comparesEqual(
const QString &lhs, QChar rhs)
noexcept
955 {
return lhs.size() == 1 && rhs == lhs.front(); }
956 friend Qt::strong_ordering compareThreeWay(
const QString &lhs, QChar rhs)
noexcept
958 const int res = compare_helper(lhs.data(), lhs.size(), &rhs, 1);
959 return Qt::compareThreeWay(res, 0);
961 Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
964#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
965 template <qsizetype N>
966 inline QString(
const char (&ch)[N])
967 : QString(fromUtf8(ch))
969 template <qsizetype N>
970 QString(
char (&)[N]) =
delete;
971 template <qsizetype N>
972 inline QString &operator=(
const char (&ch)[N])
973 {
return (*
this = fromUtf8(ch, N - 1)); }
974 template <qsizetype N>
975 QString &operator=(
char (&)[N]) =
delete;
977#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
978 QT_ASCII_CAST_WARN
inline QString(
const char *ch)
979 : QString(fromUtf8(ch))
981 QT_ASCII_CAST_WARN
inline QString(
const QByteArray &a)
982 : QString(fromUtf8(a))
984 QT_ASCII_CAST_WARN
inline QString &operator=(
const char *ch)
992 QT_ASCII_CAST_WARN
inline QString &operator=(
const QByteArray &a)
1001 QT_ASCII_CAST_WARN
inline QString &prepend(
const char *s)
1002 {
return prepend(QUtf8StringView(s)); }
1003 QT_ASCII_CAST_WARN
inline QString &prepend(
const QByteArray &s)
1004 {
return prepend(QUtf8StringView(s)); }
1005 QT_ASCII_CAST_WARN
inline QString &append(
const char *s)
1006 {
return append(QUtf8StringView(s)); }
1007 QT_ASCII_CAST_WARN
inline QString &append(
const QByteArray &s)
1008 {
return append(QUtf8StringView(s)); }
1009 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const char *s)
1010 {
return insert(i, QUtf8StringView(s)); }
1011 QT_ASCII_CAST_WARN
inline QString &insert(qsizetype i,
const QByteArray &s)
1012 {
return insert(i, QUtf8StringView(s)); }
1013 QT_ASCII_CAST_WARN
inline QString &operator+=(
const char *s)
1014 {
return append(QUtf8StringView(s)); }
1015 QT_ASCII_CAST_WARN
inline QString &operator+=(
const QByteArray &s)
1016 {
return append(QUtf8StringView(s)); }
1018#if QT_CORE_REMOVED_SINCE(6
, 8
)
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;
1023 QT_ASCII_CAST_WARN
inline bool operator>(
const char *s)
const;
1024 QT_ASCII_CAST_WARN
inline bool operator>=(
const char *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;
1030 QT_ASCII_CAST_WARN
inline bool operator<=(
const QByteArray &s)
const;
1031 QT_ASCII_CAST_WARN
inline bool operator>=(
const QByteArray &s)
const;
1033 friend bool comparesEqual(
const QString &lhs, QByteArrayView rhs)
noexcept
1035 return QString::compare_helper(lhs.constData(), lhs.size(),
1036 rhs.constData(), rhs.size()) == 0;
1038 friend Qt::strong_ordering
1039 compareThreeWay(
const QString &lhs, QByteArrayView rhs)
noexcept
1041 const int res = QString::compare_helper(lhs.constData(), lhs.size(),
1042 rhs.constData(), rhs.size());
1043 return Qt::compareThreeWay(res, 0);
1045 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
1047 friend bool comparesEqual(
const QString &lhs,
const QByteArray &rhs)
noexcept
1048 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1049 friend Qt::strong_ordering
1050 compareThreeWay(
const QString &lhs,
const QByteArray &rhs)
noexcept
1052 return compareThreeWay(lhs, QByteArrayView(rhs));
1054 Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
1056 friend bool comparesEqual(
const QString &lhs,
const char *rhs)
noexcept
1057 {
return comparesEqual(lhs, QByteArrayView(rhs)); }
1058 friend Qt::strong_ordering
1059 compareThreeWay(
const QString &lhs,
const char *rhs)
noexcept
1061 return compareThreeWay(lhs, QByteArrayView(rhs));
1063 Q_DECLARE_STRONGLY_ORDERED(QString,
const char *, QT_ASCII_CAST_WARN)
1068 typedef QChar *iterator;
1069 typedef const QChar *const_iterator;
1070 typedef iterator Iterator;
1071 typedef const_iterator ConstIterator;
1072 typedef std::reverse_iterator<iterator> reverse_iterator;
1073 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
1074 inline iterator begin();
1075 inline const_iterator begin()
const;
1076 inline const_iterator cbegin()
const;
1077 inline const_iterator constBegin()
const;
1078 inline iterator end();
1079 inline const_iterator end()
const;
1080 inline const_iterator cend()
const;
1081 inline const_iterator constEnd()
const;
1082 reverse_iterator rbegin() {
return reverse_iterator(end()); }
1083 reverse_iterator rend() {
return reverse_iterator(begin()); }
1084 const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
1085 const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
1086 const_reverse_iterator crbegin()
const {
return const_reverse_iterator(end()); }
1087 const_reverse_iterator crend()
const {
return const_reverse_iterator(begin()); }
1090 typedef qsizetype size_type;
1091 typedef qptrdiff difference_type;
1092 typedef const QChar & const_reference;
1093 typedef QChar & reference;
1094 typedef QChar *pointer;
1095 typedef const QChar *const_pointer;
1096 typedef QChar value_type;
1097 inline void push_back(QChar c) { append(c); }
1098 inline void push_back(
const QString &s) { append(s); }
1099 inline void push_front(QChar c) { prepend(c); }
1100 inline void push_front(
const QString &s) { prepend(s); }
1101 void shrink_to_fit() { squeeze(); }
1102 iterator erase(const_iterator first, const_iterator last);
1103 inline iterator erase(const_iterator it) {
return erase(it, it + 1); }
1104 constexpr qsizetype max_size()
const noexcept
1109 static inline QString fromStdString(
const std::string &s);
1110 std::string toStdString()
const;
1111 static inline QString fromStdWString(
const std::wstring &s);
1112 inline std::wstring toStdWString()
const;
1114 static inline QString fromStdU16String(
const std::u16string &s);
1115 inline std::u16string toStdU16String()
const;
1116 static inline QString fromStdU32String(
const std::u32string &s);
1117 inline std::u32string toStdU32String()
const;
1119 Q_IMPLICIT
inline operator std::u16string_view()
const noexcept;
1121#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
1122 static QString fromCFString(CFStringRef string);
1123 CFStringRef toCFString()
const Q_DECL_CF_RETURNS_RETAINED;
1124 static QString fromNSString(
const NSString *string);
1125 NSString *toNSString()
const Q_DECL_NS_RETURNS_AUTORELEASED;
1128#if defined(Q_OS_WASM) || defined(Q_QDOC)
1129 static QString fromEcmaString(emscripten::val jsString);
1130 emscripten::val toEcmaString()
const;
1133 constexpr bool isNull()
const {
return d.isNull(); }
1135 bool isRightToLeft()
const;
1136 [[nodiscard]]
bool isValidUtf16()
const noexcept
1137 {
return QStringView(*
this).isValidUtf16(); }
1139 QString(qsizetype size, Qt::Initialization);
1140 explicit QString(DataPointer &&dd) : d(std::move(dd)) {}
1143#if defined(QT_NO_CAST_FROM_ASCII)
1144#define QSTRING_DECL_DELETED_ASCII_OP Q_DECL_EQ_DELETE_X("This function is not available under QT_NO_CAST_FROM_ASCII")
1145 QString &operator+=(
const char *s) QSTRING_DECL_DELETED_ASCII_OP;
1146 QString &operator+=(
const QByteArray &s) QSTRING_DECL_DELETED_ASCII_OP;
1147 QString(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1148 QString(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1149 QString &operator=(
const char *ch) QSTRING_DECL_DELETED_ASCII_OP;
1150 QString &operator=(
const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;
1151#undef QSTRING_DECL_DELETED_ASCII_OP
1155 static const char16_t _empty;
1157 void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
1158 void reallocGrowData(qsizetype n);
1160 QString &assign_helper(
const char32_t *data, qsizetype len);
1162 template <
typename InputIterator>
1163 void assign_helper_char8(InputIterator first, InputIterator last);
1164 static int compare_helper(
const QChar *data1, qsizetype length1,
1165 const QChar *data2, qsizetype length2,
1166 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1167 static int compare_helper(
const QChar *data1, qsizetype length1,
1168 const char *data2, qsizetype length2,
1169 Qt::CaseSensitivity cs = Qt::CaseSensitive)
noexcept;
1170 static int localeAwareCompare_helper(
const QChar *data1, qsizetype length1,
1171 const QChar *data2, qsizetype length2);
1172 static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);
1173 static QString toLower_helper(
const QString &str);
1174 static QString toLower_helper(QString &str);
1175 static QString toUpper_helper(
const QString &str);
1176 static QString toUpper_helper(QString &str);
1177 static QString toCaseFolded_helper(
const QString &str);
1178 static QString toCaseFolded_helper(QString &str);
1179 static QString trimmed_helper(
const QString &str);
1180 static QString trimmed_helper(QString &str);
1181 static QString simplified_helper(
const QString &str);
1182 static QString simplified_helper(QString &str);
1183 static QByteArray toLatin1_helper(
const QString &);
1184 static QByteArray toLatin1_helper_inplace(QString &);
1185 static QByteArray toUtf8_helper(
const QString &);
1186 static QByteArray toLocal8Bit_helper(
const QChar *data, qsizetype size);
1187#if QT_CORE_REMOVED_SINCE(6
, 6
)
1188 static qsizetype toUcs4_helper(
const ushort *uc, qsizetype length, uint *out);
1190 static qsizetype toUcs4_helper(
const char16_t *uc, qsizetype length,
char32_t *out);
1191 static qlonglong toIntegral_helper(QStringView string,
bool *ok,
int base);
1192 static qulonglong toIntegral_helper(QStringView string,
bool *ok, uint base);
1193 template <
typename Predicate>
1194 qsizetype removeIf_helper(Predicate pred)
1196 const qsizetype result = d->eraseIf(pred);
1198 d.data()[d.size] = u'\0';
1202 friend class QStringView;
1203 friend class QByteArray;
1204 friend struct QAbstractConcatenable;
1205 template <
typename T>
friend qsizetype erase(QString &s,
const T &t);
1206 template <
typename Predicate>
friend qsizetype erase_if(QString &s, Predicate pred);
1208 template <
typename T>
static
1209 T toIntegral_helper(QStringView string,
bool *ok,
int base)
1211 using Int64 =
typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
1212 using Int32 =
typename std::conditional<std::is_unsigned<T>::value, uint,
int>::type;
1215 Int64 val = toIntegral_helper(string, ok, Int32(base));
1216 if (T(val) != val) {
1224 Q_ALWAYS_INLINE
constexpr void verify([[maybe_unused]] qsizetype pos = 0,
1225 [[maybe_unused]] qsizetype n = 1)
const
1228 Q_ASSERT(pos <= d.size);
1230 Q_ASSERT(n <= d.size - pos);
1234 inline DataPointer &data_ptr() {
return d; }
1235 inline const DataPointer &data_ptr()
const {
return d; }