QFlags: mark as Q_PRIMITIVE_TYPE
authorMarc Mutz <marc.mutz@kdab.com>
Sun, 26 Feb 2012 22:01:46 +0000 (23:01 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 29 Feb 2012 22:36:47 +0000 (23:36 +0100)
I originally tried to put Q_DECLARE_TYPEINFOs into
Q_DECLARE_OPERATORS_FOR_FLAGS, to declare not only
the flags type, but also the underlying enum as
primitive, but too many users (arguably correctly)
used Q_DECLARE_OPERATORS_FOR_FLAGS at (non-global)
namespace scope where QTypeInfo would have been
specialised in the wrong namespace.

So specialise QTypeInfo for QFlags<T> only.

Change-Id: I4af6e29aefbd9460a3d2bc6405f03cdf6b1096bc
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
src/corelib/global/qtypeinfo.h
tests/auto/corelib/global/qflags/tst_qflags.cpp

index 6297b35..815be93 100644 (file)
@@ -161,6 +161,10 @@ public: \
 template<> \
 Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
 
+/* Specialize QTypeInfo for QFlags<T> */
+template<typename T> class QFlags;
+template<typename T>
+Q_DECLARE_TYPEINFO_BODY(QFlags<T>, Q_PRIMITIVE_TYPE);
 
 /*
    Specialize a shared type with:
index d466d7b..2794c17 100644 (file)
@@ -123,6 +123,15 @@ void tst_QFlags::constExpr()
 #endif
 }
 
+// (statically) check QTypeInfo for QFlags instantiations:
+enum MyEnum { Zero, One, Two, Four=4 };
+Q_DECLARE_FLAGS( MyFlags, MyEnum );
+Q_DECLARE_OPERATORS_FOR_FLAGS( MyFlags );
+
+Q_STATIC_ASSERT( !QTypeInfo<MyFlags>::isComplex );
+Q_STATIC_ASSERT( !QTypeInfo<MyFlags>::isStatic );
+Q_STATIC_ASSERT( !QTypeInfo<MyFlags>::isLarge );
+Q_STATIC_ASSERT( !QTypeInfo<MyFlags>::isPointer );
 
 QTEST_MAIN(tst_QFlags)
 #include "tst_qflags.moc"