From 13e1e30ec39e9039930a25d851bb525ec486a15d Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 1 Jul 2012 22:55:54 +0200 Subject: [PATCH] Add constexpr template specializations for built in metatypes. This will make it possible (in Qt 6) to remove the enums listing metatype ids. As it is constexpr, it can be used in switch statements just like enums, as enum values, and as template specialization values. Change-Id: I51293674c403714e34cb8a8b8953522fc97a740a Reviewed-by: Olivier Goffart --- src/corelib/kernel/qmetatype.h | 10 ++--- .../kernel/qmetatype/tst_qmetatype.cpp | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index a42333fbf8..79514c8116 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -536,17 +536,17 @@ template struct QMetaTypeId2 { enum { Defined = QMetaTypeId::Defined }; - static inline int qt_metatype_id() { return QMetaTypeId::qt_metatype_id(); } + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId::qt_metatype_id(); } }; namespace QtPrivate { template ::Defined> struct QMetaTypeIdHelper { - static inline int qt_metatype_id() + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId2::qt_metatype_id(); } }; template struct QMetaTypeIdHelper { - static inline int qt_metatype_id() + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return -1; } }; @@ -624,7 +624,7 @@ void qRegisterMetaTypeStreamOperators(const char *typeName #endif // QT_NO_DATASTREAM template -inline int qMetaTypeId( +inline Q_DECL_CONSTEXPR int qMetaTypeId( #ifndef qdoc T * /* dummy */ = 0 #endif @@ -713,7 +713,7 @@ inline int qRegisterMetaTypeStreamOperators() template<> struct QMetaTypeId2 \ { \ enum { Defined = 1, MetaType = QMetaType::NAME }; \ - static inline int qt_metatype_id() { return QMetaType::NAME; } \ + static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaType::NAME; } \ }; \ QT_END_NAMESPACE diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index b61625714b..c73c26a9ef 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -107,6 +107,7 @@ private slots: void saveAndLoadBuiltin(); void saveAndLoadCustom(); void metaObject(); + void constexprMetaTypeIds(); }; struct Foo { int i; }; @@ -1632,6 +1633,46 @@ void tst_QMetaType::metaObject() QCOMPARE(QMetaType(QMetaType::Int).metaObject(), static_cast(0)); } +#define METATYPE_ID_FUNCTION(Type, MetaTypeId, Name) \ + case ::qMetaTypeId< Name >(): metaType = MetaTypeIdStruct::Value; + +template +struct MetaTypeIdStruct +{ +}; + +#define METATYPE_ID_STRUCT(Type, MetaTypeId, Name) \ +template<> \ +struct MetaTypeIdStruct< ::qMetaTypeId< Name >()> \ +{ \ + enum { Value = ::qMetaTypeId< Name >() }; \ +}; + +#if defined(Q_COMPILER_CONSTEXPR) +QT_FOR_EACH_STATIC_TYPE(METATYPE_ID_STRUCT) + +template()> +struct MetaTypeIdStructDefaultTemplateValue +{ + enum { Value }; +}; +#endif + +void tst_QMetaType::constexprMetaTypeIds() +{ + int id = 0; + int metaType; + + switch(id) { +#if defined(Q_COMPILER_CONSTEXPR) + QT_FOR_EACH_STATIC_TYPE(METATYPE_ID_FUNCTION) + metaType = MetaTypeIdStructDefaultTemplateValue<>::Value; +#endif + default:; + } + Q_UNUSED(metaType); +} + // Compile-time test, it should be possible to register function pointer types class Undefined;