summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qstring.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qstring.h')
-rw-r--r--src/corelib/text/qstring.h726
1 files changed, 472 insertions, 254 deletions
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index 26fb4e44ca..895ec4b5c0 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -12,6 +12,7 @@
#endif
#include <QtCore/qchar.h>
+#include <QtCore/qcompare.h>
#include <QtCore/qbytearray.h>
#include <QtCore/qbytearrayview.h>
#include <QtCore/qarraydata.h>
@@ -24,6 +25,8 @@
#include <string>
#include <iterator>
+#include <QtCore/q20memory.h>
+#include <string_view>
#include <stdarg.h>
@@ -36,6 +39,8 @@ Q_FORWARD_DECLARE_CF_TYPE(CFString);
Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
#endif
+class tst_QString;
+
QT_BEGIN_NAMESPACE
class QRegularExpression;
@@ -44,6 +49,13 @@ 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>>;
}
// Qt 4.x compatibility
@@ -79,7 +91,7 @@ qsizetype QStringView::count(QLatin1StringView s, Qt::CaseSensitivity cs) const
//
constexpr QAnyStringView::QAnyStringView(QLatin1StringView str) noexcept
- : m_data{str.data()}, m_size{size_t(str.size()) | Tag::Latin1} {}
+ : m_data{str.data()}, m_size{size_t(str.size() << SizeShift) | Tag::Latin1} {}
constexpr QLatin1StringView QAnyStringView::asLatin1StringView() const
{
@@ -116,14 +128,46 @@ constexpr QChar QAnyStringView::back() const
class Q_CORE_EXPORT QString
{
typedef QTypedArrayData<char16_t> Data;
+
+ friend class ::tst_QString;
+
+ template <typename Iterator>
+ static constexpr bool 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 Iterator>
+ static constexpr bool 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;
- inline constexpr QString() noexcept;
+ constexpr QString() noexcept;
explicit QString(const QChar *unicode, qsizetype size = -1);
QString(QChar c);
QString(qsizetype size, QChar c);
inline QString(QLatin1StringView latin1);
+ explicit QString(QStringView sv) : QString(sv.data(), sv.size()) {}
#if defined(__cpp_char8_t) || defined(Q_QDOC)
Q_WEAK_OVERLOAD
inline QString(const char8_t *str)
@@ -139,20 +183,32 @@ public:
= default;
QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QString)
void swap(QString &other) noexcept { d.swap(other.d); }
- inline qsizetype size() const { return d.size; }
+ inline qsizetype size() const noexcept { return d.size; }
#if QT_DEPRECATED_SINCE(6, 4)
QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
inline qsizetype count() const { return d.size; }
#endif
- inline qsizetype length() const { return d.size; }
- inline bool isEmpty() const;
+ inline qsizetype length() const noexcept { return d.size; }
+ inline bool isEmpty() const noexcept { return d.size == 0; }
void resize(qsizetype size);
void resize(qsizetype size, QChar fillChar);
+ void resizeForOverwrite(qsizetype size);
QString &fill(QChar c, qsizetype size = -1);
void truncate(qsizetype pos);
void chop(qsizetype n);
+ QString &slice(qsizetype pos)
+ { verify(pos, 0); return remove(0, pos); }
+ QString &slice(qsizetype pos, qsizetype n)
+ {
+ verify(pos, n);
+ if (isNull())
+ return *this;
+ resize(pos + n);
+ return remove(0, pos);
+ }
+
inline qsizetype capacity() const;
inline void reserve(qsizetype size);
inline void squeeze();
@@ -165,11 +221,11 @@ public:
inline void detach();
inline bool isDetached() const;
inline bool isSharedWith(const QString &other) const { return d.isSharedWith(other.d); }
- void clear();
+ inline void clear();
inline const QChar at(qsizetype i) const;
- const QChar operator[](qsizetype i) const;
- [[nodiscard]] QChar &operator[](qsizetype i);
+ inline const QChar operator[](qsizetype i) const;
+ [[nodiscard]] inline QChar &operator[](qsizetype i);
[[nodiscard]] inline QChar front() const { return at(0); }
[[nodiscard]] inline QChar &front();
@@ -180,17 +236,17 @@ public:
QChar fillChar = u' ') const;
[[nodiscard]] QString arg(qulonglong a, int fieldwidth=0, int base=10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(long a, int fieldwidth=0, int base=10,
+ [[nodiscard]] inline QString arg(long a, int fieldwidth=0, int base=10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(ulong a, int fieldwidth=0, int base=10,
+ [[nodiscard]] inline QString arg(ulong a, int fieldwidth=0, int base=10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(int a, int fieldWidth = 0, int base = 10,
+ [[nodiscard]] inline QString arg(int a, int fieldWidth = 0, int base = 10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(uint a, int fieldWidth = 0, int base = 10,
+ [[nodiscard]] inline QString arg(uint a, int fieldWidth = 0, int base = 10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(short a, int fieldWidth = 0, int base = 10,
+ [[nodiscard]] inline QString arg(short a, int fieldWidth = 0, int base = 10,
QChar fillChar = u' ') const;
- [[nodiscard]] QString arg(ushort a, int fieldWidth = 0, int base = 10,
+ [[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;
@@ -231,14 +287,16 @@ public:
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]] qsizetype indexOf(QChar c, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ 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
{ return QtPrivate::findString(*this, from, s, cs); }
[[nodiscard]] qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return lastIndexOf(c, -1, cs); }
- [[nodiscard]] qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ [[nodiscard]] QT_CORE_INLINE_SINCE(6, 7)
+ qsizetype lastIndexOf(QChar c, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return lastIndexOf(s, size(), cs); }
[[nodiscard]] qsizetype lastIndexOf(QLatin1StringView s, qsizetype from, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
@@ -285,27 +343,76 @@ public:
};
Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
- [[nodiscard]] QString section(QChar sep, qsizetype start, qsizetype end = -1, SectionFlags flags = SectionDefault) const;
+ [[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
- [[nodiscard]] QString left(qsizetype n) const;
- [[nodiscard]] QString right(qsizetype n) const;
- [[nodiscard]] QString mid(qsizetype position, qsizetype n = -1) const;
-
- [[nodiscard]] QString first(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data(), n); }
- [[nodiscard]] QString last(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return QString(data() + size() - n, n); }
- [[nodiscard]] QString sliced(qsizetype pos) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(pos <= size()); return QString(data() + pos, size() - pos); }
- [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) const
- { Q_ASSERT(pos >= 0); Q_ASSERT(n >= 0); Q_ASSERT(size_t(pos) + size_t(n) <= size_t(size())); return QString(data() + pos, n); }
- [[nodiscard]] QString chopped(qsizetype n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return first(size() - n); }
+#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;
+ return first(n);
+ }
+ [[nodiscard]] QString left(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::move(*this).first(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) const &
+ {
+ if (size_t(n) >= size_t(size()))
+ return *this;
+ return last(n);
+ }
+ [[nodiscard]] QString right(qsizetype n) &&
+ {
+ if (size_t(n) >= size_t(size()))
+ return std::move(*this);
+ return std::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); return sliced(0, n); }
+ [[nodiscard]] QString last(qsizetype n) const &
+ { verify(0, n); return sliced(size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) const &
+ { verify(pos, 0); return sliced(pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) const &
+ { verify(pos, n); return QString(begin() + pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) const &
+ { verify(0, n); return sliced(0, size() - n); }
+
+ [[nodiscard]] QString first(qsizetype n) &&
+ {
+ verify(0, n);
+ resize(n); // may detach and allocate memory
+ return std::move(*this);
+ }
+ [[nodiscard]] QString last(qsizetype n) &&
+ { verify(0, n); return sliced_helper(*this, size() - n, n); }
+ [[nodiscard]] QString sliced(qsizetype pos) &&
+ { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
+ [[nodiscard]] QString sliced(qsizetype pos, qsizetype n) &&
+ { verify(pos, n); return sliced_helper(*this, pos, n); }
+ [[nodiscard]] QString chopped(qsizetype n) &&
+ { verify(0, n); return std::move(*this).first(size() - n); }
+#endif
bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
[[nodiscard]] bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{ return QtPrivate::startsWith(*this, s, cs); }
@@ -375,6 +482,53 @@ public:
inline QString &prepend(QLatin1StringView s) { return insert(0, s); }
QString &prepend(QUtf8StringView s) { return insert(0, s); }
+ QString &assign(QAnyStringView s);
+ inline QString &assign(qsizetype n, QChar c)
+ {
+ Q_ASSERT(n >= 0);
+ return fill(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;
+ constexpr bool IsL1C = std::is_same_v<std::remove_cv_t<V>, QLatin1Char>;
+ constexpr bool IsFwdIt = std::is_convertible_v<
+ typename std::iterator_traits<InputIterator>::iterator_category,
+ std::forward_iterator_tag
+ >;
+
+ if constexpr (is_contiguous_iterator_v<InputIterator>) {
+ const auto p = q20::to_address(first);
+ const auto len = qsizetype(last - first);
+ if constexpr (IsL1C)
+ return assign(QLatin1StringView(reinterpret_cast<const char*>(p), len));
+ else if constexpr (sizeof(V) == 4)
+ return assign_helper(p, len);
+ else
+ return assign(QAnyStringView(p, len));
+ } else if constexpr (sizeof(V) == 4) { // non-contiguous iterator, feed data piecemeal
+ resize(0);
+ if constexpr (IsFwdIt) {
+ const qsizetype requiredCapacity = 2 * std::distance(first, last);
+ reserve(requiredCapacity);
+ }
+ while (first != last) {
+ append(QChar::fromUcs4(*first));
+ ++first;
+ }
+ return *this;
+ } else if constexpr (QtPrivate::IsCompatibleChar8Type<V>::value) {
+ assign_helper_char8(first, last);
+ d.data()[d.size] = u'\0';
+ return *this;
+ } else {
+ d.assign(first, last, [](QChar ch) -> char16_t { return ch.unicode(); });
+ d.data()[d.size] = u'\0';
+ return *this;
+ }
+ }
+
inline QString &operator+=(QChar c) { return append(c); }
inline QString &operator+=(const QString &s) { return append(s); }
@@ -564,11 +718,11 @@ public:
{ return -s2.compare(s1, cs); }
int localeAwareCompare(const QString& s) const;
- int localeAwareCompare(QStringView s) const;
+ inline int localeAwareCompare(QStringView s) const;
static int localeAwareCompare(const QString& s1, const QString& s2)
{ return s1.localeAwareCompare(s2); }
- static int localeAwareCompare(QStringView s1, QStringView s2);
+ static inline int localeAwareCompare(QStringView s1, QStringView s2);
short toShort(bool *ok=nullptr, int base=10) const
{ return toIntegral_helper<short>(*this, ok, base); }
@@ -589,15 +743,15 @@ public:
float toFloat(bool *ok=nullptr) const;
double toDouble(bool *ok=nullptr) const;
- QString &setNum(short, int base=10);
- QString &setNum(ushort, int base=10);
- QString &setNum(int, int base=10);
- QString &setNum(uint, int base=10);
- QString &setNum(long, int base=10);
- QString &setNum(ulong, int base=10);
+ 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);
- QString &setNum(float, char format='g', int precision=6);
+ 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);
@@ -608,78 +762,63 @@ public:
static QString number(qulonglong, int base=10);
static QString number(double, char format='g', int precision=6);
- friend bool operator==(const QString &s1, const QString &s2) noexcept
- { return (s1.size() == s2.size()) && QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) == 0; }
- friend bool operator< (const QString &s1, const QString &s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) < 0; }
- friend bool operator> (const QString &s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator!=(const QString &s1, const QString &s2) noexcept { return !(s1 == s2); }
- friend bool operator<=(const QString &s1, const QString &s2) noexcept { return !(s1 > s2); }
- friend bool operator>=(const QString &s1, const QString &s2) noexcept { return !(s1 < s2); }
-
- friend bool operator==(const QString &s1, QLatin1StringView s2) noexcept
- { return (s1.size() == s2.size()) && QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) == 0; }
- friend bool operator< (const QString &s1, QLatin1StringView s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) < 0; }
- friend bool operator> (const QString &s1, QLatin1StringView s2) noexcept
- { return QtPrivate::compareStrings(s1, s2, Qt::CaseSensitive) > 0; }
- friend bool operator!=(const QString &s1, QLatin1StringView s2) noexcept { return !(s1 == s2); }
- friend bool operator<=(const QString &s1, QLatin1StringView s2) noexcept { return !(s1 > s2); }
- friend bool operator>=(const QString &s1, QLatin1StringView s2) noexcept { return !(s1 < s2); }
-
- friend bool operator==(QLatin1StringView s1, const QString &s2) noexcept { return s2 == s1; }
- friend bool operator< (QLatin1StringView s1, const QString &s2) noexcept { return s2 > s1; }
- friend bool operator> (QLatin1StringView s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator!=(QLatin1StringView s1, const QString &s2) noexcept { return s2 != s1; }
- friend bool operator<=(QLatin1StringView s1, const QString &s2) noexcept { return s2 >= s1; }
- friend bool operator>=(QLatin1StringView s1, const QString &s2) noexcept { return s2 <= s1; }
+ friend bool comparesEqual(const QString &s1, const QString &s2) noexcept
+ { return comparesEqual(QStringView(s1), QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const QString &s2) noexcept
+ { return compareThreeWay(QStringView(s1), QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString)
+
+ Q_WEAK_OVERLOAD
+ friend bool comparesEqual(const QString &s1, QUtf8StringView s2) noexcept
+ { return QtPrivate::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);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QUtf8StringView, Q_WEAK_OVERLOAD)
+
+#ifdef __cpp_char8_t
+ friend bool comparesEqual(const QString &s1, const char8_t *s2) noexcept
+ { return comparesEqual(s1, QUtf8StringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char8_t *s2) noexcept
+ { return compareThreeWay(s1, QUtf8StringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char8_t *)
+#endif // __cpp_char8_t
+
+ friend bool comparesEqual(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);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QLatin1StringView)
// Check isEmpty() instead of isNull() for backwards compatibility.
- friend bool operator==(const QString &s1, std::nullptr_t) noexcept { return s1.isEmpty(); }
- friend bool operator!=(const QString &s1, std::nullptr_t) noexcept { return !s1.isEmpty(); }
- friend bool operator< (const QString & , std::nullptr_t) noexcept { return false; }
- friend bool operator> (const QString &s1, std::nullptr_t) noexcept { return !s1.isEmpty(); }
- friend bool operator<=(const QString &s1, std::nullptr_t) noexcept { return s1.isEmpty(); }
- friend bool operator>=(const QString & , std::nullptr_t) noexcept { return true; }
- friend bool operator==(std::nullptr_t, const QString &s2) noexcept { return s2 == nullptr; }
- friend bool operator!=(std::nullptr_t, const QString &s2) noexcept { return s2 != nullptr; }
- friend bool operator< (std::nullptr_t, const QString &s2) noexcept { return s2 > nullptr; }
- friend bool operator> (std::nullptr_t, const QString &s2) noexcept { return s2 < nullptr; }
- friend bool operator<=(std::nullptr_t, const QString &s2) noexcept { return s2 >= nullptr; }
- friend bool operator>=(std::nullptr_t, const QString &s2) noexcept { return s2 <= nullptr; }
-
- friend bool operator==(const QString &s1, const char16_t *s2) noexcept { return s1 == QStringView(s2); }
- friend bool operator!=(const QString &s1, const char16_t *s2) noexcept { return s1 != QStringView(s2); }
- friend bool operator< (const QString &s1, const char16_t *s2) noexcept { return s1 < QStringView(s2); }
- friend bool operator> (const QString &s1, const char16_t *s2) noexcept { return s1 > QStringView(s2); }
- friend bool operator<=(const QString &s1, const char16_t *s2) noexcept { return s1 <= QStringView(s2); }
- friend bool operator>=(const QString &s1, const char16_t *s2) noexcept { return s1 >= QStringView(s2); }
-
- friend bool operator==(const char16_t *s1, const QString &s2) noexcept { return s2 == s1; }
- friend bool operator!=(const char16_t *s1, const QString &s2) noexcept { return s2 != s1; }
- friend bool operator< (const char16_t *s1, const QString &s2) noexcept { return s2 > s1; }
- friend bool operator> (const char16_t *s1, const QString &s2) noexcept { return s2 < s1; }
- friend bool operator<=(const char16_t *s1, const QString &s2) noexcept { return s2 >= s1; }
- friend bool operator>=(const char16_t *s1, const QString &s2) noexcept { return s2 <= s1; }
+ friend bool comparesEqual(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)
+
+ friend bool comparesEqual(const QString &s1, const char16_t *s2) noexcept
+ { return comparesEqual(s1, QStringView(s2)); }
+ friend Qt::strong_ordering compareThreeWay(const QString &s1, const char16_t *s2) noexcept
+ { return compareThreeWay(s1, QStringView(s2)); }
+ Q_DECLARE_STRONGLY_ORDERED(QString, const char16_t *)
// QChar <> QString
- friend inline bool operator==(QChar lhs, const QString &rhs) noexcept
- { return rhs.size() == 1 && lhs == rhs.front(); }
- friend inline bool operator< (QChar lhs, const QString &rhs) noexcept
- { return compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
- friend inline bool operator> (QChar lhs, const QString &rhs) noexcept
- { return compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
- friend inline bool operator!=(QChar lhs, const QString &rhs) noexcept { return !(lhs == rhs); }
- friend inline bool operator<=(QChar lhs, const QString &rhs) noexcept { return !(lhs > rhs); }
- friend inline bool operator>=(QChar lhs, const QString &rhs) noexcept { return !(lhs < rhs); }
-
- friend inline bool operator==(const QString &lhs, QChar rhs) noexcept { return rhs == lhs; }
- friend inline bool operator!=(const QString &lhs, QChar rhs) noexcept { return !(rhs == lhs); }
- friend inline bool operator< (const QString &lhs, QChar rhs) noexcept { return rhs > lhs; }
- friend inline bool operator> (const QString &lhs, QChar rhs) noexcept { return rhs < lhs; }
- friend inline bool operator<=(const QString &lhs, QChar rhs) noexcept { return !(rhs < lhs); }
- friend inline bool operator>=(const QString &lhs, QChar rhs) noexcept { return !(rhs > lhs); }
+ friend bool comparesEqual(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);
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QChar)
// ASCII compatibility
#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
@@ -703,10 +842,21 @@ public:
: QString(fromUtf8(a))
{}
QT_ASCII_CAST_WARN inline QString &operator=(const char *ch)
- { return (*this = fromUtf8(ch)); }
+ {
+ if (!ch) {
+ clear();
+ return *this;
+ }
+ return assign(ch);
+ }
QT_ASCII_CAST_WARN inline QString &operator=(const QByteArray &a)
- { return (*this = fromUtf8(a)); }
-
+ {
+ if (a.isNull()) {
+ clear();
+ return *this;
+ }
+ return assign(a);
+ }
// these are needed, so it compiles with STL support enabled
QT_ASCII_CAST_WARN inline QString &prepend(const char *s)
{ return prepend(QUtf8StringView(s)); }
@@ -725,6 +875,7 @@ public:
QT_ASCII_CAST_WARN inline QString &operator+=(const QByteArray &s)
{ return append(QUtf8StringView(s)); }
+#if QT_CORE_REMOVED_SINCE(6, 8)
QT_ASCII_CAST_WARN inline bool operator==(const char *s) const;
QT_ASCII_CAST_WARN inline bool operator!=(const char *s) const;
QT_ASCII_CAST_WARN inline bool operator<(const char *s) const;
@@ -738,20 +889,41 @@ public:
QT_ASCII_CAST_WARN inline bool operator>(const QByteArray &s) const;
QT_ASCII_CAST_WARN inline bool operator<=(const QByteArray &s) const;
QT_ASCII_CAST_WARN inline bool operator>=(const QByteArray &s) const;
+#else
+ friend bool comparesEqual(const QString &lhs, QByteArrayView rhs) noexcept
+ {
+ return QString::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());
+ return Qt::compareThreeWay(res, 0);
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArrayView, QT_ASCII_CAST_WARN)
- QT_ASCII_CAST_WARN friend bool operator==(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
- QT_ASCII_CAST_WARN friend bool operator!=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
- QT_ASCII_CAST_WARN friend bool operator< (const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
- QT_ASCII_CAST_WARN friend bool operator> (const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
- QT_ASCII_CAST_WARN friend bool operator<=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
- QT_ASCII_CAST_WARN friend bool operator>=(const char *s1, const QString &s2)
- { return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-#endif
+ friend bool comparesEqual(const QString &lhs, const QByteArray &rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const QByteArray &rhs) noexcept
+ {
+ return compareThreeWay(lhs, QByteArrayView(rhs));
+ }
+ Q_DECLARE_STRONGLY_ORDERED(QString, QByteArray, QT_ASCII_CAST_WARN)
+
+ friend bool comparesEqual(const QString &lhs, const char *rhs) noexcept
+ { return comparesEqual(lhs, QByteArrayView(rhs)); }
+ friend Qt::strong_ordering
+ compareThreeWay(const QString &lhs, const char *rhs) noexcept
+ {
+ return compareThreeWay(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;
typedef const QChar *const_iterator;
@@ -789,6 +961,11 @@ public:
void shrink_to_fit() { squeeze(); }
iterator erase(const_iterator first, const_iterator last);
inline iterator erase(const_iterator it) { return erase(it, it + 1); }
+ static constexpr qsizetype max_size() noexcept
+ {
+ // -1 to deal with the NUL terminator
+ return Data::max_size() - 1;
+ }
static inline QString fromStdString(const std::string &s);
inline std::string toStdString() const;
@@ -800,6 +977,8 @@ public:
static inline QString fromStdU32String(const std::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;
@@ -808,14 +987,12 @@ public:
#endif
#if defined(Q_OS_WASM) || defined(Q_QDOC)
- static QString fromJsString(emscripten::val jsString);
- emscripten::val toJsString() const;
+ static QString fromEcmaString(emscripten::val jsString);
+ emscripten::val toEcmaString() const;
#endif
inline bool isNull() const { return d->isNull(); }
-
- bool isSimpleText() const;
bool isRightToLeft() const;
[[nodiscard]] bool isValidUtf16() const noexcept
{ return QStringView(*this).isValidUtf16(); }
@@ -838,6 +1015,11 @@ private:
void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
void reallocGrowData(qsizetype n);
+ // ### remove once QAnyStringView supports UTF-32:
+ QString &assign_helper(const char32_t *data, qsizetype len);
+ // Defined in qstringconverter.h
+ template <typename InputIterator>
+ void assign_helper_char8(InputIterator first, InputIterator last);
static int compare_helper(const QChar *data1, qsizetype length1,
const QChar *data2, qsizetype length2,
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
@@ -846,6 +1028,7 @@ private:
Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
static int localeAwareCompare_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);
@@ -897,6 +1080,15 @@ private:
return T(val);
}
+ Q_ALWAYS_INLINE constexpr void verify([[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; }
inline const DataPointer &data_ptr() const { return d; }
@@ -927,7 +1119,7 @@ int QStringView::compare(QUtf8StringView other, Qt::CaseSensitivity cs) const no
//
QString QStringView::toString() const
-{ return QString(data(), size()); }
+{ return QString(*this); }
qint64 QStringView::toLongLong(bool *ok, int base) const
{ return QString::toIntegral_helper<qint64>(*this, ok, base); }
@@ -951,14 +1143,31 @@ ushort QStringView::toUShort(bool *ok, int base) const
//
template <bool UseChar8T>
+int QBasicUtf8StringView<UseChar8T>::compare(QChar other, Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this, QStringView(&other, 1), cs);
+}
+
+template <bool UseChar8T>
int QBasicUtf8StringView<UseChar8T>::compare(QStringView other, Qt::CaseSensitivity cs) const noexcept
{
return QtPrivate::compareStrings(*this, other, cs);
}
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QChar other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, QStringView(&other, 1));
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QStringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
//
-// QUtf8StringView inline members that require QString:
+// QUtf8StringView inline members that require QString, QL1SV or QBA:
//
template <bool UseChar8T>
@@ -974,6 +1183,29 @@ template<bool UseChar8T>
return QtPrivate::compareStrings(*this, other, cs);
}
+template<bool UseChar8T>
+[[nodiscard]] int QBasicUtf8StringView<UseChar8T>::compare(const QByteArray &other,
+ Qt::CaseSensitivity cs) const noexcept
+{
+ return QtPrivate::compareStrings(*this,
+ QBasicUtf8StringView<UseChar8T>(other.data(), other.size()),
+ cs);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(QLatin1StringView other) const noexcept
+{
+ return QtPrivate::equalStrings(*this, other);
+}
+
+template <bool UseChar8T>
+[[nodiscard]] bool QBasicUtf8StringView<UseChar8T>::equal(const QByteArray &other) const noexcept
+{
+ return size() == other.size()
+ && QtPrivate::equalStrings(*this, QBasicUtf8StringView<UseChar8T>(other.data(),
+ other.size()));
+}
+
//
// QAnyStringView inline members that require QString:
//
@@ -989,17 +1221,15 @@ QString QAnyStringView::toString() const
//
// QString inline members
//
-inline QString::QString(QLatin1StringView latin1)
+QString::QString(QLatin1StringView latin1)
{ *this = QString::fromLatin1(latin1.data(), latin1.size()); }
-inline const QChar QString::at(qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return QChar(d.data()[i]); }
-inline const QChar QString::operator[](qsizetype i) const
-{ Q_ASSERT(size_t(i) < size_t(size())); return QChar(d.data()[i]); }
-inline bool QString::isEmpty() const
-{ return d.size == 0; }
-inline const QChar *QString::unicode() const
+const QChar QString::at(qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar QString::operator[](qsizetype i) const
+{ verify(i, 1); return QChar(d.data()[i]); }
+const QChar *QString::unicode() const
{ return data(); }
-inline const QChar *QString::data() const
+const QChar *QString::data() const
{
#if QT5_NULL_STRINGS == 1
return reinterpret_cast<const QChar *>(d.data() ? d.data() : &_empty);
@@ -1007,58 +1237,58 @@ inline const QChar *QString::data() const
return reinterpret_cast<const QChar *>(d.data());
#endif
}
-inline QChar *QString::data()
+QChar *QString::data()
{
detach();
Q_ASSERT(d.data());
return reinterpret_cast<QChar *>(d.data());
}
-inline const QChar *QString::constData() const
+const QChar *QString::constData() const
{ return data(); }
-inline void QString::detach()
+void QString::detach()
{ if (d->needsDetach()) reallocData(d.size, QArrayData::KeepSize); }
-inline bool QString::isDetached() const
+bool QString::isDetached() const
{ return !d->isShared(); }
-inline void QString::clear()
+void QString::clear()
{ if (!isNull()) *this = QString(); }
-inline QString::QString(const QString &other) noexcept : d(other.d)
+QString::QString(const QString &other) noexcept : d(other.d)
{ }
-inline qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
-inline QString &QString::setNum(short n, int base)
+qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); }
+QString &QString::setNum(short n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ushort n, int base)
+QString &QString::setNum(ushort n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(int n, int base)
+QString &QString::setNum(int n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(uint n, int base)
+QString &QString::setNum(uint n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(long n, int base)
+QString &QString::setNum(long n, int base)
{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ulong n, int base)
+QString &QString::setNum(ulong n, int base)
{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(float n, char f, int prec)
+QString &QString::setNum(float n, char f, int prec)
{ return setNum(double(n),f,prec); }
-inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
+QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags) const
+QString QString::section(QChar asep, qsizetype astart, qsizetype aend, SectionFlags aflags) const
{ return section(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"
-inline qsizetype QString::toWCharArray(wchar_t *array) const
+qsizetype QString::toWCharArray(wchar_t *array) const
{
return qToStringViewIgnoringNull(*this).toWCharArray(array);
}
@@ -1076,16 +1306,23 @@ qsizetype QStringView::toWCharArray(wchar_t *array) const
QT_WARNING_POP
-inline QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
+QString QString::fromWCharArray(const wchar_t *string, qsizetype size)
{
- return sizeof(wchar_t) == sizeof(QChar) ? fromUtf16(reinterpret_cast<const char16_t *>(string), size)
- : fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+ if constexpr (sizeof(wchar_t) == sizeof(QChar)) {
+ return QString(reinterpret_cast<const QChar *>(string), size);
+ } else {
+#ifdef QT_BOOTSTRAPPED
+ Q_UNREACHABLE_RETURN(QString());
+#else
+ return fromUcs4(reinterpret_cast<const char32_t *>(string), size);
+#endif
+ }
}
-inline constexpr QString::QString() noexcept {}
-inline QString::~QString() {}
+constexpr QString::QString() noexcept {}
+QString::~QString() {}
-inline void QString::reserve(qsizetype asize)
+void QString::reserve(qsizetype asize)
{
if (d->needsDetach() || asize >= capacity() - d.freeSpaceAtBegin())
reallocData(qMax(asize, size()), QArrayData::KeepSize);
@@ -1093,7 +1330,7 @@ inline void QString::reserve(qsizetype asize)
d->setFlag(Data::CapacityReserved);
}
-inline void QString::squeeze()
+void QString::squeeze()
{
if (!d.isMutable())
return;
@@ -1103,111 +1340,78 @@ inline void QString::squeeze()
d->clearFlag(Data::CapacityReserved);
}
-inline QString &QString::setUtf16(const ushort *autf16, qsizetype asize)
+QString &QString::setUtf16(const ushort *autf16, qsizetype asize)
{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
-inline QChar &QString::operator[](qsizetype i)
-{ Q_ASSERT(i >= 0 && i < size()); return data()[i]; }
-inline QChar &QString::front() { return operator[](0); }
-inline QChar &QString::back() { return operator[](size() - 1); }
-inline QString::iterator QString::begin()
+QChar &QString::operator[](qsizetype i)
+{ verify(i, 1); return data()[i]; }
+QChar &QString::front() { return operator[](0); }
+QChar &QString::back() { return operator[](size() - 1); }
+QString::iterator QString::begin()
{ detach(); return reinterpret_cast<QChar*>(d.data()); }
-inline QString::const_iterator QString::begin() const
+QString::const_iterator QString::begin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::cbegin() const
+QString::const_iterator QString::cbegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::const_iterator QString::constBegin() const
+QString::const_iterator QString::constBegin() const
{ return reinterpret_cast<const QChar*>(d.data()); }
-inline QString::iterator QString::end()
+QString::iterator QString::end()
{ detach(); return reinterpret_cast<QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::end() const
+QString::const_iterator QString::end() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::cend() const
+QString::const_iterator QString::cend() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline QString::const_iterator QString::constEnd() const
+QString::const_iterator QString::constEnd() const
{ return reinterpret_cast<const QChar*>(d.data() + d.size); }
-inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
+bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const
+bool QString::contains(QLatin1StringView s, Qt::CaseSensitivity cs) const
{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
+bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
{ return indexOf(c, 0, cs) != -1; }
-inline bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
+bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept
{ return indexOf(s, 0, cs) != -1; }
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline bool QString::operator==(const char *s) const
+#if QT_CORE_REMOVED_SINCE(6, 8)
+bool QString::operator==(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline bool QString::operator!=(const char *s) const
+bool QString::operator!=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline bool QString::operator<(const char *s) const
+bool QString::operator<(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline bool QString::operator>(const char *s) const
+bool QString::operator>(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline bool QString::operator<=(const char *s) const
+bool QString::operator<=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline bool QString::operator>=(const char *s) const
+bool QString::operator>=(const char *s) const
{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-//
-// QLatin1StringView inline members that require QString:
-//
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator==(const char *s) const
-{ return QString::fromUtf8(s) == *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator!=(const char *s) const
-{ return QString::fromUtf8(s) != *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator<(const char *s) const
-{ return QString::fromUtf8(s) > *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator>(const char *s) const
-{ return QString::fromUtf8(s) < *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator<=(const char *s) const
-{ return QString::fromUtf8(s) >= *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator>=(const char *s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator==(const QByteArray &s) const
-{ return QString::fromUtf8(s) == *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator!=(const QByteArray &s) const
-{ return QString::fromUtf8(s) != *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator<(const QByteArray &s) const
-{ return QString::fromUtf8(s) > *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator>(const QByteArray &s) const
-{ return QString::fromUtf8(s) < *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator<=(const QByteArray &s) const
-{ return QString::fromUtf8(s) >= *this; }
-QT_ASCII_CAST_WARN inline bool QLatin1StringView::operator>=(const QByteArray &s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline int QLatin1StringView::compare_helper(const QLatin1StringView &s1, const char *s2)
-{
- return QString::compare(s1, QString::fromUtf8(s2));
-}
-
-
-QT_ASCII_CAST_WARN inline bool QString::operator==(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator==(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) == 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator!=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator!=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) != 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator<(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator<(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) < 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator>(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) > 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator<=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator<=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) <= 0; }
-QT_ASCII_CAST_WARN inline bool QString::operator>=(const QByteArray &s) const
+QT_ASCII_CAST_WARN bool QString::operator>=(const QByteArray &s) const
{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) >= 0; }
-inline bool QByteArray::operator==(const QString &s) const
+bool QByteArray::operator==(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) == 0; }
-inline bool QByteArray::operator!=(const QString &s) const
+bool QByteArray::operator!=(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) != 0; }
-inline bool QByteArray::operator<(const QString &s) const
+bool QByteArray::operator<(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) > 0; }
-inline bool QByteArray::operator>(const QString &s) const
+bool QByteArray::operator>(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) < 0; }
-inline bool QByteArray::operator<=(const QString &s) const
+bool QByteArray::operator<=(const QString &s) const
{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) >= 0; }
-inline bool QByteArray::operator>=(const QString &s) const
+bool QByteArray::operator>=(const QString &s) const
{ return QString::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)
@@ -1237,13 +1441,13 @@ QT_ASCII_CAST_WARN inline QString operator+(QString &&lhs, const QByteArray &rhs
# endif // QT_NO_CAST_FROM_ASCII
#endif // QT_USE_QSTRINGBUILDER
-inline std::string QString::toStdString() const
+std::string QString::toStdString() const
{ return toUtf8().toStdString(); }
-inline QString QString::fromStdString(const std::string &s)
+QString QString::fromStdString(const std::string &s)
{ return fromUtf8(s.data(), qsizetype(s.size())); }
-inline std::wstring QString::toStdWString() const
+std::wstring QString::toStdWString() const
{
std::wstring str;
str.resize(size());
@@ -1251,19 +1455,19 @@ inline std::wstring QString::toStdWString() const
return str;
}
-inline QString QString::fromStdWString(const std::wstring &s)
+QString QString::fromStdWString(const std::wstring &s)
{ return fromWCharArray(s.data(), qsizetype(s.size())); }
-inline QString QString::fromStdU16String(const std::u16string &s)
+QString QString::fromStdU16String(const std::u16string &s)
{ return fromUtf16(s.data(), qsizetype(s.size())); }
-inline std::u16string QString::toStdU16String() const
+std::u16string QString::toStdU16String() const
{ return std::u16string(reinterpret_cast<const char16_t*>(data()), size()); }
-inline QString QString::fromStdU32String(const std::u32string &s)
+QString QString::fromStdU32String(const std::u32string &s)
{ return fromUcs4(s.data(), qsizetype(s.size())); }
-inline std::u32string QString::toStdU32String() const
+std::u32string QString::toStdU32String() const
{
std::u32string u32str(size(), char32_t(0));
const qsizetype len = toUcs4_helper(reinterpret_cast<const char16_t *>(data()),
@@ -1272,6 +1476,11 @@ inline std::u32string QString::toStdU32String() const
return u32str;
}
+QString::operator std::u16string_view() const noexcept
+{
+ return std::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 &);
@@ -1280,14 +1489,14 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
Q_DECLARE_SHARED(QString)
Q_DECLARE_OPERATORS_FOR_FLAGS(QString::SectionFlags)
-inline int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
+int QString::compare(QStringView s, Qt::CaseSensitivity cs) const noexcept
{ return -s.compare(*this, cs); }
-inline int QString::localeAwareCompare(QStringView s) const
+int QString::localeAwareCompare(QStringView s) const
{ return localeAwareCompare_helper(constData(), size(), s.constData(), s.size()); }
-inline int QString::localeAwareCompare(QStringView s1, QStringView s2)
+int QString::localeAwareCompare(QStringView s1, QStringView s2)
{ return localeAwareCompare_helper(s1.constData(), s1.size(), s2.constData(), s2.size()); }
-inline int QStringView::localeAwareCompare(QStringView other) const
+int QStringView::localeAwareCompare(QStringView other) const
{ return QString::localeAwareCompare(*this, other); }
#if QT_CORE_INLINE_IMPL_SINCE(6, 5)
@@ -1301,6 +1510,16 @@ quint64 QString::toULongLong(bool *ok, int base) const
return toIntegral_helper<qulonglong>(*this, ok, base);
}
#endif
+#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
+qsizetype QString::indexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).indexOf(ch, from, cs);
+}
+qsizetype QString::lastIndexOf(QChar ch, qsizetype from, Qt::CaseSensitivity cs) const
+{
+ return qToStringViewIgnoringNull(*this).lastIndexOf(ch, from, cs);
+}
+#endif
namespace QtPrivate {
// used by qPrintable() and qUtf8Printable() macros
@@ -1393,7 +1612,7 @@ qsizetype erase_if(QString &s, Predicate pred)
namespace Qt {
inline namespace Literals {
inline namespace StringLiterals {
-inline QString operator"" _s(const char16_t *str, size_t size) noexcept
+inline QString operator""_s(const char16_t *str, size_t size) noexcept
{
return QString(QStringPrivate(nullptr, const_cast<char16_t *>(str), qsizetype(size)));
}
@@ -1406,7 +1625,7 @@ inline namespace 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
+inline QString operator""_qs(const char16_t *str, size_t size) noexcept
{
return Qt::StringLiterals::operator""_s(str, size);
}
@@ -1416,9 +1635,8 @@ inline QString operator"" _qs(const char16_t *str, size_t size) noexcept
QT_END_NAMESPACE
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
-#endif
+#include <QtCore/qstringconverter.h>
#ifdef Q_L1S_VIEW_IS_PRIMARY
# undef Q_L1S_VIEW_IS_PRIMARY