Add QTypeInfo<T>::isIntegral trait

This allows us to know whether a given type is an integer or not. It's
going to be useful for QAtomicInteger, to know whether certain
operations can be performed on the type.

Change-Id: Ie64b24993e4021b44c97952d7d3973759fef3d4c
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
bb10
Thiago Macieira 2013-12-02 20:05:56 -08:00 committed by The Qt Project
parent 2b82923c8f
commit 0e4d94edd0
1 changed files with 30 additions and 13 deletions

View File

@ -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