diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index a88e8b3b5b4..3f4968361dc 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -25,6 +25,15 @@ template class QJniArray; template struct QJniArrayIterator { +private: + // Since QJniArray doesn't hold values, we need a wrapper to be able to hand + // out a pointer to a value. + struct QJniArrayValueRef { + T ref; + const T *operator->() const { return &ref; } + }; + +public: QJniArrayIterator() = default; constexpr QJniArrayIterator(const QJniArrayIterator &other) noexcept = default; @@ -34,7 +43,7 @@ struct QJniArrayIterator using difference_type = jsize; using value_type = T; - using pointer = T *; + using pointer = QJniArrayValueRef; using reference = T; // difference to container requirements using const_reference = reference; using iterator_category = std::random_access_iterator_tag; @@ -44,6 +53,11 @@ struct QJniArrayIterator return m_array->at(m_index); } + QJniArrayValueRef operator->() const + { + return {m_array->at(m_index)}; + } + const_reference operator[](difference_type n) const { return m_array->at(m_index + n); diff --git a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp index 8425448e79a..6598679e159 100644 --- a/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp +++ b/tests/auto/corelib/kernel/qjniarray/tst_qjniarray.cpp @@ -22,6 +22,7 @@ private slots: void operators(); void ordering(); void toContainer(); + void pointerToValue(); }; using namespace QtJniTypes; @@ -308,6 +309,15 @@ void tst_QJniArray::toContainer() QCOMPARE(charArray.toContainer>(), charVector); } +void tst_QJniArray::pointerToValue() +{ + const QJniArray stringArray{u"one"_s, u"two"_s, u"three"_s}; + auto it = std::find(stringArray.begin(), stringArray.end(), u"two"_s); + QCOMPARE_NE(it, stringArray.end()); + QCOMPARE(it->size(), 3); + QCOMPARE((++it)->size(), 5); +} + QTEST_MAIN(tst_QJniArray) #include "tst_qjniarray.moc"