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>
This commit is contained in:
parent
78da102810
commit
2145cdc54d
@ -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);
|
||||
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user