Refactor QVersionNumber to use the public functions when possible

Use segmentCount() and segmentAt() instead of going to m_segments. This
is done in preparation for a major refactor of QVersionNumber that will
store the version numbers in the object itself, without QVector.

Change-Id: I03dbdee59a3c74c21a0a4e70c1bb9182250f6223
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
Thiago Macieira 2014-09-22 15:03:40 -07:00 committed by Keith Gardner
parent f337e22401
commit 287971eb7f
2 changed files with 39 additions and 31 deletions

View File

@ -208,8 +208,13 @@ QT_BEGIN_NAMESPACE
*/ */
bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW
{ {
return m_segments.size() <= other.m_segments.size() && if (segmentCount() > other.segmentCount())
std::equal(m_segments.begin(), m_segments.end(), other.m_segments.begin()); return false;
for (int i = 0; i < segmentCount(); ++i) {
if (segmentAt(i) != other.segmentAt(i))
return false;
}
return true;
} }
/*! /*!
@ -227,30 +232,24 @@ bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHRO
*/ */
int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW
{ {
QVector<int>::const_iterator i1 = v1.m_segments.constBegin(); int commonlen = qMin(v1.segmentCount(), v2.segmentCount());
const QVector<int>::const_iterator e1 = v1.m_segments.constEnd(); for (int i = 0; i < commonlen; ++i) {
QVector<int>::const_iterator i2 = v2.m_segments.constBegin(); if (v1.segmentAt(i) != v2.segmentAt(i))
const QVector<int>::const_iterator e2 = v2.m_segments.constEnd(); return v1.segmentAt(i) - v2.segmentAt(i);
while (i1 != e1 && i2 != e2) {
if (*i1 != *i2)
return (*i1 - *i2);
++i1;
++i2;
} }
// ran out of segments in v1 and/or v2 and need to check the first trailing // ran out of segments in v1 and/or v2 and need to check the first trailing
// segment to finish the compare // segment to finish the compare
if (i1 != e1) { if (v1.segmentCount() > commonlen) {
// v1 is longer // v1 is longer
if (*i1 != 0) if (v1.segmentAt(commonlen) != 0)
return *i1; return v1.segmentAt(commonlen);
else else
return 1; return 1;
} else if (i2 != e2) { } else if (v2.segmentCount() > commonlen) {
// v2 is longer // v2 is longer
if (*i2 != 0) if (v2.segmentAt(commonlen) != 0)
return -*i2; return -v2.segmentAt(commonlen);
else else
return -1; return -1;
} }
@ -270,13 +269,18 @@ int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2)
QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1, QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1,
const QVersionNumber &v2) const QVersionNumber &v2)
{ {
int min = qMin(v1.m_segments.size(), v2.m_segments.size()); int commonlen = qMin(v1.segmentCount(), v2.segmentCount());
QVector<int>::const_iterator i1 = v1.m_segments.begin(); int i;
QVector<int>::const_iterator e1; for (i = 0; i < commonlen; ++i) {
e1 = std::mismatch(i1, if (v1.segmentAt(i) != v2.segmentAt(i))
v1.m_segments.begin() + min, break;
v2.m_segments.begin()).first; }
return QVersionNumber(v1.m_segments.mid(0, e1 - i1));
if (i == 0)
return QVersionNumber();
// will use a vector
return QVersionNumber(v1.m_segments.mid(0, i));
} }
/*! /*!
@ -347,12 +351,12 @@ QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1,
QString QVersionNumber::toString() const QString QVersionNumber::toString() const
{ {
QString version; QString version;
version.reserve(qMax(m_segments.size() * 2 - 1, 0)); version.reserve(qMax(segmentCount() * 2 - 1, 0));
bool first = true; bool first = true;
for (QVector<int>::const_iterator it = m_segments.begin(), end = m_segments.end(); it != end; ++it) { for (int i = 0; i < segmentCount(); ++i) {
if (!first) if (!first)
version += QLatin1Char('.'); version += QLatin1Char('.');
version += QString::number(*it); version += QString::number(segmentAt(i));
first = false; first = false;
} }
return version; return version;
@ -465,7 +469,11 @@ QDebug operator<<(QDebug debug, const QVersionNumber &version)
*/ */
uint qHash(const QVersionNumber &key, uint seed) uint qHash(const QVersionNumber &key, uint seed)
{ {
return qHashRange(key.m_segments.begin(), key.m_segments.end(), seed); QtPrivate::QHashCombine hash;
for (int i = 0; i < key.segmentCount(); ++i)
seed = hash(seed, key.segmentAt(i));
return seed;
} }
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -83,10 +83,10 @@ public:
{ m_segments.reserve(3); m_segments << maj << min << mic; } { m_segments.reserve(3); m_segments << maj << min << mic; }
inline bool isNull() const Q_DECL_NOTHROW Q_REQUIRED_RESULT inline bool isNull() const Q_DECL_NOTHROW Q_REQUIRED_RESULT
{ return m_segments.isEmpty(); } { return segmentCount() == 0; }
inline bool isNormalized() const Q_DECL_NOTHROW Q_REQUIRED_RESULT inline bool isNormalized() const Q_DECL_NOTHROW Q_REQUIRED_RESULT
{ return isNull() || m_segments.last() != 0; } { return isNull() || segmentAt(segmentCount() - 1) != 0; }
inline int majorVersion() const Q_DECL_NOTHROW Q_REQUIRED_RESULT inline int majorVersion() const Q_DECL_NOTHROW Q_REQUIRED_RESULT
{ return segmentAt(0); } { return segmentAt(0); }