ContainerApiSymmetry: verify Qt containers member erase returns iterator
For QSet, the key_type is const, so can't test assiging to it. Change-Id: I9d363ef3fe52646b937d6a422227b19c48fdaf1f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit 93f54f0aa44467da1ea7ef7bcb01e891c619c8f5) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
c1bbd4e442
commit
d95b21706f
@ -354,6 +354,15 @@ private:
|
|||||||
template <typename Container>
|
template <typename Container>
|
||||||
void erase_if_associative_impl() const;
|
void erase_if_associative_impl() const;
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void member_erase_impl() const;
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void member_erase_associative_impl() const;
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void member_erase_set_impl() const;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void erase_QList() { erase_impl<QList<int>>(); }
|
void erase_QList() { erase_impl<QList<int>>(); }
|
||||||
void erase_QVarLengthArray() { erase_impl<QVarLengthArray<int>>(); }
|
void erase_QVarLengthArray() { erase_impl<QVarLengthArray<int>>(); }
|
||||||
@ -380,6 +389,17 @@ private Q_SLOTS:
|
|||||||
void erase_if_QHash() { erase_if_associative_impl<QHash<int, int>>(); }
|
void erase_if_QHash() { erase_if_associative_impl<QHash<int, int>>(); }
|
||||||
void erase_if_QMultiHash() { erase_if_associative_impl<QMultiHash<int, int>>(); }
|
void erase_if_QMultiHash() { erase_if_associative_impl<QMultiHash<int, int>>(); }
|
||||||
|
|
||||||
|
void member_erase_QList() { member_erase_impl<QList<int>>(); }
|
||||||
|
void member_erase_QVarLengthArray() { member_erase_impl<QVarLengthArray<int>>(); }
|
||||||
|
void member_erase_QString() { member_erase_impl<QString>(); }
|
||||||
|
void member_erase_QByteArray() { member_erase_impl<QByteArray>(); }
|
||||||
|
void member_erase_QSet() { member_erase_set_impl<QSet<int>>(); }
|
||||||
|
|
||||||
|
void member_erase_QMap() { member_erase_associative_impl<QMap<int, int>>(); }
|
||||||
|
void member_erase_QMultiMap() {member_erase_associative_impl<QMultiMap<int, int>>(); }
|
||||||
|
void member_erase_QHash() { member_erase_associative_impl<QHash<int, int>>(); }
|
||||||
|
void member_erase_QMultiHash() { member_erase_associative_impl<QMultiHash<int, int>>(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
void keyValueRange_impl() const;
|
void keyValueRange_impl() const;
|
||||||
@ -873,6 +893,65 @@ void tst_ContainerApiSymmetry::erase_if_associative_impl() const
|
|||||||
QCOMPARE(c.size(), S(0));
|
QCOMPARE(c.size(), S(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void tst_ContainerApiSymmetry::member_erase_impl() const
|
||||||
|
{
|
||||||
|
using S = typename Container::size_type;
|
||||||
|
using V = typename Container::value_type;
|
||||||
|
const S size = 7;
|
||||||
|
auto c = make<Container>(size); // {1, 2, 3, 4, 5, 6, 7}
|
||||||
|
QCOMPARE(c.size(), size);
|
||||||
|
|
||||||
|
auto copy = c;
|
||||||
|
// Container::erase() returns an iterator, not const_iterator
|
||||||
|
auto it = c.erase(c.cbegin(), c.cbegin());
|
||||||
|
static_assert(std::is_same_v<decltype(it), typename Container::iterator>);
|
||||||
|
QCOMPARE(c.size(), size);
|
||||||
|
const V newVal{100};
|
||||||
|
QCOMPARE_NE(*it, newVal);
|
||||||
|
*it = newVal;
|
||||||
|
QCOMPARE(it, c.cbegin());
|
||||||
|
QCOMPARE(*c.cbegin(), newVal);
|
||||||
|
|
||||||
|
QCOMPARE(std::find(copy.cbegin(), copy.cend(), newVal), copy.cend());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void tst_ContainerApiSymmetry::member_erase_associative_impl() const
|
||||||
|
{
|
||||||
|
using S = typename Container::size_type;
|
||||||
|
using V = typename Container::mapped_type;
|
||||||
|
|
||||||
|
const S size = 20;
|
||||||
|
auto c = makeAssociative<Container>(size);
|
||||||
|
QCOMPARE(c.size(), size);
|
||||||
|
|
||||||
|
// Verify Container::erase() returns iterator, not const_iterator
|
||||||
|
auto it = c.erase(c.cbegin());
|
||||||
|
static_assert(std::is_same_v<decltype(it), typename Container::iterator>);
|
||||||
|
QCOMPARE(c.size(), size - 1);
|
||||||
|
QCOMPARE(it, c.cbegin());
|
||||||
|
const auto current = it.value();
|
||||||
|
it.value() = current + V(5);
|
||||||
|
QCOMPARE(c.cbegin().value(),current + V(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void tst_ContainerApiSymmetry::member_erase_set_impl() const
|
||||||
|
{
|
||||||
|
using S = typename Container::size_type;
|
||||||
|
|
||||||
|
const S size = 20;
|
||||||
|
auto c = make<Container>(size);
|
||||||
|
QCOMPARE(c.size(), size);
|
||||||
|
|
||||||
|
// Verify Container::erase() returns iterator, not const_iterator
|
||||||
|
auto it = c.erase(c.cbegin());
|
||||||
|
static_assert(std::is_same_v<decltype(it), typename Container::iterator>);
|
||||||
|
QCOMPARE(c.size(), size - 1);
|
||||||
|
QCOMPARE(it, c.cbegin());
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
void tst_ContainerApiSymmetry::keyValueRange_impl() const
|
void tst_ContainerApiSymmetry::keyValueRange_impl() const
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user