diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-02-04 16:07:16 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-02-07 19:19:50 +0100 |
commit | 2145cdc54d5812793310f7e3b3709bfa2648bd50 (patch) | |
tree | 66ec56fd89185ac59ae83a3b1465c355028ca1b3 | |
parent | 78da102810067ea951990577ce7b6f722aafdeb9 (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.h | 36 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp | 48 |
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" |