summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@theqtcompany.com>2016-03-01 14:07:24 +0100
committerAlex Blasche <alexander.blasche@theqtcompany.com>2016-03-02 09:26:47 +0000
commit3a079a1e6761f3a26223e360d22530f22b5aeade (patch)
tree3f97878218a5645a5f7ee836419ba2936028d7a9
parenta6ce801018a4254efeab000efa2457317270939b (diff)
downloadqtlocation-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.cpp17
-rw-r--r--src/positioning/qgeocoordinate.h2
-rw-r--r--tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp40
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)