From 14583137ae445fbfdc82922266f5c0736454f6c4 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Sat, 10 Dec 2011 10:53:39 +0100 Subject: Introduce Q_ENUM and Q_FLAG macros MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In replacement for Q_ENUMS and Q_FLAGS. Q_ENUM(Foo) has to be put after the declaration of Foo in an object. It will tell moc to include the enum in the meta object (just like Q_ENUMS) and will allow templated code to get the metaobject for that enum. Will be used by QDebug and QMetaType Change-Id: Iefaf8ae07dc0359828102bf384809346629b3e23 Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qobjectdefs.h | 6 ++++++ src/tools/moc/keywords.cpp | 4 ++-- src/tools/moc/moc.cpp | 2 ++ src/tools/moc/token.h | 2 ++ src/tools/moc/util/generate_keywords.cpp | 2 ++ 5 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index 84e7a65a54..af99546f04 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -84,6 +84,10 @@ class QString; #define Q_OVERRIDE(text) #define Q_ENUMS(x) #define Q_FLAGS(x) +#define Q_ENUM(ENUM) \ + friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) Q_DECL_NOEXCEPT { return &staticMetaObject; } \ + friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) Q_DECL_NOEXCEPT { return #ENUM; } +#define Q_FLAG(ENUM) Q_ENUM(ENUM) #define Q_SCRIPTABLE #define Q_INVOKABLE #define Q_SIGNAL @@ -185,6 +189,8 @@ private: \ #define Q_REVISION(v) Q_REVISION(v) #define Q_OVERRIDE(text) Q_OVERRIDE(text) #define Q_ENUMS(x) Q_ENUMS(x) +#define Q_FLAGS(x) Q_FLAGS(x) +#define Q_ENUM(x) Q_ENUM(x) #define Q_FLAGS(x) Q_FLAGS(x) /* qmake ignore Q_OBJECT */ #define Q_OBJECT Q_OBJECT diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp index bb4f2883cb..5bee666c8d 100644 --- a/src/tools/moc/keywords.cpp +++ b/src/tools/moc/keywords.cpp @@ -840,12 +840,12 @@ static const struct {CHARACTER, 0, 78, 393, CHARACTER}, {CHARACTER, 0, 85, 394, CHARACTER}, {CHARACTER, 0, 77, 395, CHARACTER}, - {CHARACTER, 0, 83, 396, CHARACTER}, + {Q_ENUM_TOKEN, 0, 83, 396, CHARACTER}, {Q_ENUMS_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 76, 398, CHARACTER}, {CHARACTER, 0, 65, 399, CHARACTER}, {CHARACTER, 0, 71, 400, CHARACTER}, - {CHARACTER, 0, 83, 401, CHARACTER}, + {Q_FLAG_TOKEN, 0, 83, 401, CHARACTER}, {Q_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 69, 403, CHARACTER}, {CHARACTER, 0, 67, 404, CHARACTER}, diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 75349191d4..fe59f430f5 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -696,9 +696,11 @@ void Moc::parse() parsePluginData(&def); break; case Q_ENUMS_TOKEN: + case Q_ENUM_TOKEN: parseEnumOrFlag(&def, false); break; case Q_FLAGS_TOKEN: + case Q_FLAG_TOKEN: parseEnumOrFlag(&def, true); break; case Q_DECLARE_FLAGS_TOKEN: diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h index 57be5b4999..19832e5406 100644 --- a/src/tools/moc/token.h +++ b/src/tools/moc/token.h @@ -162,7 +162,9 @@ QT_BEGIN_NAMESPACE F(Q_PROPERTY_TOKEN) \ F(Q_PLUGIN_METADATA_TOKEN) \ F(Q_ENUMS_TOKEN) \ + F(Q_ENUM_TOKEN) \ F(Q_FLAGS_TOKEN) \ + F(Q_FLAG_TOKEN) \ F(Q_DECLARE_FLAGS_TOKEN) \ F(Q_DECLARE_INTERFACE_TOKEN) \ F(Q_DECLARE_METATYPE_TOKEN) \ diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp index 98800486a3..1d94d1fbdb 100644 --- a/src/tools/moc/util/generate_keywords.cpp +++ b/src/tools/moc/util/generate_keywords.cpp @@ -222,7 +222,9 @@ static const Keyword keywords[] = { { "Q_PROPERTY", "Q_PROPERTY_TOKEN" }, { "Q_PLUGIN_METADATA", "Q_PLUGIN_METADATA_TOKEN" }, { "Q_ENUMS", "Q_ENUMS_TOKEN" }, + { "Q_ENUM", "Q_ENUM_TOKEN" }, { "Q_FLAGS", "Q_FLAGS_TOKEN" }, + { "Q_FLAG", "Q_FLAG_TOKEN" }, { "Q_DECLARE_FLAGS", "Q_DECLARE_FLAGS_TOKEN" }, { "Q_DECLARE_INTERFACE", "Q_DECLARE_INTERFACE_TOKEN" }, { "Q_DECLARE_METATYPE", "Q_DECLARE_METATYPE_TOKEN" }, -- cgit v1.2.3