diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 80af7cfbab5..7a93ec688ef 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -142,6 +142,10 @@ public: inline T &operator*() const { return *i; } inline T *operator->() const { return i; } inline T &operator[](qsizetype j) const { return *(i + j); } +#ifdef __cpp_lib_three_way_comparison + friend constexpr auto operator<=>(iterator, iterator) noexcept = default; + friend constexpr bool operator==(iterator, iterator) noexcept = default; +#else inline constexpr bool operator==(iterator o) const { return i == o.i; } inline constexpr bool operator!=(iterator o) const { return i != o.i; } inline constexpr bool operator<(iterator other) const { return i < other.i; } @@ -154,6 +158,7 @@ public: inline constexpr bool operator<=(const_iterator other) const { return i <= other.i; } inline constexpr bool operator>(const_iterator other) const { return i > other.i; } inline constexpr bool operator>=(const_iterator other) const { return i >= other.i; } +#endif // __cpp_lib_three_way_comparison inline constexpr bool operator==(pointer p) const { return i == p; } inline constexpr bool operator!=(pointer p) const { return i != p; } inline iterator &operator++() { ++i; return *this; } @@ -213,6 +218,14 @@ public: inline const T &operator*() const { return *i; } inline const T *operator->() const { return i; } inline const T &operator[](qsizetype j) const { return *(i + j); } +#ifdef __cpp_lib_three_way_comparison + friend constexpr auto operator<=>(const_iterator, const_iterator) noexcept = default; + friend constexpr auto operator<=>(const_iterator a, iterator b) noexcept + { return a <=> const_iterator(b); } + friend constexpr bool operator==(const_iterator, const_iterator) noexcept = default; + friend constexpr bool operator==(const_iterator a, iterator b) noexcept + { return a == const_iterator(b); } +#else inline constexpr bool operator==(const_iterator o) const { return i == o.i; } inline constexpr bool operator!=(const_iterator o) const { return i != o.i; } inline constexpr bool operator<(const_iterator other) const { return i < other.i; } @@ -225,6 +238,7 @@ public: inline constexpr bool operator<=(iterator other) const { return i <= other.i; } inline constexpr bool operator>(iterator other) const { return i > other.i; } inline constexpr bool operator>=(iterator other) const { return i >= other.i; } +#endif // __cpp_lib_three_way_comparison inline constexpr bool operator==(pointer p) const { return i == p; } inline constexpr bool operator!=(pointer p) const { return i != p; } inline const_iterator &operator++() { ++i; return *this; } diff --git a/tests/auto/corelib/tools/qlist/CMakeLists.txt b/tests/auto/corelib/tools/qlist/CMakeLists.txt index 2a7fd3bc7dc..2f7b73266b0 100644 --- a/tests/auto/corelib/tools/qlist/CMakeLists.txt +++ b/tests/auto/corelib/tools/qlist/CMakeLists.txt @@ -18,6 +18,7 @@ qt_internal_add_test(tst_qlist QT_NO_STRICT_QLIST_ITERATORS # doesn't exist, except for this test LIBRARIES Qt::CorePrivate + Qt::TestPrivate ) qt_internal_add_test(tst_qlist_strict_iterators @@ -28,6 +29,7 @@ qt_internal_add_test(tst_qlist_strict_iterators tst_QList=tst_QList_strict_iterators LIBRARIES Qt::CorePrivate + Qt::TestPrivate ) ## Scopes: diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index cdd567f979d..b45d59211e2 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -6,13 +6,14 @@ # undef QT_STRICT_QLIST_ITERATORS # endif #endif +#include #include #include +#include #include #include -#include -#include +#include #include #include @@ -2616,10 +2617,23 @@ void tst_QList::iterators() const QCOMPARE(v.begin(), v.end()); QCOMPARE(v.rbegin(), v.rend()); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.end(), Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.rend(), Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(v.cbegin(), v.end(), Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(v.crbegin(), v.rend(), Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.cend(), Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.crend(), Qt::strong_ordering::equal); qsizetype idx = 0; for (; idx < 10; ++idx) v.push_back(idx); + QCOMPARE_LT(v.begin(), v.end()); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.rend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.cbegin(), v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.crbegin(), v.rend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.cend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.crend(), Qt::strong_ordering::less); // stl-style iterators idx = 0; @@ -2629,6 +2643,10 @@ void tst_QList::iterators() const std::advance(it, 7); idx += 7; + QT_TEST_ALL_COMPARISON_OPS(it, v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(it, v.cend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), it, Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.cbegin(), it, Qt::strong_ordering::less); QCOMPARE(*it, idx); // idx == 7 @@ -2765,8 +2783,19 @@ void tst_QList::constIterators() const QCOMPARE(constEmptyList.constBegin(), constEmptyList.cbegin()); QCOMPARE(constEmptyList.constEnd(), constEmptyList.cend()); QVERIFY(!constEmptyList.isDetached()); + QT_TEST_ALL_COMPARISON_OPS(constEmptyList.begin(), constEmptyList.end(), + Qt::strong_ordering::equal); + QT_TEST_ALL_COMPARISON_OPS(constEmptyList.rbegin(), constEmptyList.rend(), + Qt::strong_ordering::equal); const QList v { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + QCOMPARE_LT(v.begin(), v.end()); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.rend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.cbegin(), v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.crbegin(), v.rend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), v.cend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.rbegin(), v.crend(), Qt::strong_ordering::less); // stl-style iterators qsizetype idx = 0; @@ -2776,6 +2805,10 @@ void tst_QList::constIterators() const std::advance(it, 7); idx += 7; + QT_TEST_ALL_COMPARISON_OPS(it, v.end(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(it, v.cend(), Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.begin(), it, Qt::strong_ordering::less); + QT_TEST_ALL_COMPARISON_OPS(v.cbegin(), it, Qt::strong_ordering::less); QCOMPARE(*it, idx); // idx == 7