From 0e4d94edd0caac9d2378a00a0aa961a0be3ad796 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 2 Dec 2013 20:05:56 -0800 Subject: Add QTypeInfo::isIntegral trait MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Jędrzej Nowacki --- src/corelib/global/qtypeinfo.h | 43 +++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index 58736ac2b8..7c97909971 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 public: enum { isPointer = false, + isIntegral = false, isComplex = false, isStatic = false, isLarge = false, @@ -88,6 +90,7 @@ class QTypeInfo public: enum { isPointer = true, + isIntegral = false, isComplex = false, isStatic = false, isLarge = false, @@ -125,6 +128,7 @@ public: isStatic = QTypeInfo::isStatic || QTypeInfo::isStatic || QTypeInfo::isStatic || QTypeInfo::isStatic, isLarge = sizeof(T) > sizeof(void*), isPointer = false, + isIntegral = false, isDummy = false, sizeOf = sizeof(T) }; @@ -138,6 +142,7 @@ class QTypeInfo< CONTAINER > \ public: \ enum { \ isPointer = false, \ + isIntegral = false, \ isComplex = true, \ isStatic = false, \ isLarge = (sizeof(CONTAINER) > 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 +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 -- cgit v1.2.3