123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800 | // Copyright (C) 2020 The Qt Company Ltd.// Copyright (C) 2019 Intel Corporation.// Copyright (C) 2019 Mail.ru Group.// Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only// Qt-Security score:critical reason:data-parser#ifndef QSTRING_H#define QSTRING_H#if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII)#error QT_NO_CAST_FROM_ASCII and QT_RESTRICTED_CAST_FROM_ASCII must not be defined at the same time#endif#include <QtCore/qchar.h>#include <QtCore/qcompare.h>#include <QtCore/qbytearray.h>#include <QtCore/qbytearrayview.h>#include <QtCore/qarraydata.h>#include <QtCore/qlatin1stringview.h>#include <QtCore/qnamespace.h>#include <QtCore/qstringliteral.h>#include <QtCore/qstringalgorithms.h>#include <QtCore/qanystringview.h>#include <QtCore/qstringtokenizer.h>#include <string>#include <iterator>#include <QtCore/q20memory.h>#include <string_view>#include <stdarg.h>#ifdef truncate#error qstring.h must be included before any header file that defines truncate#endif#if defined(Q_OS_DARWIN) || defined(Q_QDOC)Q_FORWARD_DECLARE_CF_TYPE(CFString);Q_FORWARD_DECLARE_OBJC_CLASS(NSString);#endifclass tst_QString; QT_BEGIN_NAMESPACE class qfloat16;class QRegularExpression;class QRegularExpressionMatch;class QString;namespace QtPrivate {template<bool...B>class BoolList;template<typename Char>using IsCompatibleChar32TypeHelper =std::is_same<Char, char32_t>;template<typename Char>using IsCompatibleChar32Type = IsCompatibleChar32TypeHelper<q20::remove_cvref_t<Char>>;// hack to work around ushort/uchar etc being treated as both characters and// integers, depending on which Qt API you look at:template<typename T>struct treat_as_integral_arg :std::false_type {};template<>struct treat_as_integral_arg<unsigned short> :std::true_type {};template<>struct treat_as_integral_arg<signed short> :std::true_type {};template<>struct treat_as_integral_arg<unsigned char> :std::true_type {};template<>struct treat_as_integral_arg<signed char> :std::true_type {};// QTBUG-126054, keep until we can fix it for all platforms, not just Windows// (where wchar_t does convert to QAnyStringView):template<>struct treat_as_integral_arg<wchar_t> :std::true_type {};}// Qt 4.x compatibility//// QLatin1StringView inline implementations//constexprboolQtPrivate::isLatin1(QLatin1StringView) noexcept {return true; }//// QStringView members that require QLatin1StringView://intQStringView::compare(QLatin1StringView s,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, s, cs); }boolQStringView::startsWith(QLatin1StringView s,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::startsWith(*this, s, cs); }boolQStringView::endsWith(QLatin1StringView s,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::endsWith(*this, s, cs); } qsizetype QStringView::indexOf(QLatin1StringView s, qsizetype from,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::findString(*this, from, s, cs); }boolQStringView::contains(QLatin1StringView s,Qt::CaseSensitivity cs)const noexcept {returnindexOf(s,0, cs) !=qsizetype(-1); } qsizetype QStringView::lastIndexOf(QLatin1StringView s,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::lastIndexOf(*this,size(), s, cs); } qsizetype QStringView::lastIndexOf(QLatin1StringView s, qsizetype from,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::lastIndexOf(*this, from, s, cs); } qsizetype QStringView::count(QLatin1StringView s,Qt::CaseSensitivity cs)const{returnQtPrivate::count(*this, s, cs); }//// QAnyStringView members that require QLatin1StringView//constexpr QAnyStringView::QAnyStringView(QLatin1StringView str) noexcept : m_data{str.data()}, m_size{size_t(str.size() << SizeShift) |Tag::Latin1} {}constexpr QLatin1StringView QAnyStringView::asLatin1StringView()const{Q_ASSERT(isLatin1());return{m_data_utf8,size()};}template<typename Visitor>constexpr decltype(auto)QAnyStringView::visit(Visitor &&v)const{if(isUtf16())returnstd::forward<Visitor>(v)(asStringView());else if(isLatin1())returnstd::forward<Visitor>(v)(asLatin1StringView());elsereturnstd::forward<Visitor>(v)(asUtf8StringView());}//// QAnyStringView members that require QAnyStringView::visit()//constexpr QChar QAnyStringView::front()const{returnvisit([] (auto that) {returnQAnyStringView::toQChar(that.front()); });}constexpr QChar QAnyStringView::back()const{returnvisit([] (auto that) {returnQAnyStringView::toQChar(that.back()); });}class Q_CORE_EXPORT QString {typedef QTypedArrayData<char16_t> Data;friend class::tst_QString;template<typename Iterator>staticconstexprbool is_contiguous_iterator_v =// Can't use contiguous_iterator_tag here, as STL impls can't agree on feature macro.// To avoid differences in C++20 and C++17 builds, treat only pointers as contiguous// for now:// std::contiguous_iterator<Iterator>;std::is_pointer_v<Iterator>;template<typename Char>using is_compatible_char_helper =std::disjunction<QtPrivate::IsCompatibleCharType<Char>,QtPrivate::IsCompatibleChar32Type<Char>,QtPrivate::IsCompatibleChar8Type<Char>,std::is_same<Char, QLatin1Char>// special case>;template<typename T>using is_string_like =std::conjunction<std::negation<QtPrivate::treat_as_integral_arg<std::remove_cv_t<T>>>,// used to be integral, so keepstd::is_convertible<T, QAnyStringView>>;template<typename T>using if_string_like =std::enable_if_t<is_string_like<T>::value,bool>;template<typename T>using is_floating_point_like =std::disjunction<#if QFLOAT16_IS_NATIVEstd::is_same<q20::remove_cvref_t<T>,QtPrivate::NativeFloat16Type>,#endifstd::is_same<q20::remove_cvref_t<T>, qfloat16>,std::is_floating_point<T>>;template<typename T>using if_floating_point =std::enable_if_t<is_floating_point_like<T>::value,bool>;template<typename T>using if_integral_non_char =std::enable_if_t<std::conjunction_v<std::disjunction<// unlike is_integral, also covers unscoped enumsstd::is_convertible<T, qulonglong>,std::is_convertible<T, qlonglong>>,std::negation<is_floating_point_like<T>>,// has its own overloadstd::negation<is_string_like<T>>// ditto>,bool>;template<typename Iterator>staticconstexprbool is_compatible_iterator_v =std::conjunction_v<std::is_convertible< typename std::iterator_traits<Iterator>::iterator_category,std::input_iterator_tag >, is_compatible_char_helper<typename std::iterator_traits<Iterator>::value_type>>;template<typename Iterator>using if_compatible_iterator =std::enable_if_t<is_compatible_iterator_v<Iterator>,bool>;public:typedef QStringPrivate DataPointer;constexprQString() noexcept;explicitQString(const QChar *unicode, qsizetype size = -1);QString(QChar c);QString(qsizetype size, QChar c);inlineQString(QLatin1StringView latin1);explicitQString(QStringView sv) :QString(sv.data(), sv.size()) {}#if defined(__cpp_char8_t) || defined(Q_QDOC) Q_WEAK_OVERLOAD inlineQString(const char8_t *str):QString(fromUtf8(str)){}#endifinlineQString(const QString &) noexcept;inline~QString(); QString &operator=(QChar c); QString &operator=(const QString &) noexcept; QString &operator=(QLatin1StringView latin1);inlineQString(QString &&other) noexcept =default;QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QString)voidswap(QString &other) noexcept { d.swap(other.d); }staticconstexpr qsizetype maxSize() noexcept {// -1 to deal with the NUL terminatorreturnData::maxSize() -1;}constexpr qsizetype size()const noexcept {#if __has_cpp_attribute(assume)constexprsize_t MaxSize =maxSize();[[assume(size_t(d.size) <= MaxSize)]];#endifreturn d.size;}#if QT_DEPRECATED_SINCE(6, 4)QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")constexpr qsizetype count()const{returnsize(); }#endifconstexpr qsizetype length()const noexcept {returnsize(); }constexprboolisEmpty()const noexcept {returnsize() ==0; }voidresize(qsizetype size);voidresize(qsizetype size, QChar fillChar);voidresizeForOverwrite(qsizetype size); QString &fill(QChar c, qsizetype size = -1);voidtruncate(qsizetype pos);voidchop(qsizetype n); QString &slice(qsizetype pos){verify(pos,0);returnremove(0, pos); } QString &slice(qsizetype pos, qsizetype n){verify(pos, n);if(isNull())return*this;resize(pos + n);returnremove(0, pos);}inline qsizetype capacity()const;inlinevoidreserve(qsizetype size);inlinevoidsqueeze();inlineconst QChar *unicode()const;inline QChar *data();inlineconst QChar *data()const;inlineconst QChar *constData()const;inlinevoiddetach();inlineboolisDetached()const;inlineboolisSharedWith(const QString &other)const{return d.isSharedWith(other.d); }inlinevoidclear();inlineconst QChar at(qsizetype i)const;inlineconst QChar operator[](qsizetype i)const;[[nodiscard]]inline QChar &operator[](qsizetype i);[[nodiscard]]inline QChar front()const{returnat(0); }[[nodiscard]]inline QChar &front();[[nodiscard]]inline QChar back()const{returnat(size() -1); }[[nodiscard]]inline QChar &back();#if QT_CORE_REMOVED_SINCE(6, 9)[[nodiscard]] QString arg(qlonglong a,int fieldwidth=0,int base=10, QChar fillChar = u' ')const;[[nodiscard]] QString arg(qulonglong a,int fieldwidth=0,int base=10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(long a,int fieldwidth=0,int base=10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(ulong a,int fieldwidth=0,int base=10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(int a,int fieldWidth =0,int base =10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(uint a,int fieldWidth =0,int base =10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(short a,int fieldWidth =0,int base =10, QChar fillChar = u' ')const;[[nodiscard]]inline QString arg(ushort a,int fieldWidth =0,int base =10, QChar fillChar = u' ')const;[[nodiscard]] QString arg(double a,int fieldWidth =0,char format ='g',int precision = -1, QChar fillChar = u' ')const;[[nodiscard]] QString arg(char a,int fieldWidth =0, QChar fillChar = u' ')const;[[nodiscard]] QString arg(QChar a,int fieldWidth =0, QChar fillChar = u' ')const;[[nodiscard]] QString arg(const QString &a,int fieldWidth =0, QChar fillChar = u' ')const;[[nodiscard]] QString arg(QStringView a,int fieldWidth =0, QChar fillChar = u' ')const;[[nodiscard]] QString arg(QLatin1StringView a,int fieldWidth =0, QChar fillChar = u' ')const;#endiftemplate<typename T, if_integral_non_char<T> =true>[[nodiscard]] QString arg(T a,int fieldWidth =0,int base =10, QChar fillChar = u' ')const{using U = typename std::conditional<// underlying_type_t<non-enum> is UB in C++17/SFINAE in C++20, so wrap:std::is_enum_v<T>,std::underlying_type<T>,q20::type_identity<T>>::type::type;ifconstexpr(std::is_signed_v<U>)returnarg_impl(qlonglong(a), fieldWidth, base, fillChar);elsereturnarg_impl(qulonglong(a), fieldWidth, base, fillChar);}template<typename T, if_floating_point<T> =true>[[nodiscard]] QString arg(T a,int fieldWidth =0,char format ='g',int precision = -1, QChar fillChar = u' ')const{returnarg_impl(double(a), fieldWidth, format, precision, fillChar); }template<typename T, if_string_like<T> =true>[[nodiscard]] QString arg(const T &a,int fieldWidth =0, QChar fillChar = u' ')const{returnarg_impl(QAnyStringView(a), fieldWidth, fillChar); }private: QString arg_impl(qlonglong a,int fieldwidth,int base, QChar fillChar)const; QString arg_impl(qulonglong a,int fieldwidth,int base, QChar fillChar)const; QString arg_impl(double a,int fieldWidth,char format,int precision, QChar fillChar)const; QString arg_impl(QAnyStringView a,int fieldWidth, QChar fillChar)const;public:template<typename...Args>[[nodiscard]]#ifdef Q_QDOC QString #else typename std::enable_if<sizeof...(Args) >=2&&std::conjunction_v<is_string_like<Args>...>, QString >::type #endifarg(Args &&...args)const{returnqToStringViewIgnoringNull(*this).arg(std::forward<Args>(args)...); }static QString vasprintf(const char*format,va_list ap)Q_ATTRIBUTE_FORMAT_PRINTF(1,0);static QString asprintf(const char*format, ...)Q_ATTRIBUTE_FORMAT_PRINTF(1,2);[[nodiscard]]QT_CORE_INLINE_SINCE(6,8) qsizetype indexOf(QChar c, qsizetype from =0,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype indexOf(QLatin1StringView s, qsizetype from =0,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype indexOf(const QString &s, qsizetype from =0,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype indexOf(QStringView s, qsizetype from =0,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnQtPrivate::findString(*this, from, s, cs); }[[nodiscard]] qsizetype lastIndexOf(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnlastIndexOf(c, -1, cs); }[[nodiscard]]QT_CORE_INLINE_SINCE(6,8) qsizetype lastIndexOf(QChar c, qsizetype from,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const{returnlastIndexOf(s,size(), cs); }[[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype lastIndexOf(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const{returnlastIndexOf(s,size(), cs); }[[nodiscard]] qsizetype lastIndexOf(const QString &s, qsizetype from,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype lastIndexOf(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnlastIndexOf(s,size(), cs); }[[nodiscard]] qsizetype lastIndexOf(QStringView s, qsizetype from,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnQtPrivate::lastIndexOf(*this, from, s, cs); }[[nodiscard]]inlineboolcontains(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]]inlineboolcontains(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]]inlineboolcontains(QLatin1StringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]]inlineboolcontains(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept;[[nodiscard]] qsizetype count(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype count(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] qsizetype count(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;#if QT_CONFIG(regularexpression)[[nodiscard]] qsizetype indexOf(const QRegularExpression &re, qsizetype from =0, QRegularExpressionMatch *rmatch =nullptr)const;#ifdef Q_QDOC[[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, QRegularExpressionMatch *rmatch =nullptr)const;#else// prevent an ambiguity when called like this: lastIndexOf(re, 0)template<typename T = QRegularExpressionMatch,std::enable_if_t<std::is_same_v<T, QRegularExpressionMatch>,bool> =false>[[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, T *rmatch =nullptr)const{returnlastIndexOf(re,size(), rmatch); }#endif[[nodiscard]] qsizetype lastIndexOf(const QRegularExpression &re, qsizetype from, QRegularExpressionMatch *rmatch =nullptr)const;[[nodiscard]]boolcontains(const QRegularExpression &re, QRegularExpressionMatch *rmatch =nullptr)const;[[nodiscard]] qsizetype count(const QRegularExpression &re)const;#endifenum SectionFlag { SectionDefault =0x00, SectionSkipEmpty =0x01, SectionIncludeLeadingSep =0x02, SectionIncludeTrailingSep =0x04, SectionCaseInsensitiveSeps =0x08};Q_DECLARE_FLAGS(SectionFlags, SectionFlag)[[nodiscard]]inline QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)const;[[nodiscard]] QString section(const QString &in_sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)const;#if QT_CONFIG(regularexpression)[[nodiscard]] QString section(const QRegularExpression &re, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault)const;#endif#if QT_CORE_REMOVED_SINCE(6, 7) QString left(qsizetype n)const; QString right(qsizetype n)const; QString mid(qsizetype position, qsizetype n = -1)const; QString first(qsizetype n)const; QString last(qsizetype n)const; QString sliced(qsizetype pos)const; QString sliced(qsizetype pos, qsizetype n)const; QString chopped(qsizetype n)const;#else[[nodiscard]] QString left(qsizetype n)const&{if(size_t(n) >=size_t(size()))return*this;returnfirst(n);}[[nodiscard]] QString left(qsizetype n) &&{if(size_t(n) >=size_t(size()))returnstd::move(*this);returnstd::move(*this).first(n);}[[nodiscard]] QString right(qsizetype n)const&{if(size_t(n) >=size_t(size()))return*this;returnlast(n);}[[nodiscard]] QString right(qsizetype n) &&{if(size_t(n) >=size_t(size()))returnstd::move(*this);returnstd::move(*this).last(n);}[[nodiscard]] QString mid(qsizetype position, qsizetype n = -1)const&;[[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) &&;[[nodiscard]] QString first(qsizetype n)const&{verify(0, n);returnsliced(0, n); }[[nodiscard]] QString last(qsizetype n)const&{verify(0, n);returnsliced(size() - n, n); }[[nodiscard]] QString sliced(qsizetype pos)const&{verify(pos,0);returnsliced(pos,size() - pos); }[[nodiscard]] QString sliced(qsizetype pos, qsizetype n)const&{verify(pos, n);returnQString(begin() + pos, n); }[[nodiscard]] QString chopped(qsizetype n)const&{verify(0, n);returnsliced(0,size() - n); }[[nodiscard]] QString first(qsizetype n) &&{verify(0, n);resize(n);// may detach and allocate memoryreturnstd::move(*this);}[[nodiscard]] QString last(qsizetype n) &&{verify(0, n);returnsliced_helper(*this,size() - n, n); }[[nodiscard]] QString sliced(qsizetype pos) &&{verify(pos,0);returnsliced_helper(*this, pos,size() - pos); }[[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&{verify(pos, n);returnsliced_helper(*this, pos, n); }[[nodiscard]] QString chopped(qsizetype n) &&{verify(0, n);returnstd::move(*this).first(size() - n); }#endifboolstartsWith(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]]boolstartsWith(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnQtPrivate::startsWith(*this, s, cs); }boolstartsWith(QLatin1StringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;boolstartsWith(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;boolendsWith(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]]boolendsWith(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returnQtPrivate::endsWith(*this, s, cs); }boolendsWith(QLatin1StringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;boolendsWith(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;boolisUpper()const;boolisLower()const;[[nodiscard]] QString leftJustified(qsizetype width, QChar fill = u' ',bool trunc =false)const;[[nodiscard]] QString rightJustified(qsizetype width, QChar fill = u' ',bool trunc =false)const;#if !defined(Q_QDOC)[[nodiscard]] QString toLower()const&{returntoLower_helper(*this); }[[nodiscard]] QString toLower() &&{returntoLower_helper(*this); }[[nodiscard]] QString toUpper()const&{returntoUpper_helper(*this); }[[nodiscard]] QString toUpper() &&{returntoUpper_helper(*this); }[[nodiscard]] QString toCaseFolded()const&{returntoCaseFolded_helper(*this); }[[nodiscard]] QString toCaseFolded() &&{returntoCaseFolded_helper(*this); }[[nodiscard]] QString trimmed()const&{returntrimmed_helper(*this); }[[nodiscard]] QString trimmed() &&{returntrimmed_helper(*this); }[[nodiscard]] QString simplified()const&{returnsimplified_helper(*this); }[[nodiscard]] QString simplified() &&{returnsimplified_helper(*this); }#else[[nodiscard]] QString toLower()const;[[nodiscard]] QString toUpper()const;[[nodiscard]] QString toCaseFolded()const;[[nodiscard]] QString trimmed()const;[[nodiscard]] QString simplified()const;#endif[[nodiscard]] QString toHtmlEscaped()const; QString &insert(qsizetype i, QChar c); QString &insert(qsizetype i,const QChar *uc, qsizetype len);inline QString &insert(qsizetype i,const QString &s) {returninsert(i, s.constData(), s.size()); }inline QString &insert(qsizetype i, QStringView v) {returninsert(i, v.data(), v.size()); } QString &insert(qsizetype i, QLatin1StringView s); QString &insert(qsizetype i, QUtf8StringView s); QString &append(QChar c); QString &append(const QChar *uc, qsizetype len); QString &append(const QString &s);inline QString &append(QStringView v) {returnappend(v.data(), v.size()); } QString &append(QLatin1StringView s); QString &append(QUtf8StringView s);inline QString &prepend(QChar c) {returninsert(0, c); }inline QString &prepend(const QChar *uc, qsizetype len) {returninsert(0, uc, len); }inline QString &prepend(const QString &s) {returninsert(0, s); }inline QString &prepend(QStringView v) {returnprepend(v.data(), v.size()); }inline QString &prepend(QLatin1StringView s) {returninsert(0, s); } QString &prepend(QUtf8StringView s) {returninsert(0, s); } QString &assign(QAnyStringView s);inline QString &assign(qsizetype n, QChar c){Q_ASSERT(n >=0);returnfill(c, n);}template<typename InputIterator, if_compatible_iterator<InputIterator> =true> QString &assign(InputIterator first, InputIterator last){using V = typename std::iterator_traits<InputIterator>::value_type;constexprbool IsL1C =std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;constexprbool IsFwdIt =std::is_convertible_v< typename std::iterator_traits<InputIterator>::iterator_category,std::forward_iterator_tag >;ifconstexpr(is_contiguous_iterator_v<InputIterator>) {constauto p =q20::to_address(first);constauto len =qsizetype(last - first);ifconstexpr(IsL1C)returnassign(QLatin1StringView(reinterpret_cast<const char*>(p), len));else ifconstexpr(sizeof(V) ==4)returnassign_helper(p, len);elsereturnassign(QAnyStringView(p, len));}else ifconstexpr(sizeof(V) ==4) {// non-contiguous iterator, feed data piecemealresize(0);ifconstexpr(IsFwdIt) {const qsizetype requiredCapacity =2*std::distance(first, last);reserve(requiredCapacity);}while(first != last) {append(QChar::fromUcs4(*first));++first;}return*this;}else ifconstexpr(QtPrivate::IsCompatibleChar8Type<V>::value) {assign_helper_char8(first, last);if(d.constAllocatedCapacity()) d.data()[d.size] = u'\0';return*this;}else{ d.assign(first, last, [](QChar ch) -> char16_t {return ch.unicode(); });if(d.constAllocatedCapacity()) d.data()[d.size] = u'\0';return*this;}}inline QString &operator+=(QChar c) {returnappend(c); }inline QString &operator+=(const QString &s) {returnappend(s); }inline QString &operator+=(QStringView v) {returnappend(v); }inline QString &operator+=(QLatin1StringView s) {returnappend(s); } QString &operator+=(QUtf8StringView s) {returnappend(s); }#if defined(QT_RESTRICTED_CAST_FROM_ASCII)template<qsizetype N> QString &insert(qsizetype i,const char(&ch)[N]) {returninsert(i,QUtf8StringView(ch)); }template<qsizetype N> QString &append(const char(&ch)[N]) {returnappend(QUtf8StringView(ch)); }template<qsizetype N> QString &prepend(const char(&ch)[N]) {returnprepend(QUtf8StringView(ch)); }template<qsizetype N> QString &operator+=(const char(&ch)[N]) {returnappend(QUtf8StringView(ch)); }#endif QString &remove(qsizetype i, qsizetype len); QString &remove(QChar c,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &remove(QLatin1StringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &remove(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &removeAt(qsizetype pos){returnsize_t(pos) <size_t(size()) ?remove(pos,1) : *this; } QString &removeFirst() {return!isEmpty() ?remove(0,1) : *this; } QString &removeLast() {return!isEmpty() ?remove(size() -1,1) : *this; }template<typename Predicate> QString &removeIf(Predicate pred){removeIf_helper(pred);return*this;} QString &replace(qsizetype i, qsizetype len, QChar after); QString &replace(qsizetype i, qsizetype len,const QChar *s, qsizetype slen); QString &replace(qsizetype i, qsizetype len,const QString &after); QString &replace(QChar before, QChar after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(const QChar *before, qsizetype blen,const QChar *after, qsizetype alen,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(QLatin1StringView before, QLatin1StringView after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(QLatin1StringView before,const QString &after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(const QString &before, QLatin1StringView after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(const QString &before,const QString &after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(QChar c,const QString &after,Qt::CaseSensitivity cs =Qt::CaseSensitive); QString &replace(QChar c, QLatin1StringView after,Qt::CaseSensitivity cs =Qt::CaseSensitive);#if QT_CONFIG(regularexpression) QString &replace(const QRegularExpression &re,const QString &after);inline QString &remove(const QRegularExpression &re){returnreplace(re,QString()); }#endifpublic:[[nodiscard]] QStringList split(const QString &sep,Qt::SplitBehavior behavior =Qt::KeepEmptyParts,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;[[nodiscard]] QStringList split(QChar sep,Qt::SplitBehavior behavior =Qt::KeepEmptyParts,Qt::CaseSensitivity cs =Qt::CaseSensitive)const;#ifndef QT_NO_REGULAREXPRESSION[[nodiscard]] QStringList split(const QRegularExpression &sep,Qt::SplitBehavior behavior =Qt::KeepEmptyParts)const;#endiftemplate<typename Needle, typename...Flags>[[nodiscard]]inline autotokenize(Needle &&needle, Flags...flags)const&noexcept(noexcept(qTokenize(std::declval<const QString &>(),std::forward<Needle>(needle), flags...)))->decltype(qTokenize(*this,std::forward<Needle>(needle), flags...)){returnqTokenize(qToStringViewIgnoringNull(*this),std::forward<Needle>(needle), flags...); }template<typename Needle, typename...Flags>[[nodiscard]]inline autotokenize(Needle &&needle, Flags...flags)const&&noexcept(noexcept(qTokenize(std::declval<const QString>(),std::forward<Needle>(needle), flags...)))->decltype(qTokenize(std::move(*this),std::forward<Needle>(needle), flags...)){returnqTokenize(std::move(*this),std::forward<Needle>(needle), flags...); }template<typename Needle, typename...Flags>[[nodiscard]]inline autotokenize(Needle &&needle, Flags...flags) &&noexcept(noexcept(qTokenize(std::declval<QString>(),std::forward<Needle>(needle), flags...)))->decltype(qTokenize(std::move(*this),std::forward<Needle>(needle), flags...)){returnqTokenize(std::move(*this),std::forward<Needle>(needle), flags...); }enum NormalizationForm { NormalizationForm_D, NormalizationForm_C, NormalizationForm_KD, NormalizationForm_KC };[[nodiscard]] QString normalized(NormalizationForm mode,QChar::UnicodeVersion version =QChar::Unicode_Unassigned)const;[[nodiscard]] QString repeated(qsizetype times)const;const ushort *utf16()const;// ### Qt 7 char16_t[[nodiscard]] QString nullTerminated()const&{// ensure '\0'-termination for ::fromRawData stringsif(!d->isMutable())return QString{constData(),size()};return*this;}[[nodiscard]] QString nullTerminated() &&{// ensure '\0'-termination for ::fromRawData stringsif(!d->isMutable())return QString{constData(),size()};returnstd::move(*this);} QString &nullTerminate(){// ensure '\0'-termination for ::fromRawData stringsif(!d->isMutable())*this= QString{constData(),size()};return*this;}#if !defined(Q_QDOC)[[nodiscard]] QByteArray toLatin1()const&{returntoLatin1_helper(*this); }[[nodiscard]] QByteArray toLatin1() &&{returntoLatin1_helper_inplace(*this); }[[nodiscard]] QByteArray toUtf8()const&{returntoUtf8_helper(*this); }[[nodiscard]] QByteArray toUtf8() &&{returntoUtf8_helper(*this); }[[nodiscard]] QByteArray toLocal8Bit()const&{returntoLocal8Bit_helper(isNull() ?nullptr:constData(),size()); }[[nodiscard]] QByteArray toLocal8Bit() &&{returntoLocal8Bit_helper(isNull() ?nullptr:constData(),size()); }#else[[nodiscard]] QByteArray toLatin1()const;[[nodiscard]] QByteArray toUtf8()const;[[nodiscard]] QByteArray toLocal8Bit()const;#endif[[nodiscard]] QList<uint>toUcs4()const;// ### Qt 7 char32_t// note - this are all inline so we can benefit from strlen() compile time optimizationsstatic QString fromLatin1(QByteArrayView ba); Q_WEAK_OVERLOAD staticinline QString fromLatin1(const QByteArray &ba) {returnfromLatin1(QByteArrayView(ba)); }staticinline QString fromLatin1(const char*str, qsizetype size){returnfromLatin1(QByteArrayView(str, !str || size <0?qstrlen(str) : size));}static QString fromUtf8(QByteArrayView utf8); Q_WEAK_OVERLOAD staticinline QString fromUtf8(const QByteArray &ba) {returnfromUtf8(QByteArrayView(ba)); }staticinline QString fromUtf8(const char*utf8, qsizetype size){returnfromUtf8(QByteArrayView(utf8, !utf8 || size <0?qstrlen(utf8) : size));}#if defined(__cpp_char8_t) || defined(Q_QDOC) Q_WEAK_OVERLOAD staticinline QString fromUtf8(const char8_t *str){returnfromUtf8(reinterpret_cast<const char*>(str)); } Q_WEAK_OVERLOAD staticinline QString fromUtf8(const char8_t *str, qsizetype size){returnfromUtf8(reinterpret_cast<const char*>(str), size); }#endifstatic QString fromLocal8Bit(QByteArrayView ba); Q_WEAK_OVERLOAD staticinline QString fromLocal8Bit(const QByteArray &ba) {returnfromLocal8Bit(QByteArrayView(ba)); }staticinline QString fromLocal8Bit(const char*str, qsizetype size){returnfromLocal8Bit(QByteArrayView(str, !str || size <0?qstrlen(str) : size));}static QString fromUtf16(const char16_t *, qsizetype size = -1);static QString fromUcs4(const char32_t *, qsizetype size = -1);static QString fromRawData(const char16_t *unicode, qsizetype size){returnQString(DataPointer::fromRawData(unicode, size));}QT_CORE_INLINE_SINCE(6,10)static QString fromRawData(const QChar *, qsizetype size);#if QT_DEPRECATED_SINCE(6, 0)QT_DEPRECATED_VERSION_X_6_0("Use char16_t* overload.")static QString fromUtf16(const ushort *str, qsizetype size = -1){returnfromUtf16(reinterpret_cast<const char16_t *>(str), size); }QT_DEPRECATED_VERSION_X_6_0("Use char32_t* overload.")static QString fromUcs4(const uint *str, qsizetype size = -1){returnfromUcs4(reinterpret_cast<const char32_t *>(str), size); }#endifinline qsizetype toWCharArray(wchar_t*array)const;[[nodiscard]]staticinline QString fromWCharArray(const wchar_t*string, qsizetype size = -1); QString &setRawData(const QChar *unicode, qsizetype size); QString &setUnicode(const QChar *unicode, qsizetype size); Q_WEAK_OVERLOAD QString &setUnicode(const char16_t *utf16, qsizetype size){returnsetUnicode(reinterpret_cast<const QChar *>(utf16), size); } QString &setUtf16(const char16_t *utf16, qsizetype size){returnsetUnicode(reinterpret_cast<const QChar *>(utf16), size); }#if !QT_CORE_REMOVED_SINCE(6, 9) Q_WEAK_OVERLOAD #endif QString &setUtf16(const ushort *autf16, qsizetype asize){returnsetUnicode(reinterpret_cast<const QChar *>(autf16), asize); }intcompare(const QString &s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept;intcompare(QLatin1StringView other,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept;inlineintcompare(QStringView s,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept;intcompare(QChar ch,Qt::CaseSensitivity cs =Qt::CaseSensitive)const noexcept {returncompare(QStringView{&ch,1}, cs); }staticinlineintcompare(const QString &s1,const QString &s2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept {return s1.compare(s2, cs); }staticinlineintcompare(const QString &s1, QLatin1StringView s2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept {return s1.compare(s2, cs); }staticinlineintcompare(QLatin1StringView s1,const QString &s2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept {return-s2.compare(s1, cs); }static intcompare(const QString &s1, QStringView s2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept {return s1.compare(s2, cs); }static intcompare(QStringView s1,const QString &s2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept {return-s2.compare(s1, cs); }intlocaleAwareCompare(const QString& s)const;inlineintlocaleAwareCompare(QStringView s)const;static intlocaleAwareCompare(const QString& s1,const QString& s2){return s1.localeAwareCompare(s2); }staticinlineintlocaleAwareCompare(QStringView s1, QStringView s2);shorttoShort(bool*ok=nullptr,int base=10)const{return toIntegral_helper<short>(*this, ok, base); } ushort toUShort(bool*ok=nullptr,int base=10)const{return toIntegral_helper<ushort>(*this, ok, base); }inttoInt(bool*ok=nullptr,int base=10)const{return toIntegral_helper<int>(*this, ok, base); } uint toUInt(bool*ok=nullptr,int base=10)const{return toIntegral_helper<uint>(*this, ok, base); }longtoLong(bool*ok=nullptr,int base=10)const{return toIntegral_helper<long>(*this, ok, base); } ulong toULong(bool*ok=nullptr,int base=10)const{return toIntegral_helper<ulong>(*this, ok, base); }QT_CORE_INLINE_SINCE(6,5) qlonglong toLongLong(bool*ok=nullptr,int base=10)const;QT_CORE_INLINE_SINCE(6,5) qulonglong toULongLong(bool*ok=nullptr,int base=10)const;floattoFloat(bool*ok=nullptr)const;doubletoDouble(bool*ok=nullptr)const;inline QString &setNum(short,int base=10);inline QString &setNum(ushort,int base=10);inline QString &setNum(int,int base=10);inline QString &setNum(uint,int base=10);inline QString &setNum(long,int base=10);inline QString &setNum(ulong,int base=10); QString &setNum(qlonglong,int base=10); QString &setNum(qulonglong,int base=10);inline QString &setNum(float,char format='g',int precision=6); QString &setNum(double,char format='g',int precision=6);static QString number(int,int base=10);static QString number(uint,int base=10);static QString number(long,int base=10);static QString number(ulong,int base=10);static QString number(qlonglong,int base=10);static QString number(qulonglong,int base=10);static QString number(double,char format='g',int precision=6);friendboolcomparesEqual(const QString &s1,const QString &s2) noexcept {returncomparesEqual(QStringView(s1),QStringView(s2)); }friend Qt::strong_ordering compareThreeWay(const QString &s1,const QString &s2) noexcept {returncompareThreeWay(QStringView(s1),QStringView(s2)); }Q_DECLARE_STRONGLY_ORDERED(QString) Q_WEAK_OVERLOAD friendboolcomparesEqual(const QString &s1, QUtf8StringView s2) noexcept {returnQtPrivate::equalStrings(s1, s2); } Q_WEAK_OVERLOAD friend Qt::strong_ordering compareThreeWay(const QString &s1, QUtf8StringView s2) noexcept {const int res =QtPrivate::compareStrings(s1, s2,Qt::CaseSensitive);returnQt::compareThreeWay(res,0);}Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)#ifdef __cpp_char8_tfriendboolcomparesEqual(const QString &s1,const char8_t *s2) noexcept {returncomparesEqual(s1,QUtf8StringView(s2)); }friend Qt::strong_ordering compareThreeWay(const QString &s1,const char8_t *s2) noexcept {returncompareThreeWay(s1,QUtf8StringView(s2)); }Q_DECLARE_STRONGLY_ORDERED(QString,const char8_t *)#endif// __cpp_char8_tfriendboolcomparesEqual(const QString &s1, QLatin1StringView s2) noexcept {return(s1.size() == s2.size()) &&QtPrivate::equalStrings(s1, s2); }friend Qt::strong_ordering compareThreeWay(const QString &s1, QLatin1StringView s2) noexcept {const int res =QtPrivate::compareStrings(s1, s2,Qt::CaseSensitive);returnQt::compareThreeWay(res,0);}Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)// Check isEmpty() instead of isNull() for backwards compatibility.friendboolcomparesEqual(const QString &s1,std::nullptr_t) noexcept {return s1.isEmpty(); }friend Qt::strong_ordering compareThreeWay(const QString &s1,std::nullptr_t) noexcept {return s1.isEmpty() ?Qt::strong_ordering::equivalent :Qt::strong_ordering::greater; }Q_DECLARE_STRONGLY_ORDERED(QString,std::nullptr_t)friendboolcomparesEqual(const QString &s1,const char16_t *s2) noexcept {returncomparesEqual(s1,QStringView(s2)); }friend Qt::strong_ordering compareThreeWay(const QString &s1,const char16_t *s2) noexcept {returncompareThreeWay(s1,QStringView(s2)); }Q_DECLARE_STRONGLY_ORDERED(QString,const char16_t *)// QChar <> QStringfriendboolcomparesEqual(const QString &lhs, QChar rhs) noexcept {return lhs.size() ==1&& rhs == lhs.front(); }friend Qt::strong_ordering compareThreeWay(const QString &lhs, QChar rhs) noexcept {const int res =compare_helper(lhs.data(), lhs.size(), &rhs,1);returnQt::compareThreeWay(res,0);}Q_DECLARE_STRONGLY_ORDERED(QString, QChar)// ASCII compatibility#if defined(QT_RESTRICTED_CAST_FROM_ASCII)template<qsizetype N>inlineQString(const char(&ch)[N]):QString(fromUtf8(ch)){}template<qsizetype N>QString(char(&)[N]) =delete;template<qsizetype N>inline QString &operator=(const char(&ch)[N]){return(*this=fromUtf8(ch, N -1)); }template<qsizetype N> QString &operator=(char(&)[N]) =delete;#endif#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII) QT_ASCII_CAST_WARN inlineQString(const char*ch):QString(fromUtf8(ch)){} QT_ASCII_CAST_WARN inlineQString(const QByteArray &a):QString(fromUtf8(a)){} QT_ASCII_CAST_WARN inline QString &operator=(const char*ch){if(!ch) {clear();return*this;}returnassign(ch);} QT_ASCII_CAST_WARN inline QString &operator=(const QByteArray &a){if(a.isNull()) {clear();return*this;}returnassign(a);}// these are needed, so it compiles with STL support enabled QT_ASCII_CAST_WARN inline QString &prepend(const char*s){returnprepend(QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &prepend(const QByteArray &s){returnprepend(QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &append(const char*s){returnappend(QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &append(const QByteArray &s){returnappend(QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &insert(qsizetype i,const char*s){returninsert(i,QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &insert(qsizetype i,const QByteArray &s){returninsert(i,QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &operator+=(const char*s){returnappend(QUtf8StringView(s)); } QT_ASCII_CAST_WARN inline QString &operator+=(const QByteArray &s){returnappend(QUtf8StringView(s)); }#if QT_CORE_REMOVED_SINCE(6, 8) QT_ASCII_CAST_WARN inlinebooloperator==(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator!=(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator<(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator<=(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator>(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator>=(const char*s)const; QT_ASCII_CAST_WARN inlinebooloperator==(const QByteArray &s)const; QT_ASCII_CAST_WARN inlinebooloperator!=(const QByteArray &s)const; QT_ASCII_CAST_WARN inlinebooloperator<(const QByteArray &s)const; QT_ASCII_CAST_WARN inlinebooloperator>(const QByteArray &s)const; QT_ASCII_CAST_WARN inlinebooloperator<=(const QByteArray &s)const; QT_ASCII_CAST_WARN inlinebooloperator>=(const QByteArray &s)const;#elsefriendboolcomparesEqual(const QString &lhs, QByteArrayView rhs) noexcept {returnQString::compare_helper(lhs.constData(), lhs.size(), rhs.constData(), rhs.size()) ==0;}friend Qt::strong_ordering compareThreeWay(const QString &lhs, QByteArrayView rhs) noexcept {const int res =QString::compare_helper(lhs.constData(), lhs.size(), rhs.constData(), rhs.size());returnQt::compareThreeWay(res,0);}Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)friendboolcomparesEqual(const QString &lhs,const QByteArray &rhs) noexcept {returncomparesEqual(lhs,QByteArrayView(rhs)); }friend Qt::strong_ordering compareThreeWay(const QString &lhs,const QByteArray &rhs) noexcept {returncompareThreeWay(lhs,QByteArrayView(rhs));}Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)friendboolcomparesEqual(const QString &lhs,const char*rhs) noexcept {returncomparesEqual(lhs,QByteArrayView(rhs)); }friend Qt::strong_ordering compareThreeWay(const QString &lhs,const char*rhs) noexcept {returncompareThreeWay(lhs,QByteArrayView(rhs));}Q_DECLARE_STRONGLY_ORDERED(QString,const char*, QT_ASCII_CAST_WARN)#endif// QT_CORE_REMOVED_SINCE(6, 8)#endif// !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)typedef QChar *iterator;typedefconst QChar *const_iterator;typedef iterator Iterator;typedef const_iterator ConstIterator;typedef std::reverse_iterator<iterator> reverse_iterator;typedef std::reverse_iterator<const_iterator> const_reverse_iterator;inline iterator begin();inline const_iterator begin()const;inline const_iterator cbegin()const;inline const_iterator constBegin()const;inline iterator end();inline const_iterator end()const;inline const_iterator cend()const;inline const_iterator constEnd()const; reverse_iterator rbegin() {returnreverse_iterator(end()); } reverse_iterator rend() {returnreverse_iterator(begin()); } const_reverse_iterator rbegin()const{returnconst_reverse_iterator(end()); } const_reverse_iterator rend()const{returnconst_reverse_iterator(begin()); } const_reverse_iterator crbegin()const{returnconst_reverse_iterator(end()); } const_reverse_iterator crend()const{returnconst_reverse_iterator(begin()); }// STL compatibilitytypedef qsizetype size_type;typedef qptrdiff difference_type;typedefconst QChar & const_reference;typedef QChar & reference;typedef QChar *pointer;typedefconst QChar *const_pointer;typedef QChar value_type;inlinevoidpush_back(QChar c) {append(c); }inlinevoidpush_back(const QString &s) {append(s); }inlinevoidpush_front(QChar c) {prepend(c); }inlinevoidpush_front(const QString &s) {prepend(s); }voidshrink_to_fit() {squeeze(); } iterator erase(const_iterator first, const_iterator last);inline iterator erase(const_iterator it) {returnerase(it, it +1); }constexpr qsizetype max_size()const noexcept {returnmaxSize();}staticinline QString fromStdString(conststd::string &s);std::string toStdString()const;staticinline QString fromStdWString(conststd::wstring &s);inline std::wstring toStdWString()const;staticinline QString fromStdU16String(conststd::u16string &s);inline std::u16string toStdU16String()const;staticinline QString fromStdU32String(conststd::u32string &s);inline std::u32string toStdU32String()const; Q_IMPLICIT inline operator std::u16string_view()const noexcept;#if defined(Q_OS_DARWIN) || defined(Q_QDOC)static QString fromCFString(CFStringRef string); CFStringRef toCFString()const Q_DECL_CF_RETURNS_RETAINED;static QString fromNSString(const NSString *string); NSString *toNSString()const Q_DECL_NS_RETURNS_AUTORELEASED;#endif#if defined(Q_OS_WASM) || defined(Q_QDOC)static QString fromEcmaString(emscripten::val jsString);emscripten::val toEcmaString()const;#endifconstexprboolisNull()const{return d.isNull(); }boolisRightToLeft()const;[[nodiscard]]boolisValidUtf16()const noexcept {returnQStringView(*this).isValidUtf16(); }QString(qsizetype size,Qt::Initialization);explicitQString(DataPointer &&dd) :d(std::move(dd)) {}private:#if defined(QT_NO_CAST_FROM_ASCII)#define QSTRING_DECL_DELETED_ASCII_OP Q_DECL_EQ_DELETE_X("This function is not available under QT_NO_CAST_FROM_ASCII") QString &operator+=(const char*s) QSTRING_DECL_DELETED_ASCII_OP; QString &operator+=(const QByteArray &s) QSTRING_DECL_DELETED_ASCII_OP;QString(const char*ch) QSTRING_DECL_DELETED_ASCII_OP;QString(const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP; QString &operator=(const char*ch) QSTRING_DECL_DELETED_ASCII_OP; QString &operator=(const QByteArray &a) QSTRING_DECL_DELETED_ASCII_OP;#undef QSTRING_DECL_DELETED_ASCII_OP#endif DataPointer d;static const char16_t _empty;voidreallocData(qsizetype alloc,QArrayData::AllocationOption option);voidreallocGrowData(qsizetype n);// ### remove once QAnyStringView supports UTF-32: QString &assign_helper(const char32_t *data, qsizetype len);// Defined in qstringconverter.htemplate<typename InputIterator>voidassign_helper_char8(InputIterator first, InputIterator last);static intcompare_helper(const QChar *data1, qsizetype length1,const QChar *data2, qsizetype length2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;static intcompare_helper(const QChar *data1, qsizetype length1,const char*data2, qsizetype length2,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;static intlocaleAwareCompare_helper(const QChar *data1, qsizetype length1,const QChar *data2, qsizetype length2);static QString sliced_helper(QString &str, qsizetype pos, qsizetype n);static QString toLower_helper(const QString &str);static QString toLower_helper(QString &str);static QString toUpper_helper(const QString &str);static QString toUpper_helper(QString &str);static QString toCaseFolded_helper(const QString &str);static QString toCaseFolded_helper(QString &str);static QString trimmed_helper(const QString &str);static QString trimmed_helper(QString &str);static QString simplified_helper(const QString &str);static QString simplified_helper(QString &str);static QByteArray toLatin1_helper(const QString &);static QByteArray toLatin1_helper_inplace(QString &);static QByteArray toUtf8_helper(const QString &);static QByteArray toLocal8Bit_helper(const QChar *data, qsizetype size);#if QT_CORE_REMOVED_SINCE(6, 6)static qsizetype toUcs4_helper(const ushort *uc, qsizetype length, uint *out);#endifstatic qsizetype toUcs4_helper(const char16_t *uc, qsizetype length, char32_t *out);static qlonglong toIntegral_helper(QStringView string,bool*ok,int base);static qulonglong toIntegral_helper(QStringView string,bool*ok, uint base);template<typename Predicate> qsizetype removeIf_helper(Predicate pred){const qsizetype result = d->eraseIf(pred);if(result >0) d.data()[d.size] = u'\0';return result;}friend class QStringView;friend class QByteArray;friendstruct QAbstractConcatenable;template<typename T>friend qsizetype erase(QString &s,const T &t);template<typename Predicate>friend qsizetype erase_if(QString &s, Predicate pred);template<typename T>static T toIntegral_helper(QStringView string,bool*ok,int base){using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;using Int32 = typename std::conditional<std::is_unsigned<T>::value, uint,int>::type;// we select the right overload by casting base to int or uint Int64 val =toIntegral_helper(string, ok,Int32(base));if(T(val) != val) {if(ok)*ok =false; val =0;}returnT(val);} Q_ALWAYS_INLINE constexprvoidverify([[maybe_unused]] qsizetype pos =0,[[maybe_unused]] qsizetype n =1)const{Q_ASSERT(pos >=0);Q_ASSERT(pos <= d.size);Q_ASSERT(n >=0);Q_ASSERT(n <= d.size - pos);}public:inline DataPointer &data_ptr() {return d; }inlineconst DataPointer &data_ptr()const{return d; }};//// QLatin1StringView inline members that require QUtf8StringView://intQLatin1StringView::compare(QUtf8StringView other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, other, cs); }//// QLatin1StringView inline members that require QString:// QString QLatin1StringView::toString()const{return*this; }//// QStringView inline members that require QUtf8StringView://intQStringView::compare(QUtf8StringView other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, other, cs); }//// QStringView inline members that require QString:// QString QStringView::toString()const{returnQString(*this); } qint64 QStringView::toLongLong(bool*ok,int base)const{returnQString::toIntegral_helper<qint64>(*this, ok, base); } quint64 QStringView::toULongLong(bool*ok,int base)const{returnQString::toIntegral_helper<quint64>(*this, ok, base); }longQStringView::toLong(bool*ok,int base)const{returnQString::toIntegral_helper<long>(*this, ok, base); } ulong QStringView::toULong(bool*ok,int base)const{returnQString::toIntegral_helper<ulong>(*this, ok, base); }intQStringView::toInt(bool*ok,int base)const{returnQString::toIntegral_helper<int>(*this, ok, base); } uint QStringView::toUInt(bool*ok,int base)const{returnQString::toIntegral_helper<uint>(*this, ok, base); }shortQStringView::toShort(bool*ok,int base)const{returnQString::toIntegral_helper<short>(*this, ok, base); } ushort QStringView::toUShort(bool*ok,int base)const{returnQString::toIntegral_helper<ushort>(*this, ok, base); }//// QUtf8StringView inline members that require QStringView://template<bool UseChar8T>int QBasicUtf8StringView<UseChar8T>::compare(QChar other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this,QStringView(&other,1), cs);}template<bool UseChar8T>int QBasicUtf8StringView<UseChar8T>::compare(QStringView other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, other, cs);}template<bool UseChar8T>[[nodiscard]]bool QBasicUtf8StringView<UseChar8T>::equal(QChar other)const noexcept {returnQtPrivate::equalStrings(*this,QStringView(&other,1));}template<bool UseChar8T>[[nodiscard]]bool QBasicUtf8StringView<UseChar8T>::equal(QStringView other)const noexcept {returnQtPrivate::equalStrings(*this, other);}//// QUtf8StringView inline members that require QString, QL1SV or QBA://template<bool UseChar8T> QString QBasicUtf8StringView<UseChar8T>::toString()const{returnQString::fromUtf8(data(),size());}template<bool UseChar8T>[[nodiscard]]int QBasicUtf8StringView<UseChar8T>::compare(QLatin1StringView other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, other, cs);}template<bool UseChar8T>[[nodiscard]]int QBasicUtf8StringView<UseChar8T>::compare(const QByteArray &other,Qt::CaseSensitivity cs)const noexcept {returnQtPrivate::compareStrings(*this, QBasicUtf8StringView<UseChar8T>(other.data(), other.size()), cs);}template<bool UseChar8T>[[nodiscard]]bool QBasicUtf8StringView<UseChar8T>::equal(QLatin1StringView other)const noexcept {returnQtPrivate::equalStrings(*this, other);}template<bool UseChar8T>[[nodiscard]]bool QBasicUtf8StringView<UseChar8T>::equal(const QByteArray &other)const noexcept {returnsize() == other.size()&&QtPrivate::equalStrings(*this, QBasicUtf8StringView<UseChar8T>(other.data(), other.size()));}//// QAnyStringView inline members that require QString://QAnyStringView::QAnyStringView(const QByteArray &str) noexcept : QAnyStringView{str.begin(), str.size()} {}QAnyStringView::QAnyStringView(const QString &str) noexcept : QAnyStringView{str.begin(), str.size()} {} QString QAnyStringView::toString()const{returnQtPrivate::convertToQString(*this); }//// QString inline members//QString::QString(QLatin1StringView latin1): QString{QString::fromLatin1(latin1.data(), latin1.size())} {}const QChar QString::at(qsizetype i)const{verify(i,1);returnQChar(d.data()[i]); }const QChar QString::operator[](qsizetype i)const{verify(i,1);returnQChar(d.data()[i]); }const QChar *QString::unicode()const{returndata(); }const QChar *QString::data()const{#if QT5_NULL_STRINGS == 1return reinterpret_cast<const QChar *>(d.data() ? d.data() : &_empty);#elsereturn reinterpret_cast<const QChar *>(d.data());#endif} QChar *QString::data(){detach();Q_ASSERT(d.data());return reinterpret_cast<QChar *>(d.data());}const QChar *QString::constData()const{returndata(); }voidQString::detach(){if(d.needsDetach())reallocData(d.size,QArrayData::KeepSize); }boolQString::isDetached()const{return!d.isShared(); }voidQString::clear(){if(!isNull()) *this=QString(); }QString::QString(const QString &other) noexcept :d(other.d){ } qsizetype QString::capacity()const{returnqsizetype(d.constAllocatedCapacity()); } QString &QString::setNum(short n,int base){returnsetNum(qlonglong(n), base); } QString &QString::setNum(ushort n,int base){returnsetNum(qulonglong(n), base); } QString &QString::setNum(int n,int base){returnsetNum(qlonglong(n), base); } QString &QString::setNum(uint n,int base){returnsetNum(qulonglong(n), base); } QString &QString::setNum(long n,int base){returnsetNum(qlonglong(n), base); } QString &QString::setNum(ulong n,int base){returnsetNum(qulonglong(n), base); } QString &QString::setNum(float n,char f,int prec){returnsetNum(double(n),f,prec); }#if QT_CORE_REMOVED_SINCE(6, 9) QString QString::arg(int a,int fieldWidth,int base, QChar fillChar)const{returnarg(qlonglong(a), fieldWidth, base, fillChar); } QString QString::arg(uint a,int fieldWidth,int base, QChar fillChar)const{returnarg(qulonglong(a), fieldWidth, base, fillChar); } QString QString::arg(long a,int fieldWidth,int base, QChar fillChar)const{returnarg(qlonglong(a), fieldWidth, base, fillChar); } QString QString::arg(ulong a,int fieldWidth,int base, QChar fillChar)const{returnarg(qulonglong(a), fieldWidth, base, fillChar); } QString QString::arg(short a,int fieldWidth,int base, QChar fillChar)const{returnarg(qlonglong(a), fieldWidth, base, fillChar); } QString QString::arg(ushort a,int fieldWidth,int base, QChar fillChar)const{returnarg(qulonglong(a), fieldWidth, base, fillChar); }#endif// QT_CORE_REMOVED_SINCE QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags)const{returnsection(QString(asep), astart, aend, aflags); } QT_WARNING_PUSH QT_WARNING_DISABLE_MSVC(4127)// "conditional expression is constant"QT_WARNING_DISABLE_INTEL(111)// "statement is unreachable" qsizetype QString::toWCharArray(wchar_t*array)const{returnqToStringViewIgnoringNull(*this).toWCharArray(array);} qsizetype QStringView::toWCharArray(wchar_t*array)const{if(sizeof(wchar_t) ==sizeof(QChar)) {if(auto src =data())memcpy(array, src,sizeof(QChar) *size());returnsize();}else{returnQString::toUcs4_helper(utf16(),size(),reinterpret_cast<char32_t *>(array));}} QT_WARNING_POP QString QString::fromWCharArray(const wchar_t*string, qsizetype size){ifconstexpr(sizeof(wchar_t) ==sizeof(QChar)) {returnQString(reinterpret_cast<const QChar *>(string), size);}else{#ifdef QT_BOOTSTRAPPEDQ_UNREACHABLE_RETURN(QString());#elsereturnfromUcs4(reinterpret_cast<const char32_t *>(string), size);#endif}}constexpr QString::QString() noexcept {}QString::~QString() {}voidQString::reserve(qsizetype asize){if(d.needsDetach() || asize >=capacity() - d.freeSpaceAtBegin())reallocData(qMax(asize,size()),QArrayData::KeepSize);if(d.constAllocatedCapacity()) d.setFlag(Data::CapacityReserved);}voidQString::squeeze(){if(!d.isMutable())return;if(d.needsDetach() ||size() <capacity())reallocData(d.size,QArrayData::KeepSize);if(d.constAllocatedCapacity()) d.clearFlag(Data::CapacityReserved);} QChar &QString::operator[](qsizetype i){verify(i,1);returndata()[i]; } QChar &QString::front() {returnoperator[](0); } QChar &QString::back() {returnoperator[](size() -1); }QString::iterator QString::begin(){detach();return reinterpret_cast<QChar*>(d.data()); }QString::const_iterator QString::begin()const{return reinterpret_cast<const QChar*>(d.data()); }QString::const_iterator QString::cbegin()const{return reinterpret_cast<const QChar*>(d.data()); }QString::const_iterator QString::constBegin()const{return reinterpret_cast<const QChar*>(d.data()); }QString::iterator QString::end(){detach();return reinterpret_cast<QChar*>(d.data() + d.size); }QString::const_iterator QString::end()const{return reinterpret_cast<const QChar*>(d.data() + d.size); }QString::const_iterator QString::cend()const{return reinterpret_cast<const QChar*>(d.data() + d.size); }QString::const_iterator QString::constEnd()const{return reinterpret_cast<const QChar*>(d.data() + d.size); }boolQString::contains(const QString &s,Qt::CaseSensitivity cs)const{returnindexOf(s,0, cs) != -1; }boolQString::contains(QLatin1StringView s,Qt::CaseSensitivity cs)const{returnindexOf(s,0, cs) != -1; }boolQString::contains(QChar c,Qt::CaseSensitivity cs)const{returnindexOf(c,0, cs) != -1; }boolQString::contains(QStringView s,Qt::CaseSensitivity cs)const noexcept {returnindexOf(s,0, cs) != -1; }#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)#if QT_CORE_REMOVED_SINCE(6, 8)boolQString::operator==(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) ==0; }boolQString::operator!=(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) !=0; }boolQString::operator<(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) <0; }boolQString::operator>(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) >0; }boolQString::operator<=(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) <=0; }boolQString::operator>=(const char*s)const{returnQString::compare_helper(constData(),size(), s, -1) >=0; } QT_ASCII_CAST_WARN boolQString::operator==(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) ==0; } QT_ASCII_CAST_WARN boolQString::operator!=(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) !=0; } QT_ASCII_CAST_WARN boolQString::operator<(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) <0; } QT_ASCII_CAST_WARN boolQString::operator>(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) >0; } QT_ASCII_CAST_WARN boolQString::operator<=(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) <=0; } QT_ASCII_CAST_WARN boolQString::operator>=(const QByteArray &s)const{returnQString::compare_helper(constData(),size(), s.constData(), s.size()) >=0; }boolQByteArray::operator==(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) ==0; }boolQByteArray::operator!=(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) !=0; }boolQByteArray::operator<(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) >0; }boolQByteArray::operator>(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) <0; }boolQByteArray::operator<=(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) >=0; }boolQByteArray::operator>=(const QString &s)const{returnQString::compare_helper(s.constData(), s.size(),constData(),size()) <=0; }#endif// QT_CORE_REMOVED_SINCE(6, 8)#endif// !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)// QString + QStringinline QString operator+(const QString &s1,const QString &s2){ QString t(s1); t += s2;return t; }inline QString operator+(QString &&lhs,const QString &rhs){returnstd::move(lhs += rhs); }inline QString operator+(const QString &s1, QChar s2){ QString t(s1); t += s2;return t; }inline QString operator+(QString &&lhs, QChar rhs){returnstd::move(lhs += rhs); }inline QString operator+(QChar s1,const QString &s2){ QString t(s1); t += s2;return t; }inline QString operator+(const QString &lhs, QStringView rhs){ QString ret{lhs.size() + rhs.size(),Qt::Uninitialized};return ret.assign(lhs).append(rhs);}inline QString operator+(QStringView lhs,const QString &rhs){ QString ret{lhs.size() + rhs.size(),Qt::Uninitialized};return ret.assign(lhs).append(rhs);}# if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII) QT_ASCII_CAST_WARN inline QString operator+(const QString &s1,const char*s2){ QString t(s1); t +=QUtf8StringView(s2);return t; } QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs,const char*rhs){QT_IGNORE_DEPRECATIONS(returnstd::move(lhs += rhs);) } QT_ASCII_CAST_WARN inline QString operator+(const char*s1,const QString &s2){ QString t =QString::fromUtf8(s1); t += s2;return t; } QT_ASCII_CAST_WARN inline QString operator+(const QByteArray &ba,const QString &s){ QString t =QString::fromUtf8(ba); t += s;return t; } QT_ASCII_CAST_WARN inline QString operator+(const QString &s,const QByteArray &ba){ QString t(s); t +=QUtf8StringView(ba);return t; } QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs,const QByteArray &rhs){QT_IGNORE_DEPRECATIONS(returnstd::move(lhs += rhs);) }# endif// QT_NO_CAST_FROM_ASCII#endif// QT_USE_QSTRINGBUILDER QString QString::fromStdString(conststd::string &s){returnfromUtf8(s.data(),qsizetype(s.size())); }std::wstring QString::toStdWString()const{std::wstring str; str.resize(size()); str.resize(toWCharArray(str.data()));return str;} QString QString::fromStdWString(conststd::wstring &s){returnfromWCharArray(s.data(),qsizetype(s.size())); } QString QString::fromStdU16String(conststd::u16string &s){returnfromUtf16(s.data(),qsizetype(s.size())); }std::u16string QString::toStdU16String()const{returnstd::u16string(reinterpret_cast<const char16_t*>(data()),size()); } QString QString::fromStdU32String(conststd::u32string &s){returnfromUcs4(s.data(),qsizetype(s.size())); }std::u32string QString::toStdU32String()const{std::u32string u32str(size(),char32_t(0));const qsizetype len =toUcs4_helper(reinterpret_cast<const char16_t *>(data()),size(), u32str.data()); u32str.resize(len);return u32str;}QString::operator std::u16string_view()const noexcept {returnstd::u16string_view(d.data(),size_t(d.size));}#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED) Q_CORE_EXPORT QDataStream &operator<<(QDataStream &,const QString &); Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);#endifQ_DECLARE_SHARED(QString)Q_DECLARE_OPERATORS_FOR_FLAGS(QString::SectionFlags)intQString::compare(QStringView s,Qt::CaseSensitivity cs)const noexcept {return-s.compare(*this, cs); }intQString::localeAwareCompare(QStringView s)const{returnlocaleAwareCompare_helper(constData(),size(), s.constData(), s.size()); }intQString::localeAwareCompare(QStringView s1, QStringView s2){returnlocaleAwareCompare_helper(s1.constData(), s1.size(), s2.constData(), s2.size()); }intQStringView::localeAwareCompare(QStringView other)const{returnQString::localeAwareCompare(*this, other); }#if QT_CORE_INLINE_IMPL_SINCE(6, 5) qint64 QString::toLongLong(bool*ok,int base)const{return toIntegral_helper<qlonglong>(*this, ok, base);} quint64 QString::toULongLong(bool*ok,int base)const{return toIntegral_helper<qulonglong>(*this, ok, base);}#endif#if QT_CORE_INLINE_IMPL_SINCE(6, 8) qsizetype QString::indexOf(QChar ch, qsizetype from,Qt::CaseSensitivity cs)const{returnqToStringViewIgnoringNull(*this).indexOf(ch, from, cs);} qsizetype QString::lastIndexOf(QChar ch, qsizetype from,Qt::CaseSensitivity cs)const{returnqToStringViewIgnoringNull(*this).lastIndexOf(ch, from, cs);}#endif#if QT_CORE_INLINE_IMPL_SINCE(6, 10) QString QString::fromRawData(const QChar *unicode, qsizetype size){returnfromRawData(reinterpret_cast<const char16_t *>(unicode), size);}#endifnamespace QtPrivate {// used by qPrintable() and qUtf8Printable() macrosinlineconst QString &asString(const QString &s) {return s; }inline QString &&asString(QString &&s) {returnstd::move(s); }}#ifndef qPrintable# define qPrintable(string) QtPrivate::asString(string).toLocal8Bit().constData()#endif#ifndef qUtf8Printable# define qUtf8Printable(string) QtPrivate::asString(string).toUtf8().constData()#endif/* Wrap QString::utf16() with enough casts to allow passing it to QString::asprintf("%ls") without warnings.*/#ifndef qUtf16Printable# define qUtf16Printable(string) \ static_cast<const wchar_t*>(static_cast<const void*>(QtPrivate::asString(string).utf16()))#endif//// QStringView::arg() implementation//namespace QtPrivate {struct ArgBase {enum Tag : uchar { L1, Any, U16 } tag;};struct QStringViewArg : ArgBase { QStringView string;QStringViewArg() =default;constexpr explicitQStringViewArg(QStringView v) noexcept : ArgBase{U16}, string{v} {}};struct QLatin1StringArg : ArgBase { QLatin1StringView string;QLatin1StringArg() =default;constexpr explicitQLatin1StringArg(QLatin1StringView v) noexcept : ArgBase{L1}, string{v} {}};struct QAnyStringArg : ArgBase { QAnyStringView string;QAnyStringArg() =default;constexpr explicitQAnyStringArg(QAnyStringView v) noexcept : ArgBase{Any}, string{v} {}};#if QT_CORE_REMOVED_SINCE(6, 9)[[nodiscard]] Q_CORE_EXPORT QString argToQString(QStringView pattern,size_t n,const ArgBase **args);[[nodiscard]] Q_CORE_EXPORT QString argToQString(QLatin1StringView pattern,size_t n,const ArgBase **args);#endif[[nodiscard]] Q_CORE_EXPORT QString argToQString(QAnyStringView pattern,size_t n,const ArgBase **args);template<typename...Args>[[nodiscard]] Q_ALWAYS_INLINE QString argToQStringDispatch(QAnyStringView pattern,const Args &...args){const ArgBase *argBases[] = {&args...,/* avoid zero-sized array */nullptr};returnQtPrivate::argToQString(pattern,sizeof...(Args), argBases);}constexpr inline QAnyStringArg qStringLikeToArg(QAnyStringView s) noexcept {return QAnyStringArg{s}; }}// namespace QtPrivatetemplate<typename...Args> Q_ALWAYS_INLINE QString QStringView::arg(Args &&...args)const{returnQtPrivate::argToQStringDispatch(*this,QtPrivate::qStringLikeToArg(args)...);}template<typename...Args> Q_ALWAYS_INLINE QString QLatin1StringView::arg(Args &&...args)const{returnQtPrivate::argToQStringDispatch(*this,QtPrivate::qStringLikeToArg(args)...);}template<bool HasChar8T>template<typename...Args> QString QBasicUtf8StringView<HasChar8T>::arg(Args &&...args)const{returnQtPrivate::argToQStringDispatch(*this,QtPrivate::qStringLikeToArg(args)...);}template<typename...Args> QString QAnyStringView::arg(Args &&...args)const{returnQtPrivate::argToQStringDispatch(*this,QtPrivate::qStringLikeToArg(args)...);}template<typename T> qsizetype erase(QString &s,const T &t){return s.removeIf_helper([&t](constauto&e) {return t == e; });}template<typename Predicate> qsizetype erase_if(QString &s, Predicate pred){return s.removeIf_helper(pred);}namespace Qt {inlinenamespace Literals {inlinenamespace StringLiterals {inline QString operator""_s(const char16_t *str,size_t size) noexcept {returnQString(QStringPrivate(nullptr,const_cast<char16_t *>(str),qsizetype(size)));}}// StringLiterals}// Literals}// Qtinlinenamespace QtLiterals {#if QT_DEPRECATED_SINCE(6, 8)QT_DEPRECATED_VERSION_X_6_8("Use _s from Qt::StringLiterals namespace instead.")inline QString operator""_qs(const char16_t *str,size_t size) noexcept {returnQt::StringLiterals::operator""_s(str, size);}#endif// QT_DEPRECATED_SINCE(6, 8)}// QtLiterals QT_END_NAMESPACE #include <QtCore/qstringbuilder.h>#include <QtCore/qstringconverter.h>#ifdef Q_L1S_VIEW_IS_PRIMARY# undef Q_L1S_VIEW_IS_PRIMARY#endif#endif// QSTRING_H
|