From fd0d576709fff48bc23444b3a30a86e92c625101 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 2 Dec 2013 19:39:36 -0800 Subject: Centralize support for QBasicAtomic for ints and longs No need to redefine everywhere, since they're required to be supported. Change-Id: I2bdbbd0b0c44871e3bd0edcf0289fc58dd50ff31 Reviewed-by: Lars Knoll --- src/corelib/thread/qatomic.cpp | 27 ++++++++++++++++++++++++++- src/corelib/thread/qgenericatomic.h | 13 +++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) (limited to 'src/corelib/thread') 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)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); Q_STATIC_ASSERT(sizeof(QAtomicInteger)); Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +#ifdef Q_COMPILER_UNICODE_STRINGS +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +#endif + +#ifdef Q_ATOMIC_INT16_IS_SUPPORTED +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +# if WCHAR_MAX < 0x10000 +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +# endif +# ifdef Q_COMPILER_UNICODE_STRINGS +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +# endif +#endif + +#ifdef Q_ATOMIC_INT64_IS_SUPPORTED +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +#endif + +#if WCHAR_MAX == INT_MAX +Q_STATIC_ASSERT(sizeof(QAtomicInteger)); +#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 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 { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; +template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; +#ifdef Q_COMPILER_UNICODE_STRINGS +template<> struct QAtomicIntegerTraits +{ enum { IsInteger = sizeof(char32_t) == sizeof(int) ? 1 : -1 }; }; +#endif + template struct QAtomicAdditiveType { typedef T AdditiveT; -- cgit v1.2.3