diff options
Diffstat (limited to 'src/corelib/global')
-rw-r--r-- | src/corelib/global/qcompilerdetection.h | 76 | ||||
-rw-r--r-- | src/corelib/global/qglobal.cpp | 15 | ||||
-rw-r--r-- | src/corelib/global/qglobal.h | 29 | ||||
-rw-r--r-- | src/corelib/global/qlibraryinfo.cpp | 57 | ||||
-rw-r--r-- | src/corelib/global/qlibraryinfo.h | 4 | ||||
-rw-r--r-- | src/corelib/global/qlogging.cpp | 2 | ||||
-rw-r--r-- | src/corelib/global/qnamespace.h | 11 | ||||
-rw-r--r-- | src/corelib/global/qnamespace.qdoc | 22 | ||||
-rw-r--r-- | src/corelib/global/qnumeric.cpp | 136 | ||||
-rw-r--r-- | src/corelib/global/qnumeric.h | 3 | ||||
-rw-r--r-- | src/corelib/global/qtypeinfo.h | 43 |
11 files changed, 361 insertions, 37 deletions
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index d526d40398..2c2e1295c5 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -98,6 +98,7 @@ # define Q_UNREACHABLE_IMPL() __assume(0) # define Q_NORETURN __declspec(noreturn) # define Q_DECL_DEPRECATED __declspec(deprecated) +# define Q_DECL_DEPRECATED_X(text) __declspec(deprecated(text)) # define Q_DECL_EXPORT __declspec(dllexport) # define Q_DECL_IMPORT __declspec(dllimport) /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */ @@ -152,6 +153,9 @@ # define Q_CC_INTEL # define Q_ASSUME_IMPL(expr) __assume(expr) # define Q_UNREACHABLE_IMPL() __builtin_unreachable() +# if __INTEL_COMPILER >= 1300 +# define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) +# endif # elif defined(__clang__) /* Clang also masquerades as GCC */ # define Q_CC_CLANG @@ -173,6 +177,7 @@ # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 # define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable() # define Q_UNREACHABLE_IMPL() __builtin_unreachable() +# define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) # endif # endif @@ -469,12 +474,29 @@ * N2544 Q_COMPILER_UNRESTRICTED_UNIONS * N1653 Q_COMPILER_VARIADIC_MACROS * N2242 N2555 Q_COMPILER_VARIADIC_TEMPLATES + * + * C++1y proposed features + * + * N3472 Q_COMPILER_BINARY_LITERALS + * N3649 Q_COMPILER_GENERIC_LAMBDA + * N3638 Q_COMPILER_LAMBDA_CAPTURES + * N3652 Q_COMPILER_RELAXED_CONSTEXPR_FUNCTIONS + * N3386 N3638 Q_COMPILER_RETURN_TYPE_DEDUCTION + * N3651 Q_COMPILER_VARIABLE_TEMPLATES + * N3639 Q_COMPILER_VLA (see also Q_COMPILER_RESTRICTED_VLA) + * */ #ifdef Q_CC_INTEL +# define Q_COMPILER_RESTRICTED_VLA # if __INTEL_COMPILER < 1200 # define Q_NO_TEMPLATE_FRIENDS # endif +# if __INTEL_COMPILER >= 1310 && !defined(_WIN32) +// ICC supports C++14 binary literals in C, C++98, and C++11 modes +// at least since 13.1, but I can't test further back +# define Q_COMPILER_BINARY_LITERALS +# endif # if __cplusplus >= 201103L # define Q_COMPILER_VARIADIC_MACROS # if __INTEL_COMPILER >= 1200 @@ -520,6 +542,7 @@ #ifdef Q_CC_CLANG /* General C++ features */ +# define Q_COMPILER_RESTRICTED_VLA # if !__has_feature(cxx_exceptions) # ifndef QT_NO_EXCEPTIONS # define QT_NO_EXCEPTIONS @@ -528,6 +551,15 @@ # if !__has_feature(cxx_rtti) # define QT_NO_RTTI # endif +# if __has_feature(attribute_deprecated_with_message) +# define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) +# endif + +// Clang supports binary literals in C, C++98 and C++11 modes +// It's been supported "since the dawn of time itself" (cf. commit 179883) +# if __has_extension(cxx_binary_literals) +# define Q_COMPILER_BINARY_LITERALS +# endif /* C++11 features, see http://clang.llvm.org/cxx_status.html */ # if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) @@ -628,9 +660,40 @@ # define Q_COMPILER_VARIADIC_MACROS # endif # endif + +/* C++1y features, see http://clang.llvm.org/cxx_status.html and + * http://clang.llvm.org/docs/LanguageExtensions.html#checks-for-standard-language-features */ +# if __cplusplus > 201103L +//# if __has_feature(cxx_binary_literals) +//# define Q_COMPILER_BINARY_LITERALS // see above +//# endif +# if __has_feature(cxx_generic_lambda) +# define Q_COMPILER_GENERIC_LAMBDA +# endif +# if __has_feature(cxx_init_capture) +# define Q_COMPILER_LAMBDA_CAPTURES +# endif +# if __has_feature(cxx_relaxed_constexpr) +# define Q_COMPILER_RELAXED_CONSTEXPR_FUNCTIONS +# endif +# if __has_feature(cxx_decltype_auto) && __has_feature(cxx_return_type_deduction) +# define Q_COMPILER_RETURN_TYPE_DEDUCTION +# endif +# if __has_feature(cxx_variable_templates) +# define Q_COMPILER_VARIABLE_TEMPLATES +# endif +# if __has_feature(cxx_runtime_array) +# define Q_COMPILER_VLA +# endif +# endif #endif // Q_CC_CLANG #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) +# define Q_COMPILER_RESTRICTED_VLA +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 +// GCC supports binary literals in C, C++98 and C++11 modes +# define Q_COMPILER_BINARY_LITERALS +# endif # if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 /* C++11 features supported in GCC 4.3: */ @@ -693,6 +756,15 @@ # endif /* C++11 features are complete as of GCC 4.8.1 */ # endif +# if __cplusplus > 201103L +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 + /* C++1y features in GCC 4.9 */ +//# define Q_COMPILER_BINARY_LITERALS // already supported since GCC 4.3 as an extension +# define Q_COMPILER_LAMBDA_CAPTURES +# define Q_COMPILER_RETURN_TYPE_DEDUCTION +# define Q_COMPILER_VLA +# endif +# endif #endif #if defined(Q_CC_MSVC) && !defined(Q_CC_INTEL) @@ -861,6 +933,9 @@ #ifndef Q_DECL_VARIABLE_DEPRECATED # define Q_DECL_VARIABLE_DEPRECATED Q_DECL_DEPRECATED #endif +#ifndef Q_DECL_DEPRECATED_X +# define Q_DECL_DEPRECATED_X(text) Q_DECL_DEPRECATED +#endif #ifndef Q_DECL_EXPORT # define Q_DECL_EXPORT #endif @@ -943,7 +1018,6 @@ #endif #if !defined(Q_PROCESSOR_ARM) # undef QT_COMPILER_SUPPORTS_IWMMXT -# undef QT_COMPILER_SUPPORTS_NEON #endif #if !defined(Q_PROCESSOR_MIPS) # undef QT_COMPILER_SUPPORTS_MIPS_DSP diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 6644d6d101..e0a78d8533 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -2186,7 +2186,9 @@ QString qt_error_string(int errorCode) s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device"); break; default: { -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) + // Retrieve the system error message for the last-error code. +# ifndef Q_OS_WINRT wchar_t *string = 0; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, @@ -2197,6 +2199,17 @@ QString qt_error_string(int errorCode) NULL); ret = QString::fromWCharArray(string); LocalFree((HLOCAL)string); +# else // !Q_OS_WINRT + __declspec(thread) static wchar_t errorString[4096]; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + errorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + errorString, + ARRAYSIZE(errorString), + NULL); + ret = QString::fromWCharArray(errorString); +# endif // Q_OS_WINRT if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND) ret = QString::fromLatin1("The specified module could not be found."); diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 9bba21210c..f68f6af920 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -45,11 +45,11 @@ #include <stddef.h> -#define QT_VERSION_STR "5.2.2" +#define QT_VERSION_STR "5.3.0" /* QT_VERSION is (major << 16) + (minor << 8) + patch. */ -#define QT_VERSION 0x050202 +#define QT_VERSION 0x050300 /* can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)) */ @@ -191,7 +191,7 @@ typedef qint64 qlonglong; typedef quint64 qulonglong; #ifndef QT_POINTER_SIZE -# if defined(Q_OS_WIN64) +# if defined(Q_OS_WIN64) || (defined(Q_OS_WINRT) && defined(_M_X64)) # define QT_POINTER_SIZE 8 # elif defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_WINRT) # define QT_POINTER_SIZE 4 @@ -221,11 +221,14 @@ typedef double qreal; #if defined(QT_NO_DEPRECATED) # undef QT_DEPRECATED +# undef QT_DEPRECATED_X # undef QT_DEPRECATED_VARIABLE # undef QT_DEPRECATED_CONSTRUCTOR #elif defined(QT_DEPRECATED_WARNINGS) # undef QT_DEPRECATED # define QT_DEPRECATED Q_DECL_DEPRECATED +# undef QT_DEPRECATED_X +# define QT_DEPRECATED_X(text) Q_DECL_DEPRECATED_X(text) # undef QT_DEPRECATED_VARIABLE # define QT_DEPRECATED_VARIABLE Q_DECL_VARIABLE_DEPRECATED # undef QT_DEPRECATED_CONSTRUCTOR @@ -233,6 +236,8 @@ typedef double qreal; #else # undef QT_DEPRECATED # define QT_DEPRECATED +# undef QT_DEPRECATED_X +# define QT_DEPRECATED_X(text) # undef QT_DEPRECATED_VARIABLE # define QT_DEPRECATED_VARIABLE # undef QT_DEPRECATED_CONSTRUCTOR @@ -559,7 +564,12 @@ class QDataStream; #endif #if defined(Q_OS_WINRT) +# define QT_NO_FILESYSTEMWATCHER +# define QT_NO_GETADDRINFO +# define QT_NO_NETWORKPROXY # define QT_NO_PROCESS +# define QT_NO_SOCKETNOTIFIER +# define QT_NO_SOCKS5 #endif inline void qt_noop(void) {} @@ -1030,14 +1040,17 @@ template <typename T> struct QEnableIf<true, T> { typedef T Type; }; #endif QT_END_NAMESPACE -// Q_GLOBAL_STATIC -#include <QtCore/qglobalstatic.h> -// qDebug and friends +// We need to keep QTypeInfo, QSysInfo, QFlags, qDebug & family in qglobal.h for compatibility with Qt 4. +// Be careful when changing the order of these files. +#include <QtCore/qtypeinfo.h> +#include <QtCore/qsysinfo.h> #include <QtCore/qlogging.h> + #include <QtCore/qflags.h> -#include <QtCore/qsysinfo.h> -#include <QtCore/qtypeinfo.h> + +#include <QtCore/qatomic.h> +#include <QtCore/qglobalstatic.h> #endif /* __cplusplus */ diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 1c3b09f602..6ad94b5067 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "qdir.h" +#include "qstringlist.h" #include "qfile.h" #include "qsettings.h" #include "qlibraryinfo.h" @@ -113,6 +114,8 @@ public: } }; +static const char platformsSection[] = "Platforms"; + QLibrarySettings::QLibrarySettings() : settings(QLibraryInfoPrivate::findConfiguration()) { @@ -132,7 +135,8 @@ QLibrarySettings::QLibrarySettings() haveEffectivePaths = children.contains(QLatin1String("EffectivePaths")); #endif // Backwards compat: an existing but empty file is claimed to contain the Paths section. - havePaths = !haveEffectivePaths || children.contains(QLatin1String("Paths")); + havePaths = (!haveEffectivePaths && !children.contains(QLatin1String(platformsSection))) + || children.contains(QLatin1String("Paths")); #ifndef QT_BOOTSTRAPPED if (!havePaths) settings.reset(0); @@ -156,23 +160,23 @@ QSettings *QLibraryInfoPrivate::findConfiguration() #else if (!QFile::exists(qtconfig) && QCoreApplication::instance()) { #ifdef Q_OS_MAC - CFBundleRef bundleRef = CFBundleGetMainBundle(); + CFBundleRef bundleRef = CFBundleGetMainBundle(); if (bundleRef) { - QCFType<CFURLRef> urlRef = CFBundleCopyResourceURL(bundleRef, - QCFString(QLatin1String("qt.conf")), - 0, - 0); - if (urlRef) { - QCFString path = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); - qtconfig = QDir::cleanPath(path); - } - } - if (qtconfig.isEmpty()) + QCFType<CFURLRef> urlRef = CFBundleCopyResourceURL(bundleRef, + QCFString(QLatin1String("qt.conf")), + 0, + 0); + if (urlRef) { + QCFString path = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); + qtconfig = QDir::cleanPath(path); + } + } + if (qtconfig.isEmpty()) #endif { QDir pwd(QCoreApplication::applicationDirPath()); qtconfig = pwd.filePath(QLatin1String("qt.conf")); - } + } } #endif if (QFile::exists(qtconfig)) @@ -466,6 +470,33 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group) } /*! + Returns additional arguments to the platform plugin matching + \a platformName which can be specified as a string list using + the key \c Arguments in a group called \c Platforms of the + \c qt.conf file. + + sa {Using qt.conf} + + \internal + + \since 5.3 +*/ + +QStringList QLibraryInfo::platformPluginArguments(const QString &platformName) +{ +#ifndef QT_BOOTSTRAPPED + if (const QSettings *settings = QLibraryInfoPrivate::findConfiguration()) { + QString key = QLatin1String(platformsSection); + key += QLatin1Char('/'); + key += platformName; + key += QLatin1String("Arguments"); + return settings->value(key).toStringList(); + } +#endif // !QT_BOOTSTRAPPED + return QStringList(); +} + +/*! \enum QLibraryInfo::LibraryLocation \keyword library location diff --git a/src/corelib/global/qlibraryinfo.h b/src/corelib/global/qlibraryinfo.h index 17864b555b..54ef794d3e 100644 --- a/src/corelib/global/qlibraryinfo.h +++ b/src/corelib/global/qlibraryinfo.h @@ -47,6 +47,8 @@ QT_BEGIN_NAMESPACE +class QStringList; + class Q_CORE_EXPORT QLibraryInfo { public: @@ -96,6 +98,8 @@ public: static QString rawLocation(LibraryLocation, PathGroup); #endif + static QStringList platformPluginArguments(const QString &platformName); + private: QLibraryInfo(); }; diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index 5b7a674ddb..28493311fb 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -871,7 +871,7 @@ static void android_default_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &message) { - android_LogPriority priority; + android_LogPriority priority = ANDROID_LOG_DEBUG; switch (type) { case QtDebugMsg: priority = ANDROID_LOG_DEBUG; break; case QtWarningMsg: priority = ANDROID_LOG_WARN; break; diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 8a46f3a6ab..97212def92 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -998,6 +998,10 @@ public: Key_ChannelUp = 0x01000118, Key_ChannelDown = 0x01000119, + Key_Guide = 0x0100011a, + Key_Info = 0x0100011b, + Key_Settings = 0x0100011c, + Key_MediaLast = 0x0100ffff, // Keypad navigation keys @@ -1015,6 +1019,7 @@ public: //Key_Jisho = 0x01020007, // IME: Dictionary key //Key_Oyayubi_Left = 0x01020008, // IME: Left Oyayubi key //Key_Oyayubi_Right = 0x01020009, // IME: Right Oyayubi key + Key_Exit = 0x0102000a, // Device keys Key_Context1 = 0x01100000, @@ -1596,6 +1601,12 @@ public: ScrollUpdate, ScrollEnd }; + + enum MouseEventSource { + MouseEventNotSynthesized, + MouseEventSynthesizedBySystem, + MouseEventSynthesizedByQt + }; } #ifdef Q_MOC_RUN ; diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index ae377e124b..851b6609ea 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -2895,3 +2895,25 @@ \value ScrollEnd Scrolling has ended, but the scrolling distance did not change anymore. */ + +/*! + \enum Qt::MouseEventSource + \since 5.3 + + This enum describes the source of a mouse event and can be useful + to determine if the event is an artificial mouse event originating + from another device such as a touchscreen. + + \value MouseEventNotSynthesized The most common value. On + platforms where such information is available this value indicates + that the event was generated in response to a genuine mouse event + in the system. + + \value MouseEventSynthesizedBySystem Indicates that the mouse + event was synthesized from a touch event by the platform. + + \value MouseEventSynthesizedByQt Indicates that the mouse event was + synthesized from an unhandled touch event by Qt. + + \sa Qt::AA_SynthesizeMouseForUnhandledTouchEvents +*/ diff --git a/src/corelib/global/qnumeric.cpp b/src/corelib/global/qnumeric.cpp index d09357c26c..7d8bd8c3c6 100644 --- a/src/corelib/global/qnumeric.cpp +++ b/src/corelib/global/qnumeric.cpp @@ -41,6 +41,7 @@ #include "qnumeric.h" #include "qnumeric_p.h" +#include <string.h> QT_BEGIN_NAMESPACE @@ -99,4 +100,139 @@ Q_CORE_EXPORT double qQNaN() { return qt_qnan(); } Q_CORE_EXPORT double qInf() { return qt_inf(); } + +/*! + \internal + */ +static inline quint32 f2i(float f) +{ + quint32 i; + memcpy(&i, &f, sizeof(f)); + return i; +} + +/*! + Returns the number of representable floating-point numbers between \a a and \a b. + + This function provides an alternative way of doing approximated comparisons of floating-point + numbers similar to qFuzzyCompare(). However, it returns the distance between two numbers, which + gives the caller a possibility to choose the accepted error. Errors are relative, so for + instance the distance between 1.0E-5 and 1.00001E-5 will give 110, while the distance between + 1.0E36 and 1.00001E36 will give 127. + + This function is useful if a floating point comparison requires a certain precision. + Therefore, if \a a and \a b are equal it will return 0. The maximum value it will return for 32-bit + floating point numbers is 4,278,190,078. This is the distance between \c{-FLT_MAX} and + \c{+FLT_MAX}. + + The function does not give meaningful results if any of the arguments are \c Infinite or \c NaN. + You can check for this by calling qIsFinite(). + + The return value can be considered as the "error", so if you for instance want to compare + two 32-bit floating point numbers and all you need is an approximated 24-bit precision, you can + use this function like this: + + \code + if (qFloatDistance(a, b) < (1 << 7)) { // The last 7 bits are not + // significant + // precise enough + } + \endcode + + \sa qFuzzyCompare() + \relates <QtGlobal> +*/ +Q_CORE_EXPORT quint32 qFloatDistance(float a, float b) +{ + static const quint32 smallestPositiveFloatAsBits = 0x00000001; // denormalized, (SMALLEST), (1.4E-45) + /* Assumes: + * IEE754 format. + * Integers and floats have the same endian + */ + Q_STATIC_ASSERT(sizeof(quint32) == sizeof(float)); + Q_ASSERT(qIsFinite(a) && qIsFinite(b)); + if (a == b) + return 0; + if ((a < 0) != (b < 0)) { + // if they have different signs + if (a < 0) + a = -a; + else /*if (b < 0)*/ + b = -b; + return qFloatDistance(0.0F, a) + qFloatDistance(0.0F, b); + } + if (a < 0) { + a = -a; + b = -b; + } + // at this point a and b should not be negative + + // 0 is special + if (!a) + return f2i(b) - smallestPositiveFloatAsBits + 1; + if (!b) + return f2i(a) - smallestPositiveFloatAsBits + 1; + + // finally do the common integer subtraction + return a > b ? f2i(a) - f2i(b) : f2i(b) - f2i(a); +} + + +/*! + \internal + */ +static inline quint64 d2i(double d) +{ + quint64 i; + memcpy(&i, &d, sizeof(d)); + return i; +} + +/*! + Returns the number of representable floating-point numbers between \a a and \a b. + + This function serves the same purpose as \c{qFloatDistance(float, float)}, but + returns the distance between two \c double numbers. Since the range is larger + than for two \c float numbers (\c{[-DBL_MAX,DBL_MAX]}), the return type is quint64. + + + \sa qFuzzyCompare() + \relates <QtGlobal> +*/ +Q_CORE_EXPORT quint64 qFloatDistance(double a, double b) +{ + static const quint64 smallestPositiveFloatAsBits = 0x1; // denormalized, (SMALLEST) + /* Assumes: + * IEE754 format double precision + * Integers and floats have the same endian + */ + Q_STATIC_ASSERT(sizeof(quint64) == sizeof(double)); + Q_ASSERT(qIsFinite(a) && qIsFinite(b)); + if (a == b) + return 0; + if ((a < 0) != (b < 0)) { + // if they have different signs + if (a < 0) + a = -a; + else /*if (b < 0)*/ + b = -b; + return qFloatDistance(0.0, a) + qFloatDistance(0.0, b); + } + if (a < 0) { + a = -a; + b = -b; + } + // at this point a and b should not be negative + + // 0 is special + if (!a) + return d2i(b) - smallestPositiveFloatAsBits + 1; + if (!b) + return d2i(a) - smallestPositiveFloatAsBits + 1; + + // finally do the common integer subtraction + return a > b ? d2i(a) - d2i(b) : d2i(b) - d2i(a); +} + + QT_END_NAMESPACE diff --git a/src/corelib/global/qnumeric.h b/src/corelib/global/qnumeric.h index 25db5443eb..633486dff1 100644 --- a/src/corelib/global/qnumeric.h +++ b/src/corelib/global/qnumeric.h @@ -57,6 +57,9 @@ Q_CORE_EXPORT double qSNaN(); Q_CORE_EXPORT double qQNaN(); Q_CORE_EXPORT double qInf(); +Q_CORE_EXPORT quint32 qFloatDistance(float a, float b); +Q_CORE_EXPORT quint64 qFloatDistance(double a, double b); + #define Q_INFINITY (QT_PREPEND_NAMESPACE(qInf)()) #define Q_SNAN (QT_PREPEND_NAMESPACE(qSNaN)()) #define Q_QNAN (QT_PREPEND_NAMESPACE(qQNaN)()) diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index 5837c8d94e..114e11345a 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -60,6 +60,7 @@ class QTypeInfo public: enum { isPointer = false, + isIntegral = false, isComplex = true, isStatic = true, isLarge = (sizeof(T)>sizeof(void*)), @@ -74,6 +75,7 @@ class QTypeInfo<void> public: enum { isPointer = false, + isIntegral = false, isComplex = false, isStatic = false, isLarge = false, @@ -88,6 +90,7 @@ class QTypeInfo<T*> public: enum { isPointer = true, + isIntegral = false, isComplex = false, isStatic = false, isLarge = false, @@ -125,6 +128,7 @@ public: isStatic = QTypeInfo<T1>::isStatic || QTypeInfo<T2>::isStatic || QTypeInfo<T3>::isStatic || QTypeInfo<T4>::isStatic, isLarge = sizeof(T) > sizeof(void*), isPointer = false, + isIntegral = false, isDummy = false, sizeOf = sizeof(T) }; @@ -138,6 +142,7 @@ class QTypeInfo< CONTAINER<T> > \ public: \ enum { \ isPointer = false, \ + isIntegral = false, \ isComplex = true, \ isStatic = false, \ isLarge = (sizeof(CONTAINER<T>) > sizeof(void*)), \ @@ -168,7 +173,8 @@ enum { /* TYPEINFO flags */ Q_PRIMITIVE_TYPE = 0x1, Q_STATIC_TYPE = 0, Q_MOVABLE_TYPE = 0x2, - Q_DUMMY_TYPE = 0x4 + Q_DUMMY_TYPE = 0x4, + Q_INTEGRAL_TYPE = 0x8 }; #define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \ @@ -180,6 +186,7 @@ public: \ isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \ isLarge = (sizeof(TYPE)>sizeof(void*)), \ isPointer = false, \ + isIntegral = ((FLAGS) & Q_INTEGRAL_TYPE) != 0, \ isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \ sizeOf = sizeof(TYPE) \ }; \ @@ -221,23 +228,33 @@ Q_DECLARE_SHARED_STL(TYPE) /* QTypeInfo primitive specializations */ -Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(signed char, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(uchar, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(short, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(ushort, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(int, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(uint, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(long, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(ulong, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(qint64, Q_PRIMITIVE_TYPE); -Q_DECLARE_TYPEINFO(quint64, Q_PRIMITIVE_TYPE); +Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(signed char, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(uchar, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(short, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(ushort, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(int, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(uint, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(long, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(ulong, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(qint64, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(quint64, Q_PRIMITIVE_TYPE | Q_INTEGRAL_TYPE); Q_DECLARE_TYPEINFO(float, Q_PRIMITIVE_TYPE); Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE); #ifndef Q_OS_DARWIN Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE); #endif +#ifdef Q_COMPILER_UNICODE_STRINGS +// ### Qt6: define as Q_PRIMITIVE_TYPE +// We can't do it now because it would break BC on QList<char32_t> +Q_DECLARE_TYPEINFO(char16_t, Q_INTEGRAL_TYPE); +Q_DECLARE_TYPEINFO(char32_t, Q_INTEGRAL_TYPE); +#endif +#if !defined(Q_CC_MSVC) || defined(_NATIVE_WCHAR_T_DEFINED) +// ### Qt6: same as above +Q_DECLARE_TYPEINFO(wchar_t, Q_INTEGRAL_TYPE); +#endif QT_END_NAMESPACE #endif // QTYPEINFO_H |