diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-09-21 12:40:59 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-10-06 06:31:18 +0200 |
commit | bd225ef95e948f375d54af517097039d2c59a5fa (patch) | |
tree | 87b990816feb928638df7e152c6f8269b165130d /src/corelib/text | |
parent | d6aa7c338d73bc069eb8e25c500dfb19de0d5c8b (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.h | 44 | ||||
-rw-r--r-- | src/corelib/text/qstring.h | 7 | ||||
-rw-r--r-- | src/corelib/text/qutf8stringview.h | 23 |
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); |