diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2021-07-26 16:40:07 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-07-27 15:05:00 +0000 |
commit | 5bc970570eac0551fec6c3c6e18eaaf28e6113ff (patch) | |
tree | 0c7ee6a09167b4ac5e2edec0b5b60d370c32cf4d | |
parent | 31865920e3fe4122403ceadb7178dc226034feb3 (diff) |
QGeoAddress: add qHash overload
Task-number: QTBUG-95163
Change-Id: I837faa1ae9ebcfb0fba170dbfcc0dbd5be2d8fc2
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
(cherry picked from commit 0340246d54f8fa402e97c31ad04c16e8f92fdbc0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/positioning/qgeoaddress.cpp | 21 | ||||
-rw-r--r-- | src/positioning/qgeoaddress.h | 2 | ||||
-rw-r--r-- | tests/auto/qgeoaddress/tst_qgeoaddress.cpp | 83 |
3 files changed, 105 insertions, 1 deletions
diff --git a/src/positioning/qgeoaddress.cpp b/src/positioning/qgeoaddress.cpp index 17c5baed..3870dbf0 100644 --- a/src/positioning/qgeoaddress.cpp +++ b/src/positioning/qgeoaddress.cpp @@ -753,5 +753,24 @@ bool QGeoAddress::equals(const QGeoAddress &lhs, const QGeoAddress &rhs) lhs.text() == rhs.text(); } -QT_END_NAMESPACE +/*! + \relates QGeoAddress + + Returns the hash value for the \a address, using \a seed for the + calculation. +*/ +size_t qHash(const QGeoAddress &address, size_t seed) noexcept +{ + size_t hash = qHashMulti(seed, address.country(), address.countryCode(), address.state(), + address.county(), address.city(), address.district(), + address.street(), address.streetNumber(), address.postalCode()); + + // If the text is generated from all fields, there is no need to use the + // resulting string in the hash. However, when the text is specified + // explicitly, we need to use it as well. + if (!address.isTextGenerated()) + hash = qHashMulti(seed, hash, address.text()); + return hash; +} +QT_END_NAMESPACE diff --git a/src/positioning/qgeoaddress.h b/src/positioning/qgeoaddress.h index 973d40fa..703a808d 100644 --- a/src/positioning/qgeoaddress.h +++ b/src/positioning/qgeoaddress.h @@ -112,6 +112,8 @@ private: QSharedDataPointer<QGeoAddressPrivate> d; }; +Q_POSITIONING_EXPORT size_t qHash(const QGeoAddress &address, size_t seed = 0) noexcept; + Q_DECLARE_SHARED(QGeoAddress) QT_END_NAMESPACE diff --git a/tests/auto/qgeoaddress/tst_qgeoaddress.cpp b/tests/auto/qgeoaddress/tst_qgeoaddress.cpp index 1d7918c6..0dd06e97 100644 --- a/tests/auto/qgeoaddress/tst_qgeoaddress.cpp +++ b/tests/auto/qgeoaddress/tst_qgeoaddress.cpp @@ -58,6 +58,8 @@ private Q_SLOTS: void generatedText_data(); void operatorsTest(); void emptyClearTest(); + void hashingTest(); + void hashingTest_data(); }; tst_QGeoAddress::tst_QGeoAddress() @@ -559,6 +561,87 @@ void tst_QGeoAddress::emptyClearTest() QVERIFY(testObj.isEmpty()); } +void tst_QGeoAddress::hashingTest() +{ + QFETCH(QGeoAddress, leftAddress); + QFETCH(QGeoAddress, rightAddress); + QFETCH(bool, result); + + const size_t leftHash = qHash(leftAddress); + const size_t rightHash = qHash(rightAddress); + QCOMPARE(leftHash == rightHash, result); +} + +void tst_QGeoAddress::hashingTest_data() +{ + QTest::addColumn<QGeoAddress>("leftAddress"); + QTest::addColumn<QGeoAddress>("rightAddress"); + QTest::addColumn<bool>("result"); + + QGeoAddress leftAddress; + QGeoAddress rightAddress; + + QTest::newRow("empty") << leftAddress << rightAddress << true; + // country + leftAddress.setCountry("country"); + QTest::newRow("different country") << leftAddress << rightAddress << false; + rightAddress.setCountry("country"); + QTest::newRow("same country") << leftAddress << rightAddress << true; + // country code + leftAddress.setCountryCode("country code"); + QTest::newRow("different code") << leftAddress << rightAddress << false; + rightAddress.setCountryCode("country code"); + QTest::newRow("same code") << leftAddress << rightAddress << true; + // state + leftAddress.setState("state"); + QTest::newRow("different state") << leftAddress << rightAddress << false; + rightAddress.setState("state"); + QTest::newRow("same state") << leftAddress << rightAddress << true; + // county + leftAddress.setCounty("county"); + QTest::newRow("different county") << leftAddress << rightAddress << false; + rightAddress.setCounty("county"); + QTest::newRow("same county") << leftAddress << rightAddress << true; + // city + leftAddress.setCity("city"); + QTest::newRow("different city") << leftAddress << rightAddress << false; + rightAddress.setCity("city"); + QTest::newRow("same city") << leftAddress << rightAddress << true; + // district + leftAddress.setDistrict("district"); + QTest::newRow("different district") << leftAddress << rightAddress << false; + rightAddress.setDistrict("district"); + QTest::newRow("same district") << leftAddress << rightAddress << true; + // street + leftAddress.setStreet("street"); + QTest::newRow("different street") << leftAddress << rightAddress << false; + rightAddress.setStreet("street"); + QTest::newRow("same street") << leftAddress << rightAddress << true; + // street number + leftAddress.setStreetNumber("number"); + QTest::newRow("different number") << leftAddress << rightAddress << false; + rightAddress.setStreetNumber("number"); + QTest::newRow("same number") << leftAddress << rightAddress << true; + // postal code + leftAddress.setPostalCode("postal code"); + QTest::newRow("different postcode") << leftAddress << rightAddress << false; + rightAddress.setPostalCode("postal code"); + QTest::newRow("same postcode") << leftAddress << rightAddress << true; + // custom text + leftAddress.setText("some custom text"); + QTest::newRow("different custom text") << leftAddress << rightAddress << false; + rightAddress.setText("some custom text"); + QTest::newRow("same custom text") << leftAddress << rightAddress << true; + + // empty with custom text + leftAddress.clear(); + leftAddress.setText("some custom text"); + rightAddress.clear(); + QTest::newRow("empty with different custom text") << leftAddress << rightAddress << false; + rightAddress.setText("some custom text"); + QTest::newRow("empty with same custom text") << leftAddress << rightAddress << true; +} + QTEST_APPLESS_MAIN(tst_QGeoAddress) #include "tst_qgeoaddress.moc" |