From 03c2c3c365bd10888e1b64b53381ca5017cbdbb2 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 11 Sep 2024 18:26:46 +0200 Subject: [PATCH] QmlDesigner: Fix compilation for GCC 10 QList and std::span don't interact well on GCC 10. GCC 11 is fixing it but we still have to support old compiler. QVarLengthArray is fixing it. It has the advantage to reduce allocations too. Change-Id: I4d17aee334258776de7d40aaa248e815f988fb0c Reviewed-by: Tim Jenssen --- .../libs/designercore/include/abstractview.h | 1 - .../libs/designercore/include/modelnode.h | 12 +- .../libs/designercore/model/abstractview.cpp | 13 +-- .../libs/designercore/model/internalnode.cpp | 26 +++-- .../libs/designercore/model/internalnode_p.h | 14 ++- .../model/internalnodelistproperty.cpp | 31 +++--- .../model/internalnodelistproperty.h | 32 +++--- .../model/internalnodeproperty.cpp | 6 +- .../designercore/model/internalnodeproperty.h | 6 +- .../libs/designercore/model/model.cpp | 103 ++++++++---------- .../libs/designercore/model/model_p.h | 25 +++-- .../libs/designercore/model/modelnode.cpp | 15 +++ .../designercore/model/nodelistproperty.cpp | 6 +- .../projectstorage/projectstorageupdater.cpp | 5 +- 14 files changed, 155 insertions(+), 140 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/include/abstractview.h b/src/plugins/qmldesigner/libs/designercore/include/abstractview.h index c621b9d3bac..c6f25e7bad1 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/libs/designercore/include/abstractview.h @@ -328,7 +328,6 @@ private: Kind m_kind = Kind::Other; }; -QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); QMLDESIGNERCORE_EXPORT QList toModelNodeList( Utils::span nodeList, Model *model, diff --git a/src/plugins/qmldesigner/libs/designercore/include/modelnode.h b/src/plugins/qmldesigner/libs/designercore/include/modelnode.h index df2f7113f27..91f05a4d5ca 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/libs/designercore/include/modelnode.h @@ -45,7 +45,13 @@ class GlobalAnnotationStatus; class Comment; class Annotation; -QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); +template> +QMLDESIGNERCORE_EXPORT Result toInternalNodeList(const QList &nodeList); + +extern template QMLDESIGNERCORE_EXPORT QVarLengthArray +toInternalNodeList>(const QList &nodeList); +extern template QMLDESIGNERCORE_EXPORT QVarLengthArray +toInternalNodeList>(const QList &nodeList); using PropertyListType = QList >; using AuxiliaryPropertyListType = QList>; @@ -59,7 +65,9 @@ inline constexpr AuxiliaryDataKeyView transitionExpandedPropery{AuxiliaryDataTyp class QMLDESIGNERCORE_EXPORT ModelNode { friend QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const ModelNode &modelNode); - friend QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); + template + friend QMLDESIGNERCORE_EXPORT Result toInternalNodeList(const QList &nodeList); + friend Model; friend AbstractView; friend NodeListProperty; diff --git a/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp index 31d49b79915..acc8be0f9b0 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/abstractview.cpp @@ -411,15 +411,6 @@ QList toModelNodeList(Utils::span toInternalNodeList(const QList &nodeList) -{ - QList newNodeList; - for (const ModelNode &node : nodeList) - newNodeList.append(node.internalNode()); - - return newNodeList; -} - /*! Sets the list of nodes to the actual selected nodes specified by \a selectedNodeList if the node or its ancestors are not locked. @@ -466,7 +457,7 @@ QList AbstractView::selectedModelNodes() const ModelNode AbstractView::firstSelectedModelNode() const { if (hasSelectedModelNodes()) - return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); + return ModelNode(model()->d->selectedNodes().front(), model(), this); return ModelNode(); } @@ -474,7 +465,7 @@ ModelNode AbstractView::firstSelectedModelNode() const ModelNode AbstractView::singleSelectedModelNode() const { if (hasSingleSelectedModelNode()) - return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); + return ModelNode(model()->d->selectedNodes().front(), model(), this); return ModelNode(); } diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/libs/designercore/model/internalnode.cpp index a601cc21605..ef84007b997 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnode.cpp @@ -120,9 +120,9 @@ PropertyNameViews InternalNode::propertyNameViews() const return CoreUtils::to(m_nameProperties | std::views::keys); } -QList InternalNode::allSubNodes() const +InternalNode::ManyNodes InternalNode::allSubNodes() const { - QList nodes; + ManyNodes nodes; nodes.reserve(1024); addSubNodes(nodes); @@ -130,7 +130,7 @@ QList InternalNode::allSubNodes() const return nodes; } -void InternalNode::addSubNodes(QList &nodes, const InternalProperty *property) +void InternalNode::addSubNodes(ManyNodes &nodes, const InternalProperty *property) { switch (property->type()) { case PropertyType::NodeList: @@ -148,24 +148,30 @@ void InternalNode::addSubNodes(QList &nodes, const Internal } } -void InternalNode::addSubNodes(QList &nodes) const +void InternalNode::addSubNodes(ManyNodes &nodes) const { for (const auto &entry : m_nameProperties) addSubNodes(nodes, entry.second.get()); } -void InternalNode::addDirectSubNodes(QList &nodes) const +void InternalNode::addDirectSubNodes(ManyNodes &nodes) const { for (const auto &entry : m_nameProperties) addDirectSubNodes(nodes, entry.second.get()); } -void InternalNode::addDirectSubNodes(QList &nodes, - const InternalProperty *property) +namespace { +void append(InternalNode::ManyNodes &nodes, auto &appendNodes) +{ + std::copy(appendNodes.begin(), appendNodes.end(), std::back_inserter(nodes)); +} +} // namespace + +void InternalNode::addDirectSubNodes(ManyNodes &nodes, const InternalProperty *property) { switch (property->type()) { case PropertyType::NodeList: - nodes.append(property->to()->nodes()); + append(nodes, property->to()->nodes()); break; case PropertyType::Node: nodes.append(property->to()->node()); @@ -179,9 +185,9 @@ void InternalNode::addDirectSubNodes(QList &nodes, } } -QList InternalNode::allDirectSubNodes() const +InternalNode::ManyNodes InternalNode::allDirectSubNodes() const { - QList nodes; + ManyNodes nodes; nodes.reserve(96); addDirectSubNodes(nodes); diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h index 4129ff98a07..a850ead3ae1 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnode_p.h @@ -50,6 +50,8 @@ class InternalNode : public std::enable_shared_from_this public: using Pointer = std::shared_ptr; using WeakPointer = std::weak_ptr; + using FewNodes = QVarLengthArray; + using ManyNodes = QVarLengthArray; explicit InternalNode(TypeNameView typeName, int majorVersion, @@ -193,12 +195,12 @@ public: bool hasProperties() const { return m_nameProperties.size(); } - QList allSubNodes() const; - QList allDirectSubNodes() const; - void addSubNodes(QList &nodes) const; - void addDirectSubNodes(QList &nodes) const; - static void addSubNodes(QList &nodes, const InternalProperty *property); - static void addDirectSubNodes(QList &nodes, const InternalProperty *property); + ManyNodes allSubNodes() const; + ManyNodes allDirectSubNodes() const; + void addSubNodes(ManyNodes &nodes) const; + void addDirectSubNodes(ManyNodes &nodes) const; + static void addSubNodes(ManyNodes &nodes, const InternalProperty *property); + static void addDirectSubNodes(ManyNodes &nodes, const InternalProperty *property); friend bool operator<(const InternalNode::Pointer &firstNode, const InternalNode::Pointer &secondNode) diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.cpp index 49fa67f9c2c..a7ed51b18c3 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.cpp @@ -21,12 +21,12 @@ bool InternalNodeListProperty::isValid() const bool InternalNodeListProperty::isEmpty() const { - return m_nodeList.isEmpty(); + return m_nodes.isEmpty(); } int InternalNodeListProperty::count() const { - return m_nodeList.size(); + return m_nodes.size(); } int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const @@ -34,53 +34,54 @@ int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const if (!node) return -1; - return m_nodeList.indexOf(node); + return m_nodes.indexOf(node); } void InternalNodeListProperty::add(const InternalNode::Pointer &internalNode) { - Q_ASSERT(!m_nodeList.contains(internalNode)); + Q_ASSERT(!m_nodes.contains(internalNode)); auto flowToken = traceToken.tickWithFlow("add node"_t); internalNode->traceToken.tick(flowToken, "node added"_t); - m_nodeList.append(internalNode); + m_nodes.append(internalNode); } void InternalNodeListProperty::remove(const InternalNodePointer &internalNode) { - Q_ASSERT(m_nodeList.contains(internalNode)); + Q_ASSERT(m_nodes.contains(internalNode)); auto flowToken = traceToken.tickWithFlow("remove node"_t); internalNode->traceToken.tick(flowToken, "node removed"_t); - m_nodeList.removeAll(internalNode); + m_nodes.removeAll(internalNode); } -const QList &InternalNodeListProperty::nodeList() const +const InternalNodeListProperty::FewNodes &InternalNodeListProperty::nodeList() const { - return m_nodeList; + return m_nodes; } void InternalNodeListProperty::slide(int from, int to) { traceToken.tick("slide"_t, keyValue("from", from), keyValue("to", to)); - InternalNode::Pointer internalNode = m_nodeList.takeAt(from); - m_nodeList.insert(to, internalNode); + InternalNode::Pointer internalNode = m_nodes.at(from); + m_nodes.remove(from); + m_nodes.insert(to, internalNode); } -void InternalNodeListProperty::addSubNodes(QList &container) const +void InternalNodeListProperty::addSubNodes(ManyNodes &container) const { - for (const auto &node : std::as_const(m_nodeList)) { + for (const auto &node : std::as_const(m_nodes)) { container.push_back(node); node->addSubNodes(container); } } -QList InternalNodeListProperty::allSubNodes() const +InternalNodeListProperty::ManyNodes InternalNodeListProperty::allSubNodes() const { - QList nodes; + ManyNodes nodes; nodes.reserve(1024); addSubNodes(nodes); diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.h b/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.h index 9072e571afc..3f91d74a3de 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.h +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnodelistproperty.h @@ -15,6 +15,9 @@ class InternalNodeListProperty final : public InternalNodeAbstractProperty { public: using Pointer = std::shared_ptr; + using FewNodes = QVarLengthArray; + using ManyNodes = QVarLengthArray; + static constexpr PropertyType type = PropertyType::NodeList; InternalNodeListProperty(PropertyNameView name, const InternalNodePointer &propertyOwner); @@ -22,46 +25,49 @@ public: bool isValid() const override; bool isEmpty() const override; - int size() const { return m_nodeList.size(); } + + int size() const { return m_nodes.size(); } + int count() const override; int indexOf(const InternalNodePointer &node) const override; + const InternalNodePointer &at(int index) const { - Q_ASSERT(index >= 0 && index < m_nodeList.size()); - return m_nodeList[index]; + Q_ASSERT(index >= 0 && index < m_nodes.size()); + return m_nodes[index]; } InternalNodePointer &at(int index) { - Q_ASSERT(index >= 0 && index < m_nodeList.size()); - return m_nodeList[index]; + Q_ASSERT(index >= 0 && index < m_nodes.size()); + return m_nodes[index]; } InternalNodePointer &find(InternalNodePointer node) { - auto found = std::find(m_nodeList.begin(), m_nodeList.end(), node); + auto found = std::find(m_nodes.begin(), m_nodes.end(), node); return *found; } - QList allSubNodes() const; - const QList &nodeList() const; + ManyNodes allSubNodes() const; + const FewNodes &nodeList() const; void slide(int from, int to); - void addSubNodes(QList &container) const; + void addSubNodes(ManyNodes &container) const; - QList::iterator begin() { return m_nodeList.begin(); } + FewNodes::iterator begin() { return m_nodes.begin(); } - QList::iterator end() { return m_nodeList.end(); } + FewNodes::iterator end() { return m_nodes.end(); } - const QList &nodes() const { return m_nodeList; } + const FewNodes &nodes() const { return m_nodes; } protected: void add(const InternalNodePointer &node) override; void remove(const InternalNodePointer &node) override; private: - QList m_nodeList; + FewNodes m_nodes; }; } // namespace Internal diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.cpp b/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.cpp index d6bf0daf68a..235f8855fd0 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.cpp @@ -60,9 +60,9 @@ void InternalNodeProperty::add(const InternalNode::Pointer &node) m_node = node; } -QList InternalNodeProperty::allSubNodes() const +InternalNodeProperty::ManyNodes InternalNodeProperty::allSubNodes() const { - QList nodes; + ManyNodes nodes; nodes.reserve(1024); addSubNodes(nodes); @@ -70,7 +70,7 @@ QList InternalNodeProperty::allSubNodes() const return nodes; } -void InternalNodeProperty::addSubNodes(QList &container) const +void InternalNodeProperty::addSubNodes(ManyNodes &container) const { container.push_back(m_node); m_node->addSubNodes(container); diff --git a/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.h b/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.h index b1572962c25..f38db531294 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.h +++ b/src/plugins/qmldesigner/libs/designercore/model/internalnodeproperty.h @@ -12,6 +12,8 @@ class InternalNodeProperty : public InternalNodeAbstractProperty { public: using Pointer = std::shared_ptr; + using ManyNodes = QVarLengthArray; + static constexpr PropertyType type = PropertyType::Node; InternalNodeProperty(PropertyNameView name, const InternalNodePointer &node); @@ -21,8 +23,8 @@ public: int count() const override; int indexOf(const InternalNodePointer &node) const override; - QList allSubNodes() const; - void addSubNodes(QList &container) const; + ManyNodes allSubNodes() const; + void addSubNodes(ManyNodes &container) const; const InternalNodePointer &node() const { return m_node; } diff --git a/src/plugins/qmldesigner/libs/designercore/model/model.cpp b/src/plugins/qmldesigner/libs/designercore/model/model.cpp index ed933550008..6bc7b683150 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/model.cpp @@ -367,12 +367,12 @@ void ModelPrivate::removeNodeFromModel(const InternalNodePointer &node) node->resetParentProperty(); - m_selectedInternalNodeList.removeAll(node); + m_selectedInternalNodes.removeAll(node); if (!node->id.isEmpty()) m_idNodeHash.remove(node->id); node->isValid = false; node->traceToken.end(); - std::erase(m_nodes, node); + m_nodes.removeOne(node); m_internalIdNodeHash.remove(node->internalId); } @@ -677,10 +677,10 @@ void ModelPrivate::notifyInstanceErrorChange(const QVector &instanceIds) void ModelPrivate::notifyInstancesCompleted(const QVector &modelNodeVector) { - QVector internalVector(toInternalNodeVector(modelNodeVector)); + auto internalNodes = toInternalNodeList(modelNodeVector); notifyInstanceChanges([&](AbstractView *view) { - view->instancesCompleted(toModelNodeVector(internalVector, view)); + view->instancesCompleted(toModelNodeList(internalNodes, view)); }); } @@ -707,28 +707,28 @@ void ModelPrivate::notifyInstancesInformationsChange( void ModelPrivate::notifyInstancesRenderImageChanged(const QVector &modelNodeVector) { - QVector internalVector(toInternalNodeVector(modelNodeVector)); + auto internalNodes = toInternalNodeList(modelNodeVector); notifyInstanceChanges([&](AbstractView *view) { - view->instancesRenderImageChanged(toModelNodeVector(internalVector, view)); + view->instancesRenderImageChanged(toModelNodeList(internalNodes, view)); }); } void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector &modelNodeVector) { - QVector internalVector(toInternalNodeVector(modelNodeVector)); + auto internalNodes = toInternalNodeList(modelNodeVector); notifyInstanceChanges([&](AbstractView *view) { - view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view)); + view->instancesPreviewImageChanged(toModelNodeList(internalNodes, view)); }); } void ModelPrivate::notifyInstancesChildrenChanged(const QVector &modelNodeVector) { - QVector internalVector(toInternalNodeVector(modelNodeVector)); + auto internalNodes = toInternalNodeList(modelNodeVector); notifyInstanceChanges([&](AbstractView *view) { - view->instancesChildrenChanged(toModelNodeVector(internalVector, view)); + view->instancesChildrenChanged(toModelNodeList(internalNodes, view)); }); } @@ -802,10 +802,10 @@ void ModelPrivate::notifyRewriterEndTransaction() void ModelPrivate::notifyInstanceToken(const QString &token, int number, const QVector &modelNodeVector) { - QVector internalVector(toInternalNodeVector(modelNodeVector)); + auto internalNodes = toInternalNodeList(modelNodeVector); notifyInstanceChanges([&](AbstractView *view) { - view->instancesToken(token, number, toModelNodeVector(internalVector, view)); + view->instancesToken(token, number, toModelNodeList(internalNodes, view)); }); } @@ -814,7 +814,7 @@ void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QList &modelNodeList, const QList &data) { - QList internalList(toInternalNodeList(modelNodeList)); + auto internalList = toInternalNodeList(modelNodeList); notifyNodeInstanceViewLast([&](AbstractView *view) { view->customNotification(senderView, identifier, toModelNodeList(internalList, view), data); }); @@ -1159,7 +1159,7 @@ void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListProperty *intern }); } -void ModelPrivate::setSelectedNodes(const QList &selectedNodeList) +void ModelPrivate::setSelectedNodes(const FewNodes &selectedNodeList) { auto sortedSelectedList = Utils::filtered(selectedNodeList, [](const auto &node) { return node && node->isValid; @@ -1169,7 +1169,7 @@ void ModelPrivate::setSelectedNodes(const QList &selectedNo sortedSelectedList.erase(std::unique(sortedSelectedList.begin(), sortedSelectedList.end()), sortedSelectedList.end()); - if (sortedSelectedList == m_selectedInternalNodeList) + if (sortedSelectedList == m_selectedInternalNodes) return; auto flowToken = traceToken.tickWithFlow("selected model nodes"_t); @@ -1177,21 +1177,21 @@ void ModelPrivate::setSelectedNodes(const QList &selectedNo if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure std::set_difference(sortedSelectedList.begin(), sortedSelectedList.end(), - m_selectedInternalNodeList.begin(), - m_selectedInternalNodeList.end(), + m_selectedInternalNodes.begin(), + m_selectedInternalNodes.end(), Utils::make_iterator([&](const auto &node) { node->traceToken.tick(flowToken, "select model node"_t); })); } - const QList lastSelectedNodeList = m_selectedInternalNodeList; - m_selectedInternalNodeList = sortedSelectedList; + const auto lastSelectedNodeList = std::move(m_selectedInternalNodes); + m_selectedInternalNodes = sortedSelectedList; if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure std::set_difference(lastSelectedNodeList.begin(), lastSelectedNodeList.end(), - m_selectedInternalNodeList.begin(), - m_selectedInternalNodeList.end(), + m_selectedInternalNodes.begin(), + m_selectedInternalNodes.end(), Utils::make_iterator([&](const auto &node) { node->traceToken.tick(flowToken, "deselect model node"_t); })); @@ -1204,9 +1204,9 @@ void ModelPrivate::clearSelectedNodes() { auto tracer = traceToken.begin("clear selected model nodes"_t); - const QList lastSelectedNodeList = m_selectedInternalNodeList; - m_selectedInternalNodeList.clear(); - changeSelectedNodes(m_selectedInternalNodeList, lastSelectedNodeList); + auto lastSelectedNodeList = m_selectedInternalNodes; + m_selectedInternalNodes.clear(); + changeSelectedNodes(m_selectedInternalNodes, lastSelectedNodeList); } void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const AuxiliaryDataKeyView &key) @@ -1217,7 +1217,8 @@ void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const Au notifyAuxiliaryDataChanged(node, key, QVariant()); } -QList ModelPrivate::toModelNodeList(const QList &nodeList, AbstractView *view) const +QList ModelPrivate::toModelNodeList(std::span nodeList, + AbstractView *view) const { QList modelNodeList; modelNodeList.reserve(nodeList.size()); @@ -1227,19 +1228,9 @@ QList ModelPrivate::toModelNodeList(const QList return modelNodeList; } -QVector ModelPrivate::toModelNodeVector(const QVector &nodeVector, AbstractView *view) const +ModelPrivate::ManyNodes ModelPrivate::toInternalNodeList(const QList &modelNodeList) const { - QVector modelNodeVector; - modelNodeVector.reserve(nodeVector.size()); - for (const InternalNodePointer &node : nodeVector) - modelNodeVector.emplace_back(node, m_model, view); - - return modelNodeVector; -} - -QList ModelPrivate::toInternalNodeList(const QList &modelNodeList) const -{ - QList newNodeList; + ManyNodes newNodeList; newNodeList.reserve(modelNodeList.size()); for (const ModelNode &modelNode : modelNodeList) newNodeList.append(modelNode.internalNode()); @@ -1247,16 +1238,6 @@ QList ModelPrivate::toInternalNodeList(const QList ModelPrivate::toInternalNodeVector(const QVector &modelNodeVector) const -{ - QVector newNodeVector; - newNodeVector.reserve(modelNodeVector.size()); - for (const ModelNode &modelNode : modelNodeVector) - newNodeVector.append(modelNode.internalNode()); - - return newNodeVector; -} - QList ModelPrivate::toInternalProperties(const AbstractProperties &properties) { QList internalProperties; @@ -1290,8 +1271,8 @@ QList> ModelPrivate::toInternalBi return internalProperties; } -void ModelPrivate::changeSelectedNodes(const QList &newSelectedNodeList, - const QList &oldSelectedNodeList) +void ModelPrivate::changeSelectedNodes(const FewNodes &newSelectedNodeList, + const FewNodes &oldSelectedNodeList) { for (const QPointer &view : std::as_const(m_viewList)) { Q_ASSERT(view != nullptr); @@ -1305,14 +1286,15 @@ void ModelPrivate::changeSelectedNodes(const QList &newSele } } -QList ModelPrivate::selectedNodes() const +const ModelPrivate::FewNodes &ModelPrivate::selectedNodes() const { - for (const InternalNodePointer &node : m_selectedInternalNodeList) { + static FewNodes empty; + for (const InternalNodePointer &node : m_selectedInternalNodes) { if (!node->isValid) - return {}; + return empty; } - return m_selectedInternalNodeList; + return m_selectedInternalNodes; } void ModelPrivate::selectNode(const InternalNodePointer &node) @@ -1320,14 +1302,14 @@ void ModelPrivate::selectNode(const InternalNodePointer &node) if (selectedNodes().contains(node)) return; - QList selectedNodeList(selectedNodes()); + FewNodes selectedNodeList(selectedNodes()); selectedNodeList += node; setSelectedNodes(selectedNodeList); } void ModelPrivate::deselectNode(const InternalNodePointer &node) { - QList selectedNodeList(selectedNodes()); + FewNodes selectedNodeList(selectedNodes()); bool isRemoved = selectedNodeList.removeOne(node); if (isRemoved) @@ -1697,16 +1679,17 @@ bool ModelPrivate::hasNodeForInternalId(qint32 internalId) const { return m_internalIdNodeHash.contains(internalId); } -QList ModelPrivate::allNodesOrdered() const + +ModelPrivate::ManyNodes ModelPrivate::allNodesOrdered() const { if (!m_rootInternalNode || !m_rootInternalNode->isValid) return {}; // the nodes must be ordered. - QList nodeList; + ManyNodes nodeList; nodeList.append(m_rootInternalNode); - nodeList.append(m_rootInternalNode->allSubNodes()); + m_rootInternalNode->addSubNodes(nodeList); // FIXME: This is horribly expensive compared to a loop. auto nodesSorted = nodeList; @@ -1716,7 +1699,7 @@ QList ModelPrivate::allNodesOrdered() const return nodeList; } -std::vector ModelPrivate::allNodesUnordered() const +ModelPrivate::ManyNodes ModelPrivate::allNodesUnordered() const { return m_nodes; } @@ -2251,7 +2234,7 @@ void Model::setSelectedModelNodes(const QList &selectedNodeList) unlockedNodes.push_back(modelNode); } - d->setSelectedNodes(toInternalNodeList(unlockedNodes)); + d->setSelectedNodes(toInternalNodeList(unlockedNodes)); } void Model::clearMetaInfoCache() diff --git a/src/plugins/qmldesigner/libs/designercore/model/model_p.h b/src/plugins/qmldesigner/libs/designercore/model/model_p.h index a23a6f52182..030e6104ca2 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/libs/designercore/model/model_p.h @@ -79,6 +79,9 @@ class ModelPrivate : public QObject, friend Internal::WriteLocker; public: + using FewNodes = QVarLengthArray; + using ManyNodes = QVarLengthArray; + ModelPrivate(Model *model, ProjectStorageDependencies m_projectStorageDependencies, const TypeName &type, @@ -226,13 +229,12 @@ public: void notifyRewriterBeginTransaction(); void notifyRewriterEndTransaction(); - void setSelectedNodes(const QList &selectedNodeList); + void setSelectedNodes(const FewNodes &selectedNodeList); void clearSelectedNodes(); - QList selectedNodes() const; + const FewNodes &selectedNodes() const; void selectNode(const InternalNodePointer &node); void deselectNode(const InternalNodePointer &node); - void changeSelectedNodes(const QList &newSelectedNodeList, - const QList &oldSelectedNodeList); + void changeSelectedNodes(const FewNodes &newSelectedNodeList, const FewNodes &oldSelectedNodeList); void setAuxiliaryData(const InternalNodePointer &node, const AuxiliaryDataKeyView &key, @@ -296,8 +298,8 @@ public: InternalNodePointer nodeForInternalId(qint32 internalId) const; bool hasNodeForInternalId(qint32 internalId) const; - std::vector allNodesUnordered() const; - QList allNodesOrdered() const; + ManyNodes allNodesUnordered() const; + ManyNodes allNodesOrdered() const; bool isWriteLocked() const; @@ -330,10 +332,9 @@ private: void removePropertyWithoutNotification(InternalProperty *property); void removeAllSubNodes(const InternalNodePointer &node); void removeNodeFromModel(const InternalNodePointer &node); - QList toInternalNodeList(const QList &modelNodeList) const; - QList toModelNodeList(const QList &nodeList, AbstractView *view) const; - QVector toModelNodeVector(const QVector &nodeVector, AbstractView *view) const; - QVector toInternalNodeVector(const QVector &modelNodeVector) const; + ManyNodes toInternalNodeList(const QList &modelNodeList) const; + QList toModelNodeList(std::span nodeList, + AbstractView *view) const; static QList toInternalProperties(const AbstractProperties &properties); static QList> toInternalBindingProperties(const ModelResourceSet::SetExpressions &setExpressions); @@ -355,10 +356,10 @@ private: Imports m_possibleImportList; Imports m_usedImportList; QList> m_viewList; - QList m_selectedInternalNodeList; + FewNodes m_selectedInternalNodes; QHash m_idNodeHash; QHash m_internalIdNodeHash; - std::vector m_nodes; + ManyNodes m_nodes; InternalNodePointer m_currentStateNode; InternalNodePointer m_rootInternalNode; InternalNodePointer m_currentTimelineNode; diff --git a/src/plugins/qmldesigner/libs/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/libs/designercore/model/modelnode.cpp index a9bf091327e..8eba7549bf5 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/modelnode.cpp @@ -1399,4 +1399,19 @@ QString ModelNode::behaviorPropertyName() const return m_internalNode->behaviorPropertyName; } +template +Result toInternalNodeList(const QList &nodeList) +{ + Result newNodeList; + for (const ModelNode &node : nodeList) + newNodeList.append(node.internalNode()); + + return newNodeList; +} + +template QMLDESIGNERCORE_EXPORT QVarLengthArray toInternalNodeList< + QVarLengthArray>(const QList &nodeList); +template QMLDESIGNERCORE_EXPORT QVarLengthArray toInternalNodeList< + QVarLengthArray>(const QList &nodeList); + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/libs/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/libs/designercore/model/nodelistproperty.cpp index c1462b45dbd..c1d307fab44 100644 --- a/src/plugins/qmldesigner/libs/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/libs/designercore/model/nodelistproperty.cpp @@ -40,12 +40,12 @@ Internal::InternalNodeListPropertyPointer &NodeListProperty::internalNodeListPro return m_internalNodeListProperty; } -static QList internalNodesToModelNodes(const QList &inputList, Model* model, AbstractView *view) +static QList internalNodesToModelNodes(const auto &inputList, Model *model, AbstractView *view) { QList modelNodeList; - for (const Internal::InternalNode::Pointer &internalNode : inputList) { + for (const Internal::InternalNode::Pointer &internalNode : inputList) modelNodeList.append(ModelNode(internalNode, model, view)); - } + return modelNodeList; } diff --git a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp index 85d795a5bcf..6f4fde65f61 100644 --- a/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp +++ b/src/plugins/qmldesigner/libs/designercore/projectstorage/projectstorageupdater.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -273,8 +274,8 @@ void ProjectStorageUpdater::update(Update update) keyValue("qml types paths", qmlTypesPaths)}; Storage::Synchronization::SynchronizationPackage package; - WatchedSourceIdsIds watchedSourceIds{Utils::span{directories}.size()}; - NotUpdatedSourceIds notUpdatedSourceIds{Utils::span{directories}.size()}; + WatchedSourceIdsIds watchedSourceIds{Utils::usize(directories)}; + NotUpdatedSourceIds notUpdatedSourceIds{Utils::usize(directories)}; updateDirectories(directories, package, notUpdatedSourceIds, watchedSourceIds); updateQmlTypes(qmlTypesPaths, package, notUpdatedSourceIds, watchedSourceIds);