Write qHash functions for QDate, QTime and QDateTime.
authorMitch Curtis <mitch.curtis@nokia.com>
Thu, 28 Jun 2012 13:53:41 +0000 (15:53 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 11 Jul 2012 23:46:38 +0000 (01:46 +0200)
These functions didn't exist - this patch implements them.

Task-number: QTBUG-23079
Change-Id: I9eb6e238531d5cda878f5f2cdd27bab30aa60669
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/tools/qdatetime.cpp
src/corelib/tools/qdatetime.h
tests/auto/corelib/tools/qdate/tst_qdate.cpp
tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
tests/auto/corelib/tools/qtime/tst_qtime.cpp

index 6c3836e..4c3baa3 100644 (file)
@@ -4067,6 +4067,43 @@ QDebug operator<<(QDebug dbg, const QDateTime &date)
 }
 #endif
 
+/*! \fn uint qHash(const QDateTime &key, uint seed = 0)
+    \relates QHash
+    \since 5.0
+
+    Returns the hash value for the \a key, using \a seed to seed the calculation.
+*/
+uint qHash(const QDateTime &key, uint seed)
+{
+    // Use to toMSecsSinceEpoch instead of individual qHash functions for
+    // QDate/QTime/spec/offset because QDateTime::operator== converts both arguments
+    // to the same timezone. If we don't, qHash would return different hashes for
+    // two QDateTimes that are equivalent once converted to the same timezone.
+    return qHash(key.toMSecsSinceEpoch(), seed);
+}
+
+/*! \fn uint qHash(const QDate &key, uint seed = 0)
+    \relates QHash
+    \since 5.0
+
+    Returns the hash value for the \a key, using \a seed to seed the calculation.
+*/
+uint qHash(const QDate &key, uint seed)
+{
+    return qHash(key.toJulianDay(), seed);
+}
+
+/*! \fn uint qHash(const QTime &key, uint seed = 0)
+    \relates QHash
+    \since 5.0
+
+    Returns the hash value for the \a key, using \a seed to seed the calculation.
+*/
+uint qHash(const QTime &key, uint seed)
+{
+    return QTime(0, 0, 0, 0).msecsTo(key) ^ seed;
+}
+
 #ifndef QT_BOOTSTRAPPED
 
 /*!
index 83c5ed8..6880b7b 100644 (file)
@@ -288,6 +288,10 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QTime &);
 Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
 #endif
 
+Q_CORE_EXPORT uint qHash(const QDateTime &key, uint seed = 0);
+Q_CORE_EXPORT uint qHash(const QDate &key, uint seed = 0);
+Q_CORE_EXPORT uint qHash(const QTime &key, uint seed = 0);
+
 QT_END_NAMESPACE
 
 QT_END_HEADER
index bbb1990..e97025c 100644 (file)
@@ -712,6 +712,8 @@ void tst_QDate::operator_eq_eq()
     bool notEqual = d1 != d2;
     QCOMPARE(notEqual, !expectEqual);
 
+    if (equal)
+        QVERIFY(qHash(d1) == qHash(d2));
 }
 
 void tst_QDate::operator_lt()
index 17c3c5b..6327e73 100644 (file)
@@ -1212,7 +1212,10 @@ void tst_QDateTime::operator_eqeq()
     bool notEqual = dt1 != dt2;
     QCOMPARE(notEqual, !expectEqual);
 
-    if (checkEuro) {
+    if (equal)
+        QVERIFY(qHash(dt1) == qHash(dt2));
+
+    if (checkEuro && europeanTimeZone) {
         QVERIFY(dt1.toUTC() == dt2);
         QVERIFY(dt1 == dt2.toLocalTime());
     }
index 77fd89f..9a49dac 100644 (file)
@@ -370,6 +370,8 @@ void tst_QTime::operator_eq_eq()
     bool notEqual = t1 != t2;
     QCOMPARE(notEqual, !expectEqual);
 
+    if (equal)
+        QVERIFY(qHash(t1) == qHash(t2));
 }
 
 void tst_QTime::operator_lt()