Fix QMultiHash::keys(const T&) overload

The method was never tested, but it failed to compile after
QMultiHash was introduced as a separate class in 6.0.
This patch fixes it and adds some unit-tests to cover the case.

Task-number: QTBUG-91736
Pick-to: 6.2 6.1
Change-Id: I5dd989d4775efc6a9bb13c5ed1d892e499d95dc2
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Ivan Solovev 2021-07-07 14:22:13 +02:00
parent 15592ec4f7
commit a8bcf68a5e
2 changed files with 58 additions and 9 deletions

View File

@ -1458,7 +1458,7 @@ public:
QList<Key> res; QList<Key> res;
const_iterator i = begin(); const_iterator i = begin();
while (i != end()) { while (i != end()) {
if (i.value()->contains(value)) if (i.value() == value)
res.append(i.key()); res.append(i.key());
++i; ++i;
} }

View File

@ -44,6 +44,7 @@ private slots:
void erase(); void erase();
void erase_edge_case(); void erase_edge_case();
void key(); void key();
void keys();
void swap(); void swap();
void count(); // copied from tst_QMap void count(); // copied from tst_QMap
@ -620,6 +621,62 @@ void tst_QHash::key()
QCOMPARE(hash2.key("zero"), 0); QCOMPARE(hash2.key("zero"), 0);
QCOMPARE(hash2.key("zero", def), 0); QCOMPARE(hash2.key("zero", def), 0);
} }
{
const int def = -1;
QMultiHash<int, QString> hash;
QCOMPARE(hash.key("val"), 0);
QCOMPARE(hash.key("val", def), def);
QVERIFY(!hash.isDetached());
hash.insert(1, "value1");
hash.insert(1, "value2");
hash.insert(2, "value1");
QCOMPARE(hash.key("value2"), 1);
const auto key = hash.key("value1");
QVERIFY(key == 1 || key == 2);
QCOMPARE(hash.key("value"), 0);
QCOMPARE(hash.key("value", def), def);
}
}
template <typename T>
QList<T> sorted(const QList<T> &list)
{
QList<T> res = list;
std::sort(res.begin(), res.end());
return res;
}
void tst_QHash::keys()
{
{
QHash<QString, int> hash;
QVERIFY(hash.keys().isEmpty());
QVERIFY(hash.keys(1).isEmpty());
QVERIFY(!hash.isDetached());
hash.insert("key1", 1);
hash.insert("key2", 2);
hash.insert("key3", 1);
QCOMPARE(sorted(hash.keys()), QStringList({ "key1", "key2", "key3" }));
QCOMPARE(sorted(hash.keys(1)), QStringList({ "key1", "key3" }));
}
{
QMultiHash<QString, int> hash;
QVERIFY(hash.keys().isEmpty());
QVERIFY(hash.keys(1).isEmpty());
QVERIFY(!hash.isDetached());
hash.insert("key1", 1);
hash.insert("key2", 1);
hash.insert("key1", 2);
QCOMPARE(sorted(hash.keys()), QStringList({ "key1", "key1", "key2" }));
QCOMPARE(sorted(hash.keys(1)), QStringList({ "key1", "key2" }));
}
} }
void tst_QHash::swap() void tst_QHash::swap()
@ -1484,14 +1541,6 @@ void tst_QHash::qmultihash_qhash_rvalue_ref_unite()
} }
} }
template <typename T>
QList<T> sorted(const QList<T> &list)
{
QList<T> res = list;
std::sort(res.begin(), res.end());
return res;
}
void tst_QHash::keys_values_uniqueKeys() void tst_QHash::keys_values_uniqueKeys()
{ {
QMultiHash<QString, int> hash; QMultiHash<QString, int> hash;