summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-02-04 16:07:16 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-02-07 19:19:50 +0100
commit2145cdc54d5812793310f7e3b3709bfa2648bd50 (patch)
tree66ec56fd89185ac59ae83a3b1465c355028ca1b3
parent78da102810067ea951990577ce7b6f722aafdeb9 (diff)
Core: Provide comparison functions for QTypeRevision
The unspecified segment is between 0 and 1. This is because QTypeRevision::zero(), as the default revisision needs to be smaller than any other. At the same time we want explicitly specified non-zero revisions to be larger than unspecified ones. Breaking this down on a per segment level gives us the order shown here. Change-Id: I1cca12f1180eb6f77563fb5b22c3400e118dc5e9 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/corelib/tools/qversionnumber.h36
-rw-r--r--tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp48
2 files changed, 78 insertions, 6 deletions
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index 16058bd04a..03a27548b8 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -416,6 +416,42 @@ inline constexpr bool operator!=(QTypeRevision lhs, QTypeRevision rhs)
return lhs.toEncodedVersion<quint16>() != rhs.toEncodedVersion<quint16>();
}
+inline constexpr bool operator<(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return (!lhs.hasMajorVersion() && rhs.hasMajorVersion())
+ // non-0 major > unspecified major > major 0
+ ? rhs.majorVersion() != 0
+ : ((lhs.hasMajorVersion() && !rhs.hasMajorVersion())
+ // major 0 < unspecified major < non-0 major
+ ? lhs.majorVersion() == 0
+ : (lhs.majorVersion() != rhs.majorVersion()
+ // both majors specified and non-0
+ ? lhs.majorVersion() < rhs.majorVersion()
+ : ((!lhs.hasMinorVersion() && rhs.hasMinorVersion())
+ // non-0 minor > unspecified minor > minor 0
+ ? rhs.minorVersion() != 0
+ : ((lhs.hasMinorVersion() && !rhs.hasMinorVersion())
+ // minor 0 < unspecified minor < non-0 minor
+ ? lhs.minorVersion() == 0
+ // both minors specified and non-0
+ : lhs.minorVersion() < rhs.minorVersion()))));
+}
+
+inline constexpr bool operator>(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs != rhs && !(lhs < rhs);
+}
+
+inline constexpr bool operator<=(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs == rhs || lhs < rhs;
+}
+
+inline constexpr bool operator>=(QTypeRevision lhs, QTypeRevision rhs)
+{
+ return lhs == rhs || !(lhs < rhs);
+}
+
Q_STATIC_ASSERT(sizeof(QTypeRevision) == 2);
Q_DECLARE_TYPEINFO(QTypeRevision, Q_MOVABLE_TYPE);
diff --git a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
index 63a6618dab..928bd365fd 100644
--- a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
+++ b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
@@ -81,9 +81,10 @@ private slots:
void serialize();
void moveSemantics();
void qtVersion();
- void qPropertyRevision_data();
- void qPropertyRevision();
- void qPropertyRevisionTypes();
+ void qTypeRevision_data();
+ void qTypeRevision();
+ void qTypeRevisionTypes();
+ void qTypeRevisionComparison();
};
void tst_QVersionNumber::singleInstanceData()
@@ -704,7 +705,7 @@ void compileTestRevision<qint8>()
compileTestRevisionMajorMinor<qint8>();
}
-void tst_QVersionNumber::qPropertyRevision_data()
+void tst_QVersionNumber::qTypeRevision_data()
{
QTest::addColumn<QTypeRevision>("revision");
QTest::addColumn<bool>("valid");
@@ -723,7 +724,7 @@ void tst_QVersionNumber::qPropertyRevision_data()
// You must not pass them as major or minor versions, or values.
}
-void tst_QVersionNumber::qPropertyRevision()
+void tst_QVersionNumber::qTypeRevision()
{
const QTypeRevision other = QTypeRevision::fromVersion(127, 128);
@@ -747,7 +748,7 @@ void tst_QVersionNumber::qPropertyRevision()
QVERIFY(copy != other);
}
-void tst_QVersionNumber::qPropertyRevisionTypes()
+void tst_QVersionNumber::qTypeRevisionTypes()
{
compileTestRevision<quint64>();
compileTestRevision<qint64>();
@@ -760,6 +761,41 @@ void tst_QVersionNumber::qPropertyRevisionTypes()
QVERIFY(maxRevision.hasMinorVersion());
}
+void tst_QVersionNumber::qTypeRevisionComparison()
+{
+ const QTypeRevision revisions[] = {
+ QTypeRevision::zero(),
+ QTypeRevision::fromMajorVersion(0),
+ QTypeRevision::fromVersion(0, 1),
+ QTypeRevision::fromVersion(0, 20),
+ QTypeRevision::fromMinorVersion(0),
+ QTypeRevision(),
+ QTypeRevision::fromMinorVersion(1),
+ QTypeRevision::fromMinorVersion(20),
+ QTypeRevision::fromVersion(1, 0),
+ QTypeRevision::fromMajorVersion(1),
+ QTypeRevision::fromVersion(1, 1),
+ QTypeRevision::fromVersion(1, 20),
+ QTypeRevision::fromVersion(20, 0),
+ QTypeRevision::fromMajorVersion(20),
+ QTypeRevision::fromVersion(20, 1),
+ QTypeRevision::fromVersion(20, 20),
+ };
+
+ const int length = sizeof(revisions) / sizeof(QTypeRevision);
+
+ for (int i = 0; i < length; ++i) {
+ for (int j = 0; j < length; ++j) {
+ QCOMPARE(revisions[i] == revisions[j], i == j);
+ QCOMPARE(revisions[i] != revisions[j], i != j);
+ QCOMPARE(revisions[i] < revisions[j], i < j);
+ QCOMPARE(revisions[i] > revisions[j], i > j);
+ QCOMPARE(revisions[i] <= revisions[j], i <= j);
+ QCOMPARE(revisions[i] >= revisions[j], i >= j);
+ }
+ }
+}
+
QTEST_APPLESS_MAIN(tst_QVersionNumber)
#include "tst_qversionnumber.moc"