diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-09-04 14:12:38 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-09-04 22:31:04 +0200 |
commit | 8742807c2f1a3937b2d05aae8490a7a8e084e514 (patch) | |
tree | 7692aea1cfc5d931a3cddbe729190a73e131c7db /src/qml/common | |
parent | ffa1932843808420f982f517b1e9bfae3c9db5ab (diff) |
QQmlSignalNames: Optimize a bit
We don't have to repeat the strlen("on") and strlen("Changed") because
we can phrase them as constexpr statics. The same holds for the actual
strings. We can store them as latin-1 so that we don't have to construct
temporary QStrings. When calculating the signal name from the handler
name, we don't have to check the signal name length twice. And finally,
we can reserve() the QString to return when creating a handler name.
Change-Id: Ied0c33638d9e72df6360dd04b3f517d72beca21b
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'src/qml/common')
-rw-r--r-- | src/qml/common/qqmlsignalnames.cpp | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/src/qml/common/qqmlsignalnames.cpp b/src/qml/common/qqmlsignalnames.cpp index 96c4ee5ad7..e66c26d4e2 100644 --- a/src/qml/common/qqmlsignalnames.cpp +++ b/src/qml/common/qqmlsignalnames.cpp @@ -11,6 +11,12 @@ QT_BEGIN_NAMESPACE using namespace Qt::Literals; +static constexpr const QLatin1String On("on"); +static constexpr const QLatin1String Changed("Changed"); + +static constexpr const qsizetype StrlenOn = On.length(); +static constexpr const qsizetype StrlenChanged = Changed.length(); + static std::optional<qsizetype> firstLetterIdx(QStringView name, qsizetype removePrefix = 0, qsizetype removeSuffix = 0) { @@ -84,12 +90,12 @@ QString QQmlSignalNames::addPrefixToPropertyName(QStringView prefix, QStringView QString QQmlSignalNames::propertyNameToChangedSignalName(QStringView property) { - return property.toString().append(u"Changed"_s); + return property.toString().append(Changed); } QByteArray QQmlSignalNames::propertyNameToChangedSignalName(QUtf8StringView property) { - return toUtf8Data(property).append("Changed"_ba); + return toUtf8Data(property).append(QByteArrayView(Changed)); } QString QQmlSignalNames::propertyNameToChangedHandlerName(QStringView property) @@ -100,13 +106,11 @@ QString QQmlSignalNames::propertyNameToChangedHandlerName(QStringView property) template<typename View> std::optional<View> changedSignalNameToPropertyNameTemplate(View changeSignal) { - constexpr qsizetype changedLen = - static_cast<qsizetype>(std::char_traits<char>::length("Changed")); - if (changeSignal.size() < changedLen - || changeSignal.last(changedLen).compare("Changed"_L1) != 0) + const qsizetype changeSignalSize = changeSignal.size(); + if (changeSignalSize < StrlenChanged || changeSignal.last(StrlenChanged).compare(Changed) != 0) return std::nullopt; - const View result = changeSignal.sliced(0, changeSignal.length() - changedLen); + const View result = changeSignal.sliced(0, changeSignalSize - StrlenChanged); if (!result.isEmpty()) return result; @@ -151,24 +155,27 @@ std::optional<QString> QQmlSignalNames::changedHandlerNameToPropertyName(QString QString QQmlSignalNames::signalNameToHandlerName(QAnyStringView signal) { QString handlerName; - signal.visit([&handlerName](auto &&s) { handlerName = u"on"_s.append(s); }); + handlerName.reserve(StrlenOn + signal.length()); + handlerName.append(On); + + signal.visit([&handlerName](auto &&s) { handlerName.append(s); }); - changeCaseOfFirstLetter(handlerName, ToUpper, strlen("on")); + changeCaseOfFirstLetter(handlerName, ToUpper, StrlenOn); return handlerName; } enum HandlerType { ChangedHandler, Handler }; -static std::optional<QString> handlerNameToSignalNameHelper(QStringView handler, HandlerType type) +template<HandlerType type> +static std::optional<QString> handlerNameToSignalNameHelper(QStringView handler) { if (!QQmlSignalNames::isHandlerName(handler)) return {}; - QString signalName = handler.sliced(strlen("on")).toString(); - if (signalName.isEmpty()) - return {}; + QString signalName = handler.sliced(StrlenOn).toString(); + Q_ASSERT(!signalName.isEmpty()); - changeCaseOfFirstLetter(signalName, ToLower, 0, type == ChangedHandler ? strlen("Changed") : 0); + changeCaseOfFirstLetter(signalName, ToLower, 0, type == ChangedHandler ? StrlenChanged : 0); return signalName; } @@ -179,7 +186,7 @@ changedHandlerNameToSignalName for that! */ std::optional<QString> QQmlSignalNames::handlerNameToSignalName(QStringView handler) { - return handlerNameToSignalNameHelper(handler, Handler); + return handlerNameToSignalNameHelper<Handler>(handler); } /*! @@ -189,16 +196,15 @@ Changed. */ std::optional<QString> QQmlSignalNames::changedHandlerNameToSignalName(QStringView handler) { - return handlerNameToSignalNameHelper(handler, ChangedHandler); + return handlerNameToSignalNameHelper<ChangedHandler>(handler); } bool QQmlSignalNames::isChangedSignalName(QStringView signalName) { - const qsizetype smallestAllowedSize = strlen("XChanged"); - if (signalName.size() < smallestAllowedSize || !signalName.endsWith(u"Changed"_s)) + if (signalName.size() <= StrlenChanged || !signalName.endsWith(Changed)) return false; - if (auto letter = firstLetter(signalName, 0, strlen("Changed"))) + if (auto letter = firstLetter(signalName, 0, StrlenChanged)) return letter->isLower(); return true; @@ -206,12 +212,13 @@ bool QQmlSignalNames::isChangedSignalName(QStringView signalName) bool QQmlSignalNames::isChangedHandlerName(QStringView signalName) { - const qsizetype smallestAllowedSize = strlen("onXChanged"); - if (signalName.size() < smallestAllowedSize || !signalName.startsWith(u"on"_s) - || !signalName.endsWith(u"Changed"_s)) + if (signalName.size() <= (StrlenOn + StrlenChanged) + || !signalName.startsWith(On) + || !signalName.endsWith(Changed)) { return false; + } - if (auto letter = firstLetter(signalName, strlen("on"), strlen("Changed"))) + if (auto letter = firstLetter(signalName, StrlenOn, StrlenChanged)) return letter->isUpper(); return true; @@ -219,11 +226,10 @@ bool QQmlSignalNames::isChangedHandlerName(QStringView signalName) bool QQmlSignalNames::isHandlerName(QStringView signalName) { - const qsizetype smallestAllowedSize = strlen("onX"); - if (signalName.size() < smallestAllowedSize || !signalName.startsWith(u"on"_s)) + if (signalName.size() <= StrlenOn || !signalName.startsWith(On)) return false; - if (auto letter = firstLetter(signalName, strlen("on"))) + if (auto letter = firstLetter(signalName, StrlenOn)) return letter->isUpper(); return true; |