summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2021-07-26 16:40:07 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-07-27 15:05:00 +0000
commit5bc970570eac0551fec6c3c6e18eaaf28e6113ff (patch)
tree0c7ee6a09167b4ac5e2edec0b5b60d370c32cf4d
parent31865920e3fe4122403ceadb7178dc226034feb3 (diff)
downloadqtlocation-5bc970570eac0551fec6c3c6e18eaaf28e6113ff.tar.gz
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.cpp21
-rw-r--r--src/positioning/qgeoaddress.h2
-rw-r--r--tests/auto/qgeoaddress/tst_qgeoaddress.cpp83
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"