diff options
Diffstat (limited to 'src/corelib/global/qoperatingsystemversion.h')
-rw-r--r-- | src/corelib/global/qoperatingsystemversion.h | 314 |
1 files changed, 228 insertions, 86 deletions
diff --git a/src/corelib/global/qoperatingsystemversion.h b/src/corelib/global/qoperatingsystemversion.h index c884e0e3e8..7a32fc93a9 100644 --- a/src/corelib/global/qoperatingsystemversion.h +++ b/src/corelib/global/qoperatingsystemversion.h @@ -1,43 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include <QtCore/qglobal.h> +#include <QtCore/qcompare.h> #include <QtCore/qversionnumber.h> #ifndef QOPERATINGSYSTEMVERSION_H @@ -45,11 +10,19 @@ QT_BEGIN_NAMESPACE +#if 0 +# pragma qt_class(QOperatingSystemVersionBase) +# pragma qt_class(QOperatingSystemVersion) +# pragma qt_sync_stop_processing // we have some ifdef'ery fooling syncqt +#endif + class QString; -class Q_CORE_EXPORT QOperatingSystemVersion +class QOperatingSystemVersionBase { public: + // ### Qt 7: Keep synchronized with the copy in QOperatingSystemVersion until Qt7, + // then remove this comment :) enum OSType { Unknown = 0, Windows, @@ -57,9 +30,147 @@ public: IOS, TvOS, WatchOS, - Android + Android, + VisionOS }; + constexpr QOperatingSystemVersionBase(OSType osType, + int vmajor, int vminor = -1, int vmicro = -1) + : m_os(osType), + m_major(vmajor), + m_minor(vminor), + m_micro(vmicro) + { } + + static Q_CORE_EXPORT QOperatingSystemVersionBase current(); + static Q_CORE_EXPORT QString name(QOperatingSystemVersionBase osversion); + static Q_CORE_EXPORT bool isAnyOfType(std::initializer_list<OSType> types, OSType type); + + static constexpr OSType currentType() + { +#if defined(Q_OS_WIN) + return Windows; +#elif defined(Q_OS_MACOS) + return MacOS; +#elif defined(Q_OS_IOS) + return IOS; +#elif defined(Q_OS_TVOS) + return TvOS; +#elif defined(Q_OS_WATCHOS) + return WatchOS; +#elif defined(Q_OS_VISIONOS) + return VisionOS; +#elif defined(Q_OS_ANDROID) + return Android; +#else + return Unknown; +#endif + } + + inline QVersionNumber version() const { return QVersionNumber(m_major, m_minor, m_micro); } + + constexpr int majorVersion() const { return m_major; } + constexpr int minorVersion() const { return m_minor; } + constexpr int microVersion() const { return m_micro; } + + constexpr int segmentCount() const + { return m_micro >= 0 ? 3 : m_minor >= 0 ? 2 : m_major >= 0 ? 1 : 0; } + + inline bool isAnyOfType(std::initializer_list<OSType> types) const + { + return QOperatingSystemVersionBase::isAnyOfType(types, type()); + } + constexpr OSType type() const { return m_os; } + inline QString name() const { return name(*this); } + +protected: + static Q_CORE_EXPORT int compare(QOperatingSystemVersionBase v1, + QOperatingSystemVersionBase v2) noexcept; + + friend Qt::partial_ordering compareThreeWay(const QOperatingSystemVersionBase &lhs, + const QOperatingSystemVersionBase &rhs) noexcept + { + if (lhs.type() != rhs.type()) + return Qt::partial_ordering::unordered; + const int res = QOperatingSystemVersionBase::compare(lhs, rhs); + return Qt::compareThreeWay(res, 0); + } +#ifdef __cpp_lib_three_way_comparison + friend std::partial_ordering + operator<=>(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept + { return compareThreeWay(lhs, rhs); } +#else + friend bool + operator>(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept + { return is_gt(compareThreeWay(lhs, rhs)); } + + friend bool + operator>=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept + { return is_gteq(compareThreeWay(lhs, rhs)); } + + friend bool + operator<(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept + { return is_lt(compareThreeWay(lhs, rhs)); } + + friend bool + operator<=(QOperatingSystemVersionBase lhs, QOperatingSystemVersionBase rhs) noexcept + { return is_lteq(compareThreeWay(lhs, rhs)); } +#endif + + QOperatingSystemVersionBase() = default; +private: + static QOperatingSystemVersionBase current_impl(); + + OSType m_os; + int m_major; + int m_minor; + int m_micro; +}; + +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) && !defined(Q_QDOC) +class QOperatingSystemVersionUnexported : public QOperatingSystemVersionBase +{ +public: + using QOperatingSystemVersionBase::QOperatingSystemVersionBase; + constexpr QOperatingSystemVersionUnexported(QOperatingSystemVersionBase other) noexcept + : QOperatingSystemVersionBase(other) {} +#else +class QOperatingSystemVersion : public QOperatingSystemVersionBase +{ + using QOperatingSystemVersionUnexported = QOperatingSystemVersionBase; +#endif + + // ### Qt7: Regroup with the rest below + static constexpr QOperatingSystemVersionBase MacOSSonoma { QOperatingSystemVersionBase::MacOS, 14, 0 }; + static constexpr QOperatingSystemVersionBase MacOSSequoia { QOperatingSystemVersionBase::MacOS, 15, 0 }; + static constexpr QOperatingSystemVersionBase Android14 { QOperatingSystemVersionBase::Android, 14, 0 }; + static constexpr QOperatingSystemVersionBase Windows11_23H2 { QOperatingSystemVersionBase::Windows, 10, 0, 22631 }; + +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) && !defined(Q_QDOC) +}; + +class Q_CORE_EXPORT QOperatingSystemVersion : public QOperatingSystemVersionUnexported +{ +#endif +public: + // ### Qt7: Remove. Keep synchronized with QOperatingSystemVersionBase::OSType until then! +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) + enum OSType { + Unknown = 0, + Windows, + MacOS, + IOS, + TvOS, + WatchOS, + Android, + VisionOS + }; +#endif + + // ### Qt7: remove the branch with static const variables. Then group and + // sort the inline ones. Until then, new entries should be added to + // QOperatingSystemVersionUnexported. +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED) static const QOperatingSystemVersion Windows7; static const QOperatingSystemVersion Windows8; static const QOperatingSystemVersion Windows8_1; @@ -73,6 +184,7 @@ public: static const QOperatingSystemVersion MacOSMojave; static const QOperatingSystemVersion MacOSCatalina; static const QOperatingSystemVersion MacOSBigSur; + static const QOperatingSystemVersion MacOSMonterey; static const QOperatingSystemVersion AndroidJellyBean; static const QOperatingSystemVersion AndroidJellyBean_MR1; @@ -88,69 +200,99 @@ public: static const QOperatingSystemVersion AndroidPie; static const QOperatingSystemVersion Android10; static const QOperatingSystemVersion Android11; +#else + static constexpr QOperatingSystemVersionBase Windows7 { QOperatingSystemVersionBase::Windows, 6, 1 }; + static constexpr QOperatingSystemVersionBase Windows8 { QOperatingSystemVersionBase::Windows, 6, 2 }; + static constexpr QOperatingSystemVersionBase Windows8_1 { QOperatingSystemVersionBase::Windows, 6, 3 }; + static constexpr QOperatingSystemVersionBase Windows10 { QOperatingSystemVersionBase::Windows, 10 }; - constexpr QOperatingSystemVersion(OSType osType, - int vmajor, int vminor = -1, int vmicro = -1) - : m_os(osType), - m_major(qMax(-1, vmajor)), - m_minor(vmajor < 0 ? -1 : qMax(-1, vminor)), - m_micro(vmajor < 0 || vminor < 0 ? -1 : qMax(-1, vmicro)) - { } + static constexpr QOperatingSystemVersionBase OSXMavericks { QOperatingSystemVersionBase::MacOS, 10, 9 }; + static constexpr QOperatingSystemVersionBase OSXYosemite { QOperatingSystemVersionBase::MacOS, 10, 10 }; + static constexpr QOperatingSystemVersionBase OSXElCapitan { QOperatingSystemVersionBase::MacOS, 10, 11 }; + static constexpr QOperatingSystemVersionBase MacOSSierra { QOperatingSystemVersionBase::MacOS, 10, 12 }; + static constexpr QOperatingSystemVersionBase MacOSHighSierra { QOperatingSystemVersionBase::MacOS, 10, 13 }; + static constexpr QOperatingSystemVersionBase MacOSMojave { QOperatingSystemVersionBase::MacOS, 10, 14 }; + static constexpr QOperatingSystemVersionBase MacOSCatalina { QOperatingSystemVersionBase::MacOS, 10, 15 }; + static constexpr QOperatingSystemVersionBase MacOSBigSur = { QOperatingSystemVersionBase::MacOS, 11, 0 }; + static constexpr QOperatingSystemVersionBase MacOSMonterey = { QOperatingSystemVersionBase::MacOS, 12, 0 }; + + static constexpr QOperatingSystemVersionBase AndroidJellyBean { QOperatingSystemVersionBase::Android, 4, 1 }; + static constexpr QOperatingSystemVersionBase AndroidJellyBean_MR1 { QOperatingSystemVersionBase::Android, 4, 2 }; + static constexpr QOperatingSystemVersionBase AndroidJellyBean_MR2 { QOperatingSystemVersionBase::Android, 4, 3 }; + static constexpr QOperatingSystemVersionBase AndroidKitKat { QOperatingSystemVersionBase::Android, 4, 4 }; + static constexpr QOperatingSystemVersionBase AndroidLollipop { QOperatingSystemVersionBase::Android, 5, 0 }; + static constexpr QOperatingSystemVersionBase AndroidLollipop_MR1 { QOperatingSystemVersionBase::Android, 5, 1 }; + static constexpr QOperatingSystemVersionBase AndroidMarshmallow { QOperatingSystemVersionBase::Android, 6, 0 }; + static constexpr QOperatingSystemVersionBase AndroidNougat { QOperatingSystemVersionBase::Android, 7, 0 }; + static constexpr QOperatingSystemVersionBase AndroidNougat_MR1 { QOperatingSystemVersionBase::Android, 7, 1 }; + static constexpr QOperatingSystemVersionBase AndroidOreo { QOperatingSystemVersionBase::Android, 8, 0 }; + static constexpr QOperatingSystemVersionBase AndroidOreo_MR1 { QOperatingSystemVersionBase::Android, 8, 1 }; + static constexpr QOperatingSystemVersionBase AndroidPie { QOperatingSystemVersionBase::Android, 9, 0 }; + static constexpr QOperatingSystemVersionBase Android10 { QOperatingSystemVersionBase::Android, 10, 0 }; + static constexpr QOperatingSystemVersionBase Android11 { QOperatingSystemVersionBase::Android, 11, 0 }; +#endif + + static constexpr QOperatingSystemVersionBase Windows10_1809 { QOperatingSystemVersionBase::Windows, 10, 0, 17763 }; // RS5 + static constexpr QOperatingSystemVersionBase Windows10_1903 { QOperatingSystemVersionBase::Windows, 10, 0, 18362 }; // 19H1 + static constexpr QOperatingSystemVersionBase Windows10_1909 { QOperatingSystemVersionBase::Windows, 10, 0, 18363 }; // 19H2 + static constexpr QOperatingSystemVersionBase Windows10_2004 { QOperatingSystemVersionBase::Windows, 10, 0, 19041 }; // 20H1 + static constexpr QOperatingSystemVersionBase Windows10_20H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19042 }; + static constexpr QOperatingSystemVersionBase Windows10_21H1 { QOperatingSystemVersionBase::Windows, 10, 0, 19043 }; + static constexpr QOperatingSystemVersionBase Windows10_21H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19044 }; + static constexpr QOperatingSystemVersionBase Windows10_22H2 { QOperatingSystemVersionBase::Windows, 10, 0, 19045 }; + static constexpr QOperatingSystemVersionBase Windows11 { QOperatingSystemVersionBase::Windows, 10, 0, 22000 }; + static constexpr QOperatingSystemVersionBase Windows11_21H2 = Windows11; + static constexpr QOperatingSystemVersionBase Windows11_22H2 { QOperatingSystemVersionBase::Windows, 10, 0, 22621 }; + + static constexpr QOperatingSystemVersionBase Android12 { QOperatingSystemVersionBase::Android, 12, 0 }; + static constexpr QOperatingSystemVersionBase Android12L { QOperatingSystemVersionBase::Android, 12, 0 }; + static constexpr QOperatingSystemVersionBase Android13 { QOperatingSystemVersionBase::Android, 13, 0 }; + static constexpr QOperatingSystemVersionBase MacOSVentura { QOperatingSystemVersionBase::MacOS, 13, 0 }; + + constexpr QOperatingSystemVersion(const QOperatingSystemVersionBase &osversion) + : QOperatingSystemVersionUnexported(osversion) {} + + constexpr QOperatingSystemVersion(OSType osType, int vmajor, int vminor = -1, int vmicro = -1) + : QOperatingSystemVersionUnexported(QOperatingSystemVersionBase::OSType(osType), vmajor, vminor, + vmicro) + { + } + +#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC) static QOperatingSystemVersion current(); +#endif static constexpr OSType currentType() { -#if defined(Q_OS_WIN) - return Windows; -#elif defined(Q_OS_MACOS) - return MacOS; -#elif defined(Q_OS_IOS) - return IOS; -#elif defined(Q_OS_TVOS) - return TvOS; -#elif defined(Q_OS_WATCHOS) - return WatchOS; -#elif defined(Q_OS_ANDROID) - return Android; -#else - return Unknown; -#endif + return OSType(QOperatingSystemVersionBase::currentType()); } - QVersionNumber version() const { return QVersionNumber(m_major, m_minor, m_micro); } +#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC) + QVersionNumber version() const { return QOperatingSystemVersionBase::version(); } - constexpr int majorVersion() const { return m_major; } - constexpr int minorVersion() const { return m_minor; } - constexpr int microVersion() const { return m_micro; } + constexpr int majorVersion() const { return QOperatingSystemVersionBase::majorVersion(); } + constexpr int minorVersion() const { return QOperatingSystemVersionBase::minorVersion(); } + constexpr int microVersion() const { return QOperatingSystemVersionBase::microVersion(); } constexpr int segmentCount() const - { return m_micro >= 0 ? 3 : m_minor >= 0 ? 2 : m_major >= 0 ? 1 : 0; } + { return QOperatingSystemVersionBase::segmentCount(); } +#endif // QT_CORE_REMOVED_SINCE(6, 3) - bool isAnyOfType(std::initializer_list<OSType> types) const; - constexpr OSType type() const { return m_os; } + constexpr OSType type() const { return OSType(QOperatingSystemVersionBase::type()); } + QT7_ONLY(Q_CORE_EXPORT) bool isAnyOfType(std::initializer_list<OSType> types) const; +#if QT_CORE_REMOVED_SINCE(6, 3) || defined(Q_QDOC) 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; } +#endif private: QOperatingSystemVersion() = default; - OSType m_os; - int m_major; - int m_minor; - int m_micro; - static int compare(const QOperatingSystemVersion &v1, const QOperatingSystemVersion &v2); +#if QT_CORE_REMOVED_SINCE(6, 3) + // ### Qt 7: Remove. It's only here for backwards compat with previous inline calls. + [[maybe_unused]] static int compare(const QOperatingSystemVersion &v1, + const QOperatingSystemVersion &v2); +#endif }; Q_DECLARE_TYPEINFO(QOperatingSystemVersion, Q_PRIMITIVE_TYPE); |