Enable QAtomicInteger for char16_t and char32_t
Those are regular, integer types, of 16- and 32-bit width, respectively. C++11's std::atomic supports them, so we should too. C++11 also supports wchar_t, but since that type's size can change, I don't feel like support for it in Qt is pressing. Change-Id: I945b641c91a8a98be82715f878c382dee58ac98b Reviewed-by: Olivier Goffart <ogoffart@woboq.com>bb10
parent
2b00f97ab0
commit
c9bfd34fa0
|
|
@ -74,6 +74,13 @@ QT_END_HEADER
|
|||
|
||||
template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; };
|
||||
#if defined(Q_COMPILER_UNICODE_STRINGS) && !defined(Q_PROCESSOR_ARM_V6)
|
||||
// for ARMv5, ensure that char32_t (an uint_least32_t), is 32-bit
|
||||
// it's extremely unlikely it won't be on a 32-bit ARM, but just to be sure
|
||||
// For ARMv6 and up, we're sure it works, but the definition is below
|
||||
template<> struct QAtomicIntegerTraits<char32_t>
|
||||
{ enum { IsInteger = sizeof(char32_t) == sizeof(int) ? 1 : -1 }; };
|
||||
#endif
|
||||
|
||||
template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> >
|
||||
{
|
||||
|
|
@ -226,6 +233,11 @@ template<> struct QAtomicIntegerTraits<unsigned long> { enum { IsInteger = 1 };
|
|||
template<> struct QAtomicIntegerTraits<long long> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned long long> { enum { IsInteger = 1 }; };
|
||||
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char16_t> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
# endif
|
||||
|
||||
#define Q_ATOMIC_INT8_IS_SUPPORTED
|
||||
#define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
|
||||
#define Q_ATOMIC_INT8_TEST_AND_SET_IS_ALWAYS_NATIVE
|
||||
|
|
|
|||
|
|
@ -84,6 +84,11 @@ template<> struct QAtomicIntegerTraits<unsigned long> { enum { IsInteger = 1 };
|
|||
template<> struct QAtomicIntegerTraits<long long> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned long long> { enum { IsInteger = 1 }; };
|
||||
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char16_t> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
# endif
|
||||
|
||||
#define Q_ATOMIC_INT8_IS_SUPPORTED
|
||||
#define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
|
||||
#define Q_ATOMIC_INT8_TEST_AND_SET_IS_ALWAYS_NATIVE
|
||||
|
|
|
|||
|
|
@ -57,6 +57,9 @@ QT_END_HEADER
|
|||
|
||||
template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; };
|
||||
#ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
#endif
|
||||
|
||||
#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
|
||||
#define Q_ATOMIC_INT_TEST_AND_SET_IS_SOMETIMES_NATIVE
|
||||
|
|
|
|||
|
|
@ -138,6 +138,11 @@ template<> struct QAtomicIntegerTraits<unsigned long> { enum { IsInteger = 1 };
|
|||
template<> struct QAtomicIntegerTraits<long long> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned long long> { enum { IsInteger = 1 }; };
|
||||
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char16_t> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
# endif
|
||||
|
||||
template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> >
|
||||
{
|
||||
template <typename T>
|
||||
|
|
|
|||
|
|
@ -74,6 +74,13 @@ QT_END_HEADER
|
|||
|
||||
template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; };
|
||||
#if defined(Q_COMPILER_UNICODE_STRINGS) && !defined(Q_PROCESSOR_MIPS_64)
|
||||
// for MIPS32, ensure that char32_t (an uint_least32_t), is 32-bit
|
||||
// it's extremely unlikely it won't be on a 32-bit MIPS, but just to be sure
|
||||
// For MIPS64, we're sure it works, but the definition is below
|
||||
template<> struct QAtomicIntegerTraits<char32_t>
|
||||
{ enum { IsInteger = sizeof(char32_t) == sizeof(int) ? 1 : -1 }; };
|
||||
#endif
|
||||
|
||||
template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> >
|
||||
{
|
||||
|
|
@ -241,6 +248,12 @@ T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy
|
|||
template<> struct QAtomicIntegerTraits<long long> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned long long > { enum { IsInteger = 1 }; };
|
||||
|
||||
#ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char16_t>
|
||||
{ enum { IsInteger = sizeof(char16_t) == sizeof(int) ? 1 : -1 }; };
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
#endif
|
||||
|
||||
template<> template<typename T> inline
|
||||
bool QBasicAtomicOps<8>::ref(T &_q_value) Q_DECL_NOTHROW
|
||||
{
|
||||
|
|
|
|||
|
|
@ -266,6 +266,9 @@ 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 = 1 }; };
|
||||
#endif
|
||||
|
||||
// No definition, needs specialization
|
||||
template <int N> struct QAtomicOpsBySize;
|
||||
|
|
|
|||
|
|
@ -133,6 +133,12 @@ template<> struct QAtomicIntegerTraits<unsigned long> { enum { IsInteger = 1 };
|
|||
template<> struct QAtomicIntegerTraits<long long> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<unsigned long long> { enum { IsInteger = 1 }; };
|
||||
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
template<> struct QAtomicIntegerTraits<char16_t> { enum { IsInteger = 1 }; };
|
||||
template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; };
|
||||
# endif
|
||||
|
||||
|
||||
/*
|
||||
* Guide for the inline assembly below:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -190,6 +190,10 @@ void tst_QAtomicInt::warningFreeHelper()
|
|||
warningFreeHelperTemplate<unsigned int, QBasicAtomicInteger<unsigned int> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<int> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<unsigned int> >();
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
warningFreeHelperTemplate<qint16, QBasicAtomicInteger<char32_t> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<char32_t> >();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef Q_ATOMIC_INT16_IS_SUPPORTED
|
||||
|
|
@ -197,6 +201,10 @@ void tst_QAtomicInt::warningFreeHelper()
|
|||
warningFreeHelperTemplate<quint16, QBasicAtomicInteger<quint16> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<qint16> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<quint16> >();
|
||||
# ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
warningFreeHelperTemplate<qint16, QBasicAtomicInteger<char16_t> >();
|
||||
constexprFunctionsHelperTemplate<QBasicAtomicInteger<char16_t> >();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
|
||||
|
|
|
|||
Loading…
Reference in New Issue