summaryrefslogtreecommitdiffstats
path: root/src/corelib/text
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2020-09-21 12:40:59 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2020-10-06 06:31:18 +0200
commitbd225ef95e948f375d54af517097039d2c59a5fa (patch)
tree87b990816feb928638df7e152c6f8269b165130d /src/corelib/text
parentd6aa7c338d73bc069eb8e25c500dfb19de0d5c8b (diff)
Make QAnyStringView comparison operators hidden friends
Also add the very same operators to the QBasicUtf8StringView class to overcome the compiler issues seen on gcc. Fixes: QTBUG-86481 Change-Id: I12484455ebd3b7b38d4ad67c38977d76f9b3ddfa Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/text')
-rw-r--r--src/corelib/text/qanystringview.h44
-rw-r--r--src/corelib/text/qstring.h7
-rw-r--r--src/corelib/text/qutf8stringview.h23
3 files changed, 52 insertions, 22 deletions
diff --git a/src/corelib/text/qanystringview.h b/src/corelib/text/qanystringview.h
index 242efc6e5c..647f43f265 100644
--- a/src/corelib/text/qanystringview.h
+++ b/src/corelib/text/qanystringview.h
@@ -42,6 +42,10 @@
#include <QtCore/qstringview.h>
#include <QtCore/qutf8stringview.h>
+#ifdef __cpp_impl_three_way_comparison
+#include <compare>
+#endif
+
QT_BEGIN_NAMESPACE
template <typename, typename> class QStringBuilder;
@@ -217,7 +221,27 @@ public:
constexpr int length() const /* not nothrow! */
{ return Q_ASSERT(int(size()) == size()), int(size()); }
#endif
+
private:
+ [[nodiscard]] friend inline bool operator==(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) == 0; }
+ [[nodiscard]] friend inline bool operator!=(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return !operator==(lhs, rhs); }
+
+#ifdef __cpp_impl_three_way_comparison
+ [[nodiscard]] friend inline auto operator<=>(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) <=> 0; }
+#else
+ [[nodiscard]] friend inline bool operator<=(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) <= 0; }
+ [[nodiscard]] friend inline bool operator>=(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) >= 0; }
+ [[nodiscard]] friend inline bool operator<(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) < 0; }
+ [[nodiscard]] friend inline bool operator>(QAnyStringView lhs, QAnyStringView rhs) noexcept
+ { return QAnyStringView::compare(lhs, rhs) > 0; }
+#endif
+
// TODO: Optimize by inverting and storing the flags in the low bits and
// the size in the high.
static_assert(std::is_same_v<std::size_t, size_t>);
@@ -273,26 +297,6 @@ template <typename QStringLike, std::enable_if_t<std::disjunction_v<
[[nodiscard]] inline QAnyStringView qToAnyStringViewIgnoringNull(const QStringLike &s) noexcept
{ return QAnyStringView(s.data(), s.size()); }
-
-#define Q_ANY_SV_MAKE_RELOP(op) \
- [[nodiscard]] Q_ALWAYS_INLINE auto operator op (QAnyStringView lhs, QAnyStringView rhs) noexcept \
- { return QAnyStringView::compare(lhs, rhs) op 0; } \
- /* end */
-
-Q_ANY_SV_MAKE_RELOP(==) // size() shortcut doesn't apply for UTF-8 vs. {L1, UTF-16}
-Q_ANY_SV_MAKE_RELOP(!=)
-
-#ifdef __cpp_impl_three_way_comparison
-Q_ANY_SV_MAKE_RELOP(<=>)
-#else
-Q_ANY_SV_MAKE_RELOP(<=)
-Q_ANY_SV_MAKE_RELOP(>=)
-Q_ANY_SV_MAKE_RELOP(<)
-Q_ANY_SV_MAKE_RELOP(>)
-#endif
-
-#undef Q_ANY_SV_MAKE_RELOP
-
QT_END_NAMESPACE
#endif /* QANYSTRINGVIEW_H */
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index d12c96632e..5c809592e8 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -1042,6 +1042,11 @@ QString QBasicUtf8StringView<UseChar8T>::toString() const
return QString::fromUtf8(data(), int(size()));
}
+template<bool UseChar8T>
+inline int QBasicUtf8StringView<UseChar8T>::compare(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs,
+ Qt::CaseSensitivity cs) noexcept
+{ return QAnyStringView::compare(lhs, rhs, cs); }
+
//
// QAnyStringView inline members that require QString:
//
@@ -1438,7 +1443,6 @@ inline bool operator> (QLatin1String lhs, QChar rhs) noexcept { return rhs <
inline bool operator<=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs < lhs); }
inline bool operator>=(QLatin1String lhs, QChar rhs) noexcept { return !(rhs > lhs); }
-#if 0
// QStringView <> QStringView
inline bool operator==(QStringView lhs, QStringView rhs) noexcept { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
inline bool operator!=(QStringView lhs, QStringView rhs) noexcept { return !(lhs == rhs); }
@@ -1446,7 +1450,6 @@ inline bool operator< (QStringView lhs, QStringView rhs) noexcept { return QtPri
inline bool operator<=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
inline bool operator> (QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) > 0; }
inline bool operator>=(QStringView lhs, QStringView rhs) noexcept { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-#endif
// QStringView <> QChar
inline bool operator==(QStringView lhs, QChar rhs) noexcept { return lhs == QStringView(&rhs, 1); }
diff --git a/src/corelib/text/qutf8stringview.h b/src/corelib/text/qutf8stringview.h
index ac42a3d73f..98357ae5a9 100644
--- a/src/corelib/text/qutf8stringview.h
+++ b/src/corelib/text/qutf8stringview.h
@@ -304,7 +304,30 @@ public:
constexpr int length() const /* not nothrow! */
{ return Q_ASSERT(int(size()) == size()), int(size()); }
#endif
+
private:
+ [[nodiscard]] static inline int compare(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept;
+
+ [[nodiscard]] friend inline bool operator==(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) == 0; }
+ [[nodiscard]] friend inline bool operator!=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return !operator==(lhs, rhs); }
+
+#ifdef __cpp_impl_three_way_comparison
+ [[nodiscard]] friend inline auto operator<=>(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) <=> 0; }
+#else
+ [[nodiscard]] friend inline bool operator<=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) <= 0; }
+ [[nodiscard]] friend inline bool operator>=(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) >= 0; }
+ [[nodiscard]] friend inline bool operator<(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) < 0; }
+ [[nodiscard]] friend inline bool operator>(QBasicUtf8StringView lhs, QBasicUtf8StringView rhs) noexcept
+ { return QBasicUtf8StringView::compare(lhs, rhs) > 0; }
+#endif
+
Q_ALWAYS_INLINE constexpr void verify(qsizetype pos, qsizetype n = 0) const
{
Q_ASSERT(pos >= 0);