diff options
Diffstat (limited to 'src/corelib/thread')
-rw-r--r-- | src/corelib/thread/qatomic.cpp | 27 | ||||
-rw-r--r-- | src/corelib/thread/qgenericatomic.h | 13 |
2 files changed, 39 insertions, 1 deletions
diff --git a/src/corelib/thread/qatomic.cpp b/src/corelib/thread/qatomic.cpp index 36cdfdb369..bebdab3080 100644 --- a/src/corelib/thread/qatomic.cpp +++ b/src/corelib/thread/qatomic.cpp @@ -1221,9 +1221,34 @@ QT_BEGIN_NAMESPACE -// The following three specializations must always be defined +// The following specializations must always be defined Q_STATIC_ASSERT(sizeof(QAtomicInteger<unsigned>)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger<long>)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger<unsigned long>)); Q_STATIC_ASSERT(sizeof(QAtomicInteger<quintptr>)); Q_STATIC_ASSERT(sizeof(QAtomicInteger<qptrdiff>)); +#ifdef Q_COMPILER_UNICODE_STRINGS +Q_STATIC_ASSERT(sizeof(QAtomicInteger<char32_t>)); +#endif + +#ifdef Q_ATOMIC_INT16_IS_SUPPORTED +Q_STATIC_ASSERT(sizeof(QAtomicInteger<short>)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger<unsigned short>)); +# if WCHAR_MAX < 0x10000 +Q_STATIC_ASSERT(sizeof(QAtomicInteger<wchar_t>)); +# endif +# ifdef Q_COMPILER_UNICODE_STRINGS +Q_STATIC_ASSERT(sizeof(QAtomicInteger<char16_t>)); +# endif +#endif + +#ifdef Q_ATOMIC_INT64_IS_SUPPORTED +Q_STATIC_ASSERT(sizeof(QAtomicInteger<qint64>)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger<quint64>)); +#endif + +#if WCHAR_MAX == INT_MAX +Q_STATIC_ASSERT(sizeof(QAtomicInteger<wchar_t>)); +#endif QT_END_NAMESPACE diff --git a/src/corelib/thread/qgenericatomic.h b/src/corelib/thread/qgenericatomic.h index 3a213f6a25..bbdc57ca50 100644 --- a/src/corelib/thread/qgenericatomic.h +++ b/src/corelib/thread/qgenericatomic.h @@ -62,6 +62,19 @@ QT_END_NAMESPACE template<typename T> struct QAtomicIntegerTraits { enum { IsInteger = 0 }; }; +// these integers are always supported, on all platforms +// - int, unsigned int and char32_t are 32-bit wide +// - long and unsigned long might be 64-bit wide on 64-bit platforms, +// but 64-bit integer support is required anyway +template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits<long> { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits<unsigned long> { enum { IsInteger = 1 }; }; +#ifdef Q_COMPILER_UNICODE_STRINGS +template<> struct QAtomicIntegerTraits<char32_t> +{ enum { IsInteger = sizeof(char32_t) == sizeof(int) ? 1 : -1 }; }; +#endif + template <typename T> struct QAtomicAdditiveType { typedef T AdditiveT; |