QJniArray: make reverse-iterable
Add rbeing/rend overload, relevant typedefs, and decrement operators. As a drive-by, add noexcept to begin/end functions. Found during header review. Task-number: QTBUG-119952 Change-Id: I32d9a7d50a1f03550944c2247516c455d4822fe7 Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit cc5251ed59ea6ecf0cc666ae5321be6de5383e90) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
7ff956c426
commit
0dbe271b9c
@ -31,7 +31,7 @@ struct QJniArrayIterator
|
|||||||
using pointer = T *;
|
using pointer = T *;
|
||||||
using reference = T; // difference to container requirements
|
using reference = T; // difference to container requirements
|
||||||
using const_reference = reference;
|
using const_reference = reference;
|
||||||
using iterator_category = std::forward_iterator_tag;
|
using iterator_category = std::bidirectional_iterator_tag;
|
||||||
|
|
||||||
friend bool operator==(const QJniArrayIterator &lhs, const QJniArrayIterator &rhs) noexcept
|
friend bool operator==(const QJniArrayIterator &lhs, const QJniArrayIterator &rhs) noexcept
|
||||||
{
|
{
|
||||||
@ -56,7 +56,17 @@ struct QJniArrayIterator
|
|||||||
++that;
|
++that;
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
friend QJniArrayIterator &operator--(QJniArrayIterator &that) noexcept
|
||||||
|
{
|
||||||
|
--that.m_index;
|
||||||
|
return that;
|
||||||
|
}
|
||||||
|
friend QJniArrayIterator operator--(QJniArrayIterator &that, int) noexcept
|
||||||
|
{
|
||||||
|
auto copy = that;
|
||||||
|
--that;
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
void swap(QJniArrayIterator &other) noexcept
|
void swap(QJniArrayIterator &other) noexcept
|
||||||
{
|
{
|
||||||
std::swap(m_index, other.m_index);
|
std::swap(m_index, other.m_index);
|
||||||
@ -190,6 +200,7 @@ public:
|
|||||||
|
|
||||||
// read-only container, so no iterator typedef
|
// read-only container, so no iterator typedef
|
||||||
using const_iterator = QJniArrayIterator<const T>;
|
using const_iterator = QJniArrayIterator<const T>;
|
||||||
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||||
|
|
||||||
QJniArray() = default;
|
QJniArray() = default;
|
||||||
explicit QJniArray(jarray array) : QJniArrayBase(array) {}
|
explicit QJniArray(jarray array) : QJniArrayBase(array) {}
|
||||||
@ -238,12 +249,17 @@ public:
|
|||||||
return object<jarray>();
|
return object<jarray>();
|
||||||
}
|
}
|
||||||
|
|
||||||
const_iterator begin() const { return {0, this}; }
|
const_iterator begin() const noexcept { return {0, this}; }
|
||||||
const_iterator constBegin() const { return begin(); }
|
const_iterator constBegin() const noexcept { return begin(); }
|
||||||
const_iterator cbegin() const { return begin(); }
|
const_iterator cbegin() const noexcept { return begin(); }
|
||||||
const_iterator end() const { return {size(), this}; }
|
const_iterator end() const noexcept { return {size(), this}; }
|
||||||
const_iterator constEnd() const { return {end()}; }
|
const_iterator constEnd() const noexcept { return {end()}; }
|
||||||
const_iterator cend() const { return {end()}; }
|
const_iterator cend() const noexcept { return {end()}; }
|
||||||
|
|
||||||
|
const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||||
|
const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
|
||||||
|
const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||||
|
const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
|
||||||
|
|
||||||
const_reference operator[](size_type i) const { return at(i); }
|
const_reference operator[](size_type i) const { return at(i); }
|
||||||
const_reference at(size_type i) const
|
const_reference at(size_type i) const
|
||||||
|
@ -103,6 +103,17 @@ void tst_QJniArray::operators()
|
|||||||
QCOMPARE(*it, 'e');
|
QCOMPARE(*it, 'e');
|
||||||
QCOMPARE(++it, array.end());
|
QCOMPARE(++it, array.end());
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
auto it = array.rbegin();
|
||||||
|
QCOMPARE(*it, 'e');
|
||||||
|
QCOMPARE(*++it, 'd');
|
||||||
|
QCOMPARE(*it++, 'd');
|
||||||
|
QCOMPARE(*it, 'c');
|
||||||
|
++it;
|
||||||
|
it++;
|
||||||
|
QCOMPARE(*it, 'a');
|
||||||
|
QCOMPARE(++it, array.rend());
|
||||||
|
}
|
||||||
{
|
{
|
||||||
QJniArray<jbyte>::const_iterator it = {};
|
QJniArray<jbyte>::const_iterator it = {};
|
||||||
QCOMPARE(it, QJniArray<jbyte>::const_iterator{});
|
QCOMPARE(it, QJniArray<jbyte>::const_iterator{});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user