From 46ed4e47d2e9b94b5beaaf0ed4043e5c530976ec Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 24 Jun 2024 11:01:46 +0200 Subject: [PATCH] QJniArray: make iterator strongly ordered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Required for making the iterator random access. Implement compareThreeWay, add tests. Comparing iterators operating on different containers is undefined behavior, so assert if they don't match (even if they are different QJniArrays referencing the same Java array). Based on review comments. Task-number: QTBUG-126150 Change-Id: Ib3b94558fc66fb9cff19139d2110c6bbd4ac14b5 Reviewed-by: Soheil Armin Reviewed-by: Tor Arne Vestbø (cherry picked from commit d04f38f6f5e49a81211ab598ba23049dc4ef1507) Reviewed-by: Volker Hilsheimer --- src/corelib/kernel/qjniarray.h | 8 +++++++- .../auto/corelib/kernel/qjniarray/tst_qjniarray.cpp | 13 +++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 40b4f642878..998465273e1 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -78,7 +78,13 @@ private: Q_ASSERT(lhs.m_array == rhs.m_array); return lhs.m_index == rhs.m_index; } - Q_DECLARE_EQUALITY_COMPARABLE(QJniArrayIterator) + friend constexpr Qt::strong_ordering compareThreeWay(const QJniArrayIterator &lhs, + const QJniArrayIterator &rhs) + { + Q_ASSERT(lhs.m_array == rhs.m_array); + return Qt::compareThreeWay(lhs.m_index, rhs.m_index); + } + Q_DECLARE_STRONGLY_ORDERED(QJniArrayIterator) using VT = std::remove_const_t; friend class QJniArray; diff --git a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp index e1124bd0a51..4b1a7ba6e68 100644 --- a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp +++ b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp @@ -20,6 +20,7 @@ private slots: void invalidArraysAreEmpty(); void size(); void operators(); + void ordering(); void toContainer(); }; @@ -263,6 +264,18 @@ void tst_QJniArray::operators() } } +void tst_QJniArray::ordering() +{ + QByteArray bytes("abcde"); + QJniArray array(bytes); + + auto arrayBegin = array.begin(); + auto arrayEnd = array.end(); + QCOMPARE(arrayBegin, arrayBegin); + QCOMPARE_LT(arrayBegin, arrayEnd); + QCOMPARE_GT(arrayEnd, arrayBegin); +} + void tst_QJniArray::toContainer() { std::vector charVector{u'a', u'b', u'c'};