diff options
author | Michael Brasser <mbrasser@ford.com> | 2017-04-21 09:42:53 -0500 |
---|---|---|
committer | Michael Brasser <michael.brasser@live.com> | 2017-04-24 19:19:44 +0000 |
commit | 47fdb2c8e36d5c5cd83b7f87a4cdf3d5e9eeea93 (patch) | |
tree | 2c4dc42bb205d155736e0cfe5b1133c1bf761049 /src/corelib/kernel | |
parent | bfcc2902a4f4f3d062962e3ba7bf19158d1f56d5 (diff) |
Add support for scoped enums to QMetaObjectBuilder
Change-Id: I7b3c3973ff4396a854014f5b2b671b71007e80da
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetaobjectbuilder.cpp | 36 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobjectbuilder_p.h | 3 |
2 files changed, 36 insertions, 3 deletions
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 56f187a59d..e3b70638c6 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -190,12 +190,13 @@ class QMetaEnumBuilderPrivate { public: QMetaEnumBuilderPrivate(const QByteArray& _name) - : name(_name), isFlag(false) + : name(_name), isFlag(false), isScoped(false) { } QByteArray name; bool isFlag; + bool isScoped; QList<QByteArray> keys; QVector<int> values; }; @@ -637,6 +638,7 @@ QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QMetaEnum& prototype) { QMetaEnumBuilder en = addEnumerator(prototype.name()); en.setIsFlag(prototype.isFlag()); + en.setIsScoped(prototype.isScoped()); int count = prototype.keyCount(); for (int index = 0; index < count; ++index) en.addKey(prototype.key(index), prototype.value(index)); @@ -1408,12 +1410,13 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, Q_ASSERT(!buf || dataIndex == pmeta->enumeratorData); for (const auto &enumerator : d->enumerators) { int name = strings.enter(enumerator.name); - int isFlag = (int)(enumerator.isFlag); + int isFlag = enumerator.isFlag ? EnumIsFlag : 0; + int isScoped = enumerator.isScoped ? EnumIsScoped : 0; int count = enumerator.keys.size(); int enumOffset = enumIndex; if (buf) { data[dataIndex] = name; - data[dataIndex + 1] = isFlag; + data[dataIndex + 1] = isFlag | isScoped; data[dataIndex + 2] = count; data[dataIndex + 3] = enumOffset; } @@ -1641,6 +1644,7 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const for (const auto &enumerator : d->enumerators) { stream << enumerator.name; stream << enumerator.isFlag; + stream << enumerator.isScoped; stream << enumerator.keys; stream << enumerator.values; } @@ -1807,6 +1811,7 @@ void QMetaObjectBuilder::deserialize addEnumerator(name); QMetaEnumBuilderPrivate &enumerator = d->enumerators[index]; stream >> enumerator.isFlag; + stream >> enumerator.isScoped; stream >> enumerator.keys; stream >> enumerator.values; if (enumerator.keys.size() != enumerator.values.size()) { @@ -2633,6 +2638,31 @@ void QMetaEnumBuilder::setIsFlag(bool value) } /*! + Return \c true if this enumerator should be considered scoped (C++11 enum class). + + \sa setIsScoped() +*/ +bool QMetaEnumBuilder::isScoped() const +{ + QMetaEnumBuilderPrivate *d = d_func(); + if (d) + return d->isScoped; + return false; +} + +/*! + Sets this enumerator to be a scoped enum if \value is true + + \sa isScoped() +*/ +void QMetaEnumBuilder::setIsScoped(bool value) +{ + QMetaEnumBuilderPrivate *d = d_func(); + if (d) + d->isScoped = value; +} + +/*! Returns the number of keys. \sa key(), addKey() diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h index 144595330d..03b2afaebc 100644 --- a/src/corelib/kernel/qmetaobjectbuilder_p.h +++ b/src/corelib/kernel/qmetaobjectbuilder_p.h @@ -300,6 +300,9 @@ public: bool isFlag() const; void setIsFlag(bool value); + bool isScoped() const; + void setIsScoped(bool value); + int keyCount() const; QByteArray key(int index) const; int value(int index) const; |