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
parent
2b82923c8f
commit
0e4d94edd0
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue