summaryrefslogtreecommitdiffstats
path: root/src/corelib/global
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/global')
-rw-r--r--src/corelib/global/qoperatingsystemversion.cpp83
-rw-r--r--src/corelib/global/qoperatingsystemversion.h47
2 files changed, 64 insertions, 66 deletions
diff --git a/src/corelib/global/qoperatingsystemversion.cpp b/src/corelib/global/qoperatingsystemversion.cpp
index 8b8f47575d..0cfc70a790 100644
--- a/src/corelib/global/qoperatingsystemversion.cpp
+++ b/src/corelib/global/qoperatingsystemversion.cpp
@@ -98,6 +98,33 @@ QT_BEGIN_NAMESPACE
GetVersionEx that hides the real version number if the
application is not manifested for that version of the OS
\endtable
+
+ Because QOperatingSystemVersion stores both a version number and an OS type, the OS type
+ can be taken into account when performing comparisons. For example, on a macOS system running
+ macOS Sierra (v10.12), the following expression will return \c false even though the
+ major version number component of the object on the left hand side of the expression (10) is
+ greater than that of the object on the right (9):
+
+ \code
+ QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 9)
+ \endcode
+
+ This allows expressions for multiple operating systems to be joined with a logical OR operator
+ and still work as expected. For example:
+
+ \code
+ auto current = QOperatingSystemVersion::current();
+ if (current >= QOperatingSystemVersion::OSXYosemite ||
+ current >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) {
+ // returns true on macOS >= 10.10 and iOS >= 8.0, but false on macOS < 10.10 and iOS < 8.0
+ }
+ \encode
+
+ A more naive comparison algorithm might incorrectly return true on all versions of macOS,
+ including Mac OS 9. This behavior is achieved by overloading the comparison operators to return
+ \c false whenever the OS types of the QOperatingSystemVersion instances being compared do not
+ match. Be aware that due to this it can be the case \c x >= y and \c x < y are BOTH \c false
+ for the same instances of \c x and \c y.
*/
/*!
@@ -111,7 +138,7 @@ QT_BEGIN_NAMESPACE
\value MacOS The Apple macOS operating system.
\value TvOS The Apple tvOS operating system.
\value WatchOS The Apple watchOS operating system.
- \value Windows The Microsoft Windows operating system (in both Win32 and WinRT environments).
+ \value Windows The Microsoft Windows operating system.
\value Unknown An unknown or unsupported operating system.
*/
@@ -200,21 +227,6 @@ static inline int compareVersionComponents(int lhs, int rhs)
return lhs >= 0 && rhs >= 0 ? lhs - rhs : 0;
}
-/*!
- \fn int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
- const QOperatingSystemVersion &v2)
-
- Compares \a v1 with \a v2 and returns an integer less than, equal to, or
- greater than zero, depending on whether \a v1 is less than, equal to, or
- greater than \a v2, respectively.
-
- Comparisons are performed by comparing the version number components of
- \a v1 and \a v2.
-
- \note This function cannot take the OS type into account; you should use
- the overloaded comparison operators to compare QOperatingSystemVersions
- in a safe manner.
-*/
int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
const QOperatingSystemVersion &v2)
{
@@ -227,30 +239,6 @@ int QOperatingSystemVersion::compare(const QOperatingSystemVersion &v1,
return compareVersionComponents(v1.m_major, v2.m_major);
}
-#ifndef QT_BOOTSTRAPPED
-/*!
- \fn QOperatingSystemVersion QOperatingSystemVersion::fromVersionNumber(const QVersionNumber &version,
- QOperatingSystemVersion::OSType os)
-
- Returns a QOperatingSystemVersion consisting of the OS type \a os and version number \a version.
-*/
-QOperatingSystemVersion QOperatingSystemVersion::fromVersionNumber(const QVersionNumber &version,
- QOperatingSystemVersion::OSType os)
-{
- return QOperatingSystemVersion(os, version.majorVersion(), version.minorVersion(), version.microVersion());
-}
-
-/*!
- \fn QOperatingSystemVersion QOperatingSystemVersion::toVersionNumber() const
-
- Returns the QOperatingSystemVersion's version number as a QVersionNumber.
-*/
-QVersionNumber QOperatingSystemVersion::toVersionNumber() const
-{
- return QVersionNumber(m_major, m_minor, m_micro);
-}
-#endif
-
/*!
\fn int QOperatingSystemVersion::majorVersion() const
@@ -340,6 +328,21 @@ QString QOperatingSystemVersion::name() const
}
/*!
+ \fn bool QOperatingSystemVersion::isAnyOfType(std::initializer_list<OSType> types) const
+
+ Returns whether the OS type identified by the QOperatingSystemVersion
+ matches any of the OS types in \a types.
+*/
+bool QOperatingSystemVersion::isAnyOfType(std::initializer_list<OSType> types) const
+{
+ for (const auto &t : qAsConst(types)) {
+ if (type() == t)
+ return true;
+ }
+ return false;
+}
+
+/*!
\variable QOperatingSystemVersion::Windows7
\brief a version corresponding to Windows 7 (version 6.1).
\since 5.9
diff --git a/src/corelib/global/qoperatingsystemversion.h b/src/corelib/global/qoperatingsystemversion.h
index e3318a9c60..cc14d701e1 100644
--- a/src/corelib/global/qoperatingsystemversion.h
+++ b/src/corelib/global/qoperatingsystemversion.h
@@ -84,50 +84,45 @@ public:
Q_DECL_CONSTEXPR QOperatingSystemVersion(OSType osType,
int vmajor, int vminor = -1, int vmicro = -1)
: m_os(osType),
- m_major(vmajor),
- m_minor(vminor),
- m_micro(vmicro)
+ m_major(qMax(-1, vmajor)),
+ m_minor(vmajor < 0 ? -1 : qMax(-1, vminor)),
+ m_micro(vmajor < 0 || vminor < 0 ? -1 : qMax(-1, vmicro))
{ }
static QOperatingSystemVersion current();
- static int compare(const QOperatingSystemVersion &v1, const QOperatingSystemVersion &v2);
-
- QOperatingSystemVersion fromVersionNumber(const QVersionNumber &version, OSType os);
- QVersionNumber toVersionNumber() const;
-
Q_DECL_CONSTEXPR int majorVersion() const { return m_major; }
Q_DECL_CONSTEXPR int minorVersion() const { return m_minor; }
Q_DECL_CONSTEXPR int microVersion() const { return m_micro; }
+ Q_DECL_CONSTEXPR int segmentCount() const
+ { return m_micro >= 0 ? 3 : m_minor >= 0 ? 2 : m_major >= 0 ? 1 : 0; }
+
+ bool isAnyOfType(std::initializer_list<OSType> types) const;
Q_DECL_CONSTEXPR OSType type() const { return m_os; }
QString name() const;
+ friend bool operator>(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
+ { return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) > 0; }
+
+ friend bool operator>=(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
+ { return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) >= 0; }
+
+ friend bool operator<(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
+ { return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) < 0; }
+
+ friend bool operator<=(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
+ { return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) <= 0; }
+
private:
QOperatingSystemVersion() = default;
OSType m_os;
int m_major;
int m_minor;
int m_micro;
-};
-
-inline bool operator>(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) > 0; }
-
-inline bool operator>=(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) >= 0; }
-
-inline bool operator<(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) < 0; }
-inline bool operator<=(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) <= 0; }
-
-inline bool operator==(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return lhs.type() == rhs.type() && QOperatingSystemVersion::compare(lhs, rhs) == 0; }
-
-inline bool operator!=(const QOperatingSystemVersion &lhs, const QOperatingSystemVersion &rhs)
-{ return !(lhs == rhs); }
+ static int compare(const QOperatingSystemVersion &v1, const QOperatingSystemVersion &v2);
+};
QT_END_NAMESPACE