From 500e1e29ba044651e7caf529be47fddd468fddb9 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 14 Feb 2025 17:42:35 +0100 Subject: [PATCH] QmlDesigner: remove lookups in the model Use the result from try_emplace. So we save two additional lookups. The code gets simpler, too. Change-Id: Id26024dd2f23f7e345b5b699b6a7b619669bfee1 Reviewed-by: Thomas Hartmann --- .../libs/designercore/model/internalnode_p.h | 37 +++++----- .../libs/designercore/model/model.cpp | 72 ++++--------------- .../libs/qmldesignerutils/memory.h | 29 +++----- 3 files changed, 42 insertions(+), 96 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h index 8160e149e60..fee8341118c 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h @@ -11,8 +11,10 @@ #include "internalsignalhandlerproperty.h" #include "internalvariantproperty.h" +#include #include #include +#include #include #include @@ -146,46 +148,47 @@ public: auto nodeProperty(PropertyNameView name) const { return property(name); } template - Type *addProperty(PropertyNameView name) + std::tuple getProperty(PropertyNameView name) { auto [iter, inserted] = m_nameProperties.try_emplace( - name, std::make_shared(name, shared_from_this())); + name, makeLazySharedPtr(name, shared_from_this())); + auto flags = AbstractView::NoAdditionalChanges; if (inserted) - return static_cast(iter->second.get()); + flags = AbstractView::PropertiesAdded; - return nullptr; + return std::make_tuple(static_cast(iter->second.get()), flags); } - auto addBindingProperty(PropertyNameView name) + auto getBindingProperty(PropertyNameView name) { - return addProperty(name); + return getProperty(name); } - auto addSignalHandlerProperty(PropertyNameView name) + auto getSignalHandlerProperty(PropertyNameView name) { - return addProperty(name); + return getProperty(name); } - auto addSignalDeclarationProperty(PropertyNameView name) + auto getSignalDeclarationProperty(PropertyNameView name) { - return addProperty(name); + return getProperty(name); } - auto addNodeListProperty(PropertyNameView name) + auto getNodeListProperty(PropertyNameView name) { - return addProperty(name); + return getProperty(name); } - auto addVariantProperty(PropertyNameView name) + auto getVariantProperty(PropertyNameView name) { - return addProperty(name); + return getProperty(name); } - auto addNodeProperty(PropertyNameView name, const TypeName &dynamicTypeName) + auto getNodeProperty(PropertyNameView name, const TypeName &dynamicTypeName) { - auto property = addProperty(name); - property->setDynamicTypeName(dynamicTypeName); + auto property = getProperty(name); + std::get<0>(property)->setDynamicTypeName(dynamicTypeName); return property; } diff --git a/src/plugins/qmldesigner/libs/designercore/model/model.cpp b/src/plugins/qmldesigner/libs/designercore/model/model.cpp index c8956b45682..e3e98598364 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/model.cpp @@ -341,7 +341,7 @@ InternalNodePointer ModelPrivate::createNode(TypeNameView typeName, using PropertyPair = QPair; for (const PropertyPair &propertyPair : propertyList) { - newNode->addVariantProperty(propertyPair.first); + newNode->getVariantProperty(propertyPair.first); newNode->variantProperty(propertyPair.first)->setValue(propertyPair.second); } @@ -1379,14 +1379,7 @@ void ModelPrivate::setBindingProperty(const InternalNodePointer &node, PropertyNameView name, const QString &expression) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalBindingProperty *bindingProperty = nullptr; - if (auto property = node->property(name)) { - bindingProperty = property->to(); - } else { - bindingProperty = node->addBindingProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [bindingProperty, propertyChange] = node->getBindingProperty(name); notifyBindingPropertiesAboutToBeChanged({bindingProperty}); bindingProperty->setExpression(expression); @@ -1415,14 +1408,7 @@ void ModelPrivate::setSignalHandlerProperty(const InternalNodePointer &node, PropertyNameView name, const QString &source) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalSignalHandlerProperty *signalHandlerProperty = nullptr; - if (auto property = node->property(name)) { - signalHandlerProperty = property->to(); - } else { - signalHandlerProperty = node->addSignalHandlerProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [signalHandlerProperty, propertyChange] = node->getSignalHandlerProperty(name); signalHandlerProperty->setSource(source); notifySignalHandlerPropertiesChanged({signalHandlerProperty}, propertyChange); @@ -1432,14 +1418,7 @@ void ModelPrivate::setSignalDeclarationProperty(const InternalNodePointer &node, PropertyNameView name, const QString &signature) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalSignalDeclarationProperty *signalDeclarationProperty = nullptr; - if (auto property = node->property(name)) { - signalDeclarationProperty = property->to(); - } else { - signalDeclarationProperty = node->addSignalDeclarationProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [signalDeclarationProperty, propertyChange] = node->getSignalDeclarationProperty(name); signalDeclarationProperty->setSignature(signature); notifySignalDeclarationPropertiesChanged({signalDeclarationProperty}, propertyChange); @@ -1449,14 +1428,7 @@ void ModelPrivate::setVariantProperty(const InternalNodePointer &node, PropertyNameView name, const QVariant &value) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalVariantProperty *variantProperty = nullptr; - if (auto property = node->property(name)) { - variantProperty = property->to(); - } else { - variantProperty = node->addVariantProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [variantProperty, propertyChange] = node->getVariantProperty(name); variantProperty->setValue(value); variantProperty->resetDynamicTypeName(); @@ -1468,14 +1440,7 @@ void ModelPrivate::setDynamicVariantProperty(const InternalNodePointer &node, const TypeName &dynamicPropertyType, const QVariant &value) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalVariantProperty *variantProperty = nullptr; - if (auto property = node->property(name)) { - variantProperty = property->to(); - } else { - variantProperty = node->addVariantProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [variantProperty, propertyChange] = node->getVariantProperty(name); variantProperty->setDynamicValue(dynamicPropertyType, value); notifyVariantPropertiesChanged(node, PropertyNameViews({name}), propertyChange); @@ -1486,14 +1451,7 @@ void ModelPrivate::setDynamicBindingProperty(const InternalNodePointer &node, const TypeName &dynamicPropertyType, const QString &expression) { - AbstractView::PropertyChangeFlags propertyChange = AbstractView::NoAdditionalChanges; - InternalBindingProperty *bindingProperty = nullptr; - if (auto property = node->property(name)) { - bindingProperty = property->to(); - } else { - bindingProperty = node->addBindingProperty(name); - propertyChange = AbstractView::PropertiesAdded; - } + auto [bindingProperty, propertyChange] = node->getBindingProperty(name); notifyBindingPropertiesAboutToBeChanged({bindingProperty}); bindingProperty->setDynamicExpression(dynamicPropertyType, expression); @@ -1524,16 +1482,14 @@ void ModelPrivate::reparentNode(const InternalNodePointer &parentNode, propertyChange); InternalNodeAbstractProperty *newParentProperty = nullptr; - if (auto property = parentNode->property(name)) { - newParentProperty = property->to(); - } else { - if (list) - newParentProperty = parentNode->addNodeListProperty(name); - else - newParentProperty = parentNode->addNodeProperty(name, dynamicTypeName); + AbstractView::PropertyChangeFlags newPropertyChange = AbstractView::NoAdditionalChanges; - propertyChange |= AbstractView::PropertiesAdded; - } + if (list) + std::tie(newParentProperty, newPropertyChange) = parentNode->getNodeListProperty(name); + else + std::tie(newParentProperty, newPropertyChange) = parentNode->getNodeProperty(name, + dynamicTypeName); + propertyChange |= newPropertyChange; Q_ASSERT(newParentProperty); diff --git a/src/plugins/qmldesigner/libs/qmldesignerutils/memory.h b/src/plugins/qmldesigner/libs/qmldesignerutils/memory.h index 17b8874d3bb..dd64c4a0a07 100644 --- a/src/plugins/qmldesigner/libs/qmldesignerutils/memory.h +++ b/src/plugins/qmldesigner/libs/qmldesignerutils/memory.h @@ -8,21 +8,20 @@ namespace QmlDesigner { -template -class LazyPtr +template +class LazySharedPtr { - using ResultType = Pointer::element_type; public: - LazyPtr(Arguments &&...arguments) + LazySharedPtr(Arguments &&...arguments) : m_arguments{std::forward_as_tuple(std::forward(arguments)...)} {} - operator Pointer() const + operator std::shared_ptr() const { return std::apply( [](auto &&...arguments) { - return Pointer(new ResultType(std::forward(arguments)...)); + return std::make_shared(std::forward(arguments)...); }, m_arguments); } @@ -31,22 +30,10 @@ private: std::tuple m_arguments; }; -template -using LazyUniquePtr = LazyPtr, Arguments...>; - -template -LazyUniquePtr makeLazyUniquePtr(Arguments &&...arguments) +template +LazySharedPtr makeLazySharedPtr(Arguments &&...arguments) { - return LazyUniquePtr(std::forward(arguments)...); -} - -template -using LazySharedPtr = LazyPtr, Arguments...>; - -template -LazySharedPtr makeLazySharedPtr(Arguments &&...arguments) -{ - return LazySharedPtr(std::forward(arguments)...); + return LazySharedPtr(std::forward(arguments)...); } } // namespace QmlDesigner