diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2016-03-01 14:07:24 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2016-03-02 09:26:47 +0000 |
commit | 3a079a1e6761f3a26223e360d22530f22b5aeade (patch) | |
tree | 3f97878218a5645a5f7ee836419ba2936028d7a9 | |
parent | a6ce801018a4254efeab000efa2457317270939b (diff) | |
download | qtlocation-3a079a1e6761f3a26223e360d22530f22b5aeade.tar.gz |
Add hash function for QGeoCoordinate
[ChangeLog][QtPositioning][General] Added qHash(QGeoCoordinate()).
Task-number: QTBUG-51404
Change-Id: I02c6dc0a5399ebf3181b34ffa58a82a2119118a0
Reviewed-by: Paolo Angelelli <paolo.angelelli@theqtcompany.com>
Reviewed-by: Michal Klocek <michal.klocek@theqtcompany.com>
-rw-r--r-- | src/positioning/qgeocoordinate.cpp | 17 | ||||
-rw-r--r-- | src/positioning/qgeocoordinate.h | 2 | ||||
-rw-r--r-- | tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp | 40 |
3 files changed, 59 insertions, 0 deletions
diff --git a/src/positioning/qgeocoordinate.cpp b/src/positioning/qgeocoordinate.cpp index c71422ca..f28e1865 100644 --- a/src/positioning/qgeocoordinate.cpp +++ b/src/positioning/qgeocoordinate.cpp @@ -762,4 +762,21 @@ QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate) } #endif +/*! \fn uint qHash(const QGeoCoordinate &coordinate, uint seed = 0) + \relates QHash + \since Qt 5.7 + + Returns a hash value for \a coordinate, using \a seed to seed the calculation. +*/ +uint qHash(const QGeoCoordinate &coordinate, uint seed) +{ + QtPrivate::QHashCombine hash; + // north and south pole are geographically equivalent (no matter the longitude) + if (coordinate.latitude() != 90.0 && coordinate.latitude() != -90.0) + seed = hash(seed, coordinate.longitude()); + seed = hash(seed, coordinate.latitude()); + seed = hash(seed, coordinate.altitude()); + return seed; +} + QT_END_NAMESPACE diff --git a/src/positioning/qgeocoordinate.h b/src/positioning/qgeocoordinate.h index 7b7a4c1f..ddb6274e 100644 --- a/src/positioning/qgeocoordinate.h +++ b/src/positioning/qgeocoordinate.h @@ -122,6 +122,8 @@ Q_DECLARE_TYPEINFO(QGeoCoordinate, Q_MOVABLE_TYPE); Q_POSITIONING_EXPORT QDebug operator<<(QDebug, const QGeoCoordinate &); #endif +Q_POSITIONING_EXPORT uint qHash(const QGeoCoordinate &coordinate, uint seed = 0); + #ifndef QT_NO_DATASTREAM Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate); Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate); diff --git a/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp b/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp index 388bf65a..413fa071 100644 --- a/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp +++ b/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp @@ -900,6 +900,46 @@ private slots: QTest::newRow("initialized with altitude") << QGeoCoordinate(1,2,3) << 45 << QByteArray("QGeoCoordinate(1, 2, 3) 45"); } + + void hash() + { + uint s1 = qHash(QGeoCoordinate(1, 1, 2)); + uint s2 = qHash(QGeoCoordinate(2, 1, 1)); + uint s3 = qHash(QGeoCoordinate(1, 2, 1)); + uint s10 = qHash(QGeoCoordinate(0, 0, 2)); + uint s20 = qHash(QGeoCoordinate(2, 0, 0)); + uint s30 = qHash(QGeoCoordinate(0, 2, 0)); + uint s30NoAlt = qHash(QGeoCoordinate(0, 2)); + uint s30WithSeed = qHash(QGeoCoordinate(0, 2, 0), 1); + uint nullCoordinate = qHash(QGeoCoordinate()); + + uint north1 = qHash(QGeoCoordinate(90.0, 34.7, 0)); + uint north2 = qHash(QGeoCoordinate(90.0, 180, 0)); + + uint south1 = qHash(QGeoCoordinate(90.0, 67.7, 34.0)); + uint south2 = qHash(QGeoCoordinate(90.0, 111, 34.0)); + + QVERIFY(s1 != s2); + QVERIFY(s2 != s3); + QVERIFY(s1 != s3); + QVERIFY(s10 != s20); + QVERIFY(s20 != s30); + QVERIFY(s10 != s30); + QVERIFY(s30NoAlt != s30); + QVERIFY(s30WithSeed != s30); + + QVERIFY(nullCoordinate != s1); + QVERIFY(nullCoordinate != s2); + QVERIFY(nullCoordinate != s3); + QVERIFY(nullCoordinate != s10); + QVERIFY(nullCoordinate != s20); + QVERIFY(nullCoordinate != s30); + QVERIFY(nullCoordinate != s30NoAlt); + QVERIFY(nullCoordinate != s30WithSeed); + + QVERIFY(north1 == north2); + QVERIFY(south1 == south2); + } }; QTEST_GUILESS_MAIN(tst_QGeoCoordinate) |