MetaType: Fix operator{++,--}(int) with the type-erased const_iterators.

Similar to commit 8b062418 (MetaType: Fix operator{+,-}(int)
with the type-erased const_iterators., 2013-09-11), explicitly
create a copy of the iterator and intialise it.

Change-Id: I8b9edef40ca00c826f72768cba4a0992e55371f8
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
bb10
Stephen Kelly 2013-09-16 15:39:10 +02:00 committed by The Qt Project
parent bcb68461c9
commit 2af188c6d0
2 changed files with 34 additions and 4 deletions

View File

@ -610,9 +610,9 @@ public:
inline bool operator==(const const_iterator &o) const { return m_impl.equal(o.m_impl); }
inline bool operator!=(const const_iterator &o) const { return !m_impl.equal(o.m_impl); }
inline const_iterator &operator++() { m_impl.advance(1); return *this; }
inline const_iterator operator++(int) { QtMetaTypePrivate::QSequentialIterableImpl impl = m_impl; m_impl.advance(1); return const_iterator(impl, this->ref); }
inline const_iterator operator++(int) { QtMetaTypePrivate::QSequentialIterableImpl impl; impl.copy(m_impl); m_impl.advance(1); return const_iterator(impl, new QAtomicInt(0)); }
inline const_iterator &operator--() { m_impl.advance(-1); return *this; }
inline const_iterator operator--(int) { QtMetaTypePrivate::QSequentialIterableImpl impl = m_impl; m_impl.advance(-1); return const_iterator(impl, this->ref); }
inline const_iterator operator--(int) { QtMetaTypePrivate::QSequentialIterableImpl impl; impl.copy(m_impl); m_impl.advance(-1); return const_iterator(impl, new QAtomicInt(0)); }
inline const_iterator &operator+=(int j) { m_impl.advance(j); return *this; }
inline const_iterator &operator-=(int j) { m_impl.advance(-j); return *this; }
inline const_iterator operator+(int j) const { QtMetaTypePrivate::QSequentialIterableImpl impl; impl.copy(m_impl); impl.advance(j); return const_iterator(impl, new QAtomicInt(0)); }
@ -695,9 +695,9 @@ public:
inline bool operator==(const const_iterator &o) const { return m_impl.equal(o.m_impl); }
inline bool operator!=(const const_iterator &o) const { return !m_impl.equal(o.m_impl); }
inline const_iterator &operator++() { m_impl.advance(1); return *this; }
inline const_iterator operator++(int) { QtMetaTypePrivate::QAssociativeIterableImpl impl = m_impl; m_impl.advance(1); return const_iterator(impl, this->ref); }
inline const_iterator operator++(int) { QtMetaTypePrivate::QAssociativeIterableImpl impl; impl.copy(m_impl); m_impl.advance(1); return const_iterator(impl, new QAtomicInt(0)); }
inline const_iterator &operator--() { m_impl.advance(-1); return *this; }
inline const_iterator operator--(int) { QtMetaTypePrivate::QAssociativeIterableImpl impl = m_impl; m_impl.advance(-1); return const_iterator(impl, this->ref); }
inline const_iterator operator--(int) { QtMetaTypePrivate::QAssociativeIterableImpl impl; impl.copy(m_impl); m_impl.advance(-1); return const_iterator(impl, new QAtomicInt(0)); }
inline const_iterator &operator+=(int j) { m_impl.advance(j); return *this; }
inline const_iterator &operator-=(int j) { m_impl.advance(-j); return *this; }
inline const_iterator operator+(int j) const { QtMetaTypePrivate::QAssociativeIterableImpl impl; impl.copy(m_impl); impl.advance(j); return const_iterator(impl, new QAtomicInt(0)); }

View File

@ -3831,6 +3831,19 @@ void tst_QVariant::iterateContainerElements()
QCOMPARE(ints.at(i), *it);
}
}
{
QVariantList ints;
ints << 1 << 2 << 3;
QVariant var = QVariant::fromValue(ints);
QSequentialIterable iter = var.value<QSequentialIterable>();
QSequentialIterable::const_iterator it = iter.begin();
QVariantList intsCopy;
intsCopy << *(it++);
intsCopy << *(it++);
intsCopy << *(it++);
QCOMPARE(ints, intsCopy);
}
#define TEST_ASSOCIATIVE_ITERATION(CONTAINER, KEY_TYPE, MAPPED_TYPE) \
{ \
@ -3882,6 +3895,23 @@ void tst_QVariant::iterateContainerElements()
QCOMPARE(*(mapping.begin() + i), (*it).toString());
}
}
{
QVariantList nums;
nums << "one" << "two" << "three";
QMap<int, QString> mapping;
mapping.insert(1, "one");
mapping.insert(2, "two");
mapping.insert(3, "three");
QVariant var = QVariant::fromValue(mapping);
QAssociativeIterable iter = var.value<QAssociativeIterable>();
QAssociativeIterable::const_iterator it = iter.begin();
QVariantList numsCopy;
numsCopy << *(it++);
numsCopy << *(it++);
numsCopy << *(it++);
QCOMPARE(nums, numsCopy);
}
}
void tst_QVariant::pairElements()