QmlDesigner: Modernize Enumeration

Save some allocations and return a view instead of a new value. If you
want a value because you depend on a null terminated string you have to
use toScope() and toName().

Task-number: QDS-10290
Change-Id: Ia87b8d559fc1fe9bb1992e61da0aa86c68d53535
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2023-07-19 12:05:46 +02:00
parent 194b7d49b0
commit e204af5cac
3 changed files with 51 additions and 47 deletions

View File

@@ -15,76 +15,80 @@
namespace QmlDesigner { namespace QmlDesigner {
using EnumerationName = QByteArray; using EnumerationName = QByteArray;
using EnumerationNameView = QByteArrayView;
class Enumeration class Enumeration
{ {
friend bool operator ==(const Enumeration &first, const Enumeration &second);
friend bool operator <(const Enumeration &first, const Enumeration &second);
friend QDataStream &operator>>(QDataStream &in, Enumeration &enumeration);
public: public:
Enumeration() = default; Enumeration() = default;
Enumeration(const EnumerationName &enumerationName) Enumeration(EnumerationName enumerationName)
: m_enumerationName(enumerationName) : m_enumerationName{std::move(enumerationName)}
{ {}
}
Enumeration(const char *text)
: m_enumerationName{text, static_cast<qsizetype>(std::strlen(text))}
{}
Enumeration(const QString &enumerationName) Enumeration(const QString &enumerationName)
: m_enumerationName(enumerationName.toUtf8()) : m_enumerationName(enumerationName.toUtf8())
{}
Enumeration(const EnumerationName &scope, const EnumerationName &name)
{ {
} m_enumerationName.reserve(scope.size() + 1 + name.size());
Enumeration(const QString &scope, const QString &name) m_enumerationName.append(scope);
{ m_enumerationName.append(1);
QString enumerationString = scope + QLatin1Char('.') + name; m_enumerationName.append(name);
m_enumerationName = enumerationString.toUtf8();
} }
EnumerationName scope() const EnumerationNameView scope() const
{ {
return m_enumerationName.split('.').constFirst(); auto found = std::find(m_enumerationName.begin(), m_enumerationName.end(), '.');
return {m_enumerationName.begin(), found};
} }
EnumerationName name() const
EnumerationNameView toScope() const { return scope().toByteArray(); }
EnumerationNameView name() const
{ {
return m_enumerationName.split('.').last(); auto found = std::find(m_enumerationName.begin(), m_enumerationName.end(), '.');
if (found != m_enumerationName.end())
return {std::next(found), m_enumerationName.end()};
return {m_enumerationName.end(), m_enumerationName.end()};
} }
EnumerationName toEnumerationName() const
EnumerationName toName() const { return name().toByteArray(); }
EnumerationName toEnumerationName() const { return m_enumerationName; }
QString toString() const { return QString::fromUtf8(m_enumerationName); }
QString nameToString() const { return QString::fromUtf8(name()); }
friend bool operator==(const Enumeration &first, const Enumeration &second)
{ {
return m_enumerationName; return first.m_enumerationName == second.m_enumerationName;
} }
QString toString() const
friend bool operator<(const Enumeration &first, const Enumeration &second)
{ {
return QString::fromUtf8(m_enumerationName); return first.m_enumerationName < second.m_enumerationName;
} }
QString nameToString() const
friend QDataStream &operator<<(QDataStream &out, const Enumeration &enumeration)
{ {
return QString::fromUtf8(name()); return out << enumeration.m_enumerationName;
}
friend QDataStream &operator>>(QDataStream &in, Enumeration &enumeration)
{
return in >> enumeration.m_enumerationName;
} }
private: private:
EnumerationName m_enumerationName; EnumerationName m_enumerationName;
}; };
inline QDataStream &operator<<(QDataStream &out, const Enumeration &enumeration){
out << enumeration.toEnumerationName();
return out;
}
inline QDataStream &operator>>(QDataStream &in, Enumeration &enumeration)
{
in >> enumeration.m_enumerationName;
return in;
}
inline bool operator==(const Enumeration &first, const Enumeration &second)
{
return first.m_enumerationName == second.m_enumerationName;
}
inline bool operator<(const Enumeration &first, const Enumeration &second)
{
return first.m_enumerationName < second.m_enumerationName;
}
inline QDebug operator <<(QDebug debug, const Enumeration &enumeration) inline QDebug operator <<(QDebug debug, const Enumeration &enumeration)
{ {
debug.nospace() << "Enumeration(" debug.nospace() << "Enumeration("

View File

@@ -339,7 +339,7 @@ void PropertyEditorValue::resetValue()
void PropertyEditorValue::setEnumeration(const QString &scope, const QString &name) void PropertyEditorValue::setEnumeration(const QString &scope, const QString &name)
{ {
Enumeration newEnumeration(scope, name); Enumeration newEnumeration(scope.toUtf8(), name.toUtf8());
setValueWithEmit(QVariant::fromValue(newEnumeration)); setValueWithEmit(QVariant::fromValue(newEnumeration));
} }

View File

@@ -437,7 +437,7 @@ QVariant ObjectNodeInstance::convertEnumToValue(const QVariant &value, const Pro
QVariant adjustedValue; QVariant adjustedValue;
Enumeration enumeration = value.value<Enumeration>(); Enumeration enumeration = value.value<Enumeration>();
if (metaProperty.isValid() && metaProperty.isEnumType()) { if (metaProperty.isValid() && metaProperty.isEnumType()) {
adjustedValue = metaProperty.enumerator().keyToValue(enumeration.name()); adjustedValue = metaProperty.enumerator().keyToValue(enumeration.toName());
} else { } else {
QQmlExpression expression(context(), object(), enumeration.toString()); QQmlExpression expression(context(), object(), enumeration.toString());
adjustedValue = expression.evaluate(); adjustedValue = expression.evaluate();