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 <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2024-09-11 18:26:46 +02:00
parent acb7ef39aa
commit 03c2c3c365
14 changed files with 155 additions and 140 deletions

View File

@@ -328,7 +328,6 @@ private:
Kind m_kind = Kind::Other; Kind m_kind = Kind::Other;
}; };
QMLDESIGNERCORE_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList);
QMLDESIGNERCORE_EXPORT QList<ModelNode> toModelNodeList( QMLDESIGNERCORE_EXPORT QList<ModelNode> toModelNodeList(
Utils::span<const Internal::InternalNodePointer> nodeList, Utils::span<const Internal::InternalNodePointer> nodeList,
Model *model, Model *model,

View File

@@ -45,7 +45,13 @@ class GlobalAnnotationStatus;
class Comment; class Comment;
class Annotation; class Annotation;
QMLDESIGNERCORE_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList); template<typename Result = QVarLengthArray<Internal::InternalNodePointer, 1024>>
QMLDESIGNERCORE_EXPORT Result toInternalNodeList(const QList<ModelNode> &nodeList);
extern template QMLDESIGNERCORE_EXPORT QVarLengthArray<Internal::InternalNodePointer, 1024>
toInternalNodeList<QVarLengthArray<Internal::InternalNodePointer, 1024>>(const QList<ModelNode> &nodeList);
extern template QMLDESIGNERCORE_EXPORT QVarLengthArray<Internal::InternalNodePointer, 32>
toInternalNodeList<QVarLengthArray<Internal::InternalNodePointer, 32>>(const QList<ModelNode> &nodeList);
using PropertyListType = QList<QPair<PropertyName, QVariant> >; using PropertyListType = QList<QPair<PropertyName, QVariant> >;
using AuxiliaryPropertyListType = QList<QPair<AuxiliaryDataKey, QVariant>>; using AuxiliaryPropertyListType = QList<QPair<AuxiliaryDataKey, QVariant>>;
@@ -59,7 +65,9 @@ inline constexpr AuxiliaryDataKeyView transitionExpandedPropery{AuxiliaryDataTyp
class QMLDESIGNERCORE_EXPORT ModelNode class QMLDESIGNERCORE_EXPORT ModelNode
{ {
friend QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const ModelNode &modelNode); friend QMLDESIGNERCORE_EXPORT QDebug operator<<(QDebug debug, const ModelNode &modelNode);
friend QMLDESIGNERCORE_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList); template<typename Result>
friend QMLDESIGNERCORE_EXPORT Result toInternalNodeList(const QList<ModelNode> &nodeList);
friend Model; friend Model;
friend AbstractView; friend AbstractView;
friend NodeListProperty; friend NodeListProperty;

View File

@@ -411,15 +411,6 @@ QList<ModelNode> toModelNodeList(Utils::span<const Internal::InternalNode::Point
return newNodeList; return newNodeList;
} }
QList<Internal::InternalNode::Pointer> toInternalNodeList(const QList<ModelNode> &nodeList)
{
QList<Internal::InternalNode::Pointer> newNodeList;
for (const ModelNode &node : nodeList)
newNodeList.append(node.internalNode());
return newNodeList;
}
/*! /*!
Sets the list of nodes to the actual selected nodes specified by Sets the list of nodes to the actual selected nodes specified by
\a selectedNodeList if the node or its ancestors are not locked. \a selectedNodeList if the node or its ancestors are not locked.
@@ -466,7 +457,7 @@ QList<ModelNode> AbstractView::selectedModelNodes() const
ModelNode AbstractView::firstSelectedModelNode() const ModelNode AbstractView::firstSelectedModelNode() const
{ {
if (hasSelectedModelNodes()) if (hasSelectedModelNodes())
return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(model()->d->selectedNodes().front(), model(), this);
return ModelNode(); return ModelNode();
} }
@@ -474,7 +465,7 @@ ModelNode AbstractView::firstSelectedModelNode() const
ModelNode AbstractView::singleSelectedModelNode() const ModelNode AbstractView::singleSelectedModelNode() const
{ {
if (hasSingleSelectedModelNode()) if (hasSingleSelectedModelNode())
return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(model()->d->selectedNodes().front(), model(), this);
return ModelNode(); return ModelNode();
} }

View File

@@ -120,9 +120,9 @@ PropertyNameViews InternalNode::propertyNameViews() const
return CoreUtils::to<PropertyNameViews>(m_nameProperties | std::views::keys); return CoreUtils::to<PropertyNameViews>(m_nameProperties | std::views::keys);
} }
QList<InternalNode::Pointer> InternalNode::allSubNodes() const InternalNode::ManyNodes InternalNode::allSubNodes() const
{ {
QList<InternalNode::Pointer> nodes; ManyNodes nodes;
nodes.reserve(1024); nodes.reserve(1024);
addSubNodes(nodes); addSubNodes(nodes);
@@ -130,7 +130,7 @@ QList<InternalNode::Pointer> InternalNode::allSubNodes() const
return nodes; return nodes;
} }
void InternalNode::addSubNodes(QList<InternalNodePointer> &nodes, const InternalProperty *property) void InternalNode::addSubNodes(ManyNodes &nodes, const InternalProperty *property)
{ {
switch (property->type()) { switch (property->type()) {
case PropertyType::NodeList: case PropertyType::NodeList:
@@ -148,24 +148,30 @@ void InternalNode::addSubNodes(QList<InternalNodePointer> &nodes, const Internal
} }
} }
void InternalNode::addSubNodes(QList<InternalNodePointer> &nodes) const void InternalNode::addSubNodes(ManyNodes &nodes) const
{ {
for (const auto &entry : m_nameProperties) for (const auto &entry : m_nameProperties)
addSubNodes(nodes, entry.second.get()); addSubNodes(nodes, entry.second.get());
} }
void InternalNode::addDirectSubNodes(QList<InternalNodePointer> &nodes) const void InternalNode::addDirectSubNodes(ManyNodes &nodes) const
{ {
for (const auto &entry : m_nameProperties) for (const auto &entry : m_nameProperties)
addDirectSubNodes(nodes, entry.second.get()); addDirectSubNodes(nodes, entry.second.get());
} }
void InternalNode::addDirectSubNodes(QList<InternalNodePointer> &nodes, namespace {
const InternalProperty *property) 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()) { switch (property->type()) {
case PropertyType::NodeList: case PropertyType::NodeList:
nodes.append(property->to<PropertyType::NodeList>()->nodes()); append(nodes, property->to<PropertyType::NodeList>()->nodes());
break; break;
case PropertyType::Node: case PropertyType::Node:
nodes.append(property->to<PropertyType::Node>()->node()); nodes.append(property->to<PropertyType::Node>()->node());
@@ -179,9 +185,9 @@ void InternalNode::addDirectSubNodes(QList<InternalNodePointer> &nodes,
} }
} }
QList<InternalNode::Pointer> InternalNode::allDirectSubNodes() const InternalNode::ManyNodes InternalNode::allDirectSubNodes() const
{ {
QList<InternalNode::Pointer> nodes; ManyNodes nodes;
nodes.reserve(96); nodes.reserve(96);
addDirectSubNodes(nodes); addDirectSubNodes(nodes);

View File

@@ -50,6 +50,8 @@ class InternalNode : public std::enable_shared_from_this<InternalNode>
public: public:
using Pointer = std::shared_ptr<InternalNode>; using Pointer = std::shared_ptr<InternalNode>;
using WeakPointer = std::weak_ptr<InternalNode>; using WeakPointer = std::weak_ptr<InternalNode>;
using FewNodes = QVarLengthArray<Pointer, 32>;
using ManyNodes = QVarLengthArray<Pointer, 1024>;
explicit InternalNode(TypeNameView typeName, explicit InternalNode(TypeNameView typeName,
int majorVersion, int majorVersion,
@@ -193,12 +195,12 @@ public:
bool hasProperties() const { return m_nameProperties.size(); } bool hasProperties() const { return m_nameProperties.size(); }
QList<InternalNode::Pointer> allSubNodes() const; ManyNodes allSubNodes() const;
QList<InternalNode::Pointer> allDirectSubNodes() const; ManyNodes allDirectSubNodes() const;
void addSubNodes(QList<InternalNodePointer> &nodes) const; void addSubNodes(ManyNodes &nodes) const;
void addDirectSubNodes(QList<InternalNodePointer> &nodes) const; void addDirectSubNodes(ManyNodes &nodes) const;
static void addSubNodes(QList<InternalNodePointer> &nodes, const InternalProperty *property); static void addSubNodes(ManyNodes &nodes, const InternalProperty *property);
static void addDirectSubNodes(QList<InternalNodePointer> &nodes, const InternalProperty *property); static void addDirectSubNodes(ManyNodes &nodes, const InternalProperty *property);
friend bool operator<(const InternalNode::Pointer &firstNode, friend bool operator<(const InternalNode::Pointer &firstNode,
const InternalNode::Pointer &secondNode) const InternalNode::Pointer &secondNode)

View File

@@ -21,12 +21,12 @@ bool InternalNodeListProperty::isValid() const
bool InternalNodeListProperty::isEmpty() const bool InternalNodeListProperty::isEmpty() const
{ {
return m_nodeList.isEmpty(); return m_nodes.isEmpty();
} }
int InternalNodeListProperty::count() const int InternalNodeListProperty::count() const
{ {
return m_nodeList.size(); return m_nodes.size();
} }
int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const
@@ -34,53 +34,54 @@ int InternalNodeListProperty::indexOf(const InternalNode::Pointer &node) const
if (!node) if (!node)
return -1; return -1;
return m_nodeList.indexOf(node); return m_nodes.indexOf(node);
} }
void InternalNodeListProperty::add(const InternalNode::Pointer &internalNode) 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); auto flowToken = traceToken.tickWithFlow("add node"_t);
internalNode->traceToken.tick(flowToken, "node added"_t); internalNode->traceToken.tick(flowToken, "node added"_t);
m_nodeList.append(internalNode); m_nodes.append(internalNode);
} }
void InternalNodeListProperty::remove(const InternalNodePointer &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); auto flowToken = traceToken.tickWithFlow("remove node"_t);
internalNode->traceToken.tick(flowToken, "node removed"_t); internalNode->traceToken.tick(flowToken, "node removed"_t);
m_nodeList.removeAll(internalNode); m_nodes.removeAll(internalNode);
} }
const QList<InternalNode::Pointer> &InternalNodeListProperty::nodeList() const const InternalNodeListProperty::FewNodes &InternalNodeListProperty::nodeList() const
{ {
return m_nodeList; return m_nodes;
} }
void InternalNodeListProperty::slide(int from, int to) void InternalNodeListProperty::slide(int from, int to)
{ {
traceToken.tick("slide"_t, keyValue("from", from), keyValue("to", to)); traceToken.tick("slide"_t, keyValue("from", from), keyValue("to", to));
InternalNode::Pointer internalNode = m_nodeList.takeAt(from); InternalNode::Pointer internalNode = m_nodes.at(from);
m_nodeList.insert(to, internalNode); m_nodes.remove(from);
m_nodes.insert(to, internalNode);
} }
void InternalNodeListProperty::addSubNodes(QList<InternalNodePointer> &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); container.push_back(node);
node->addSubNodes(container); node->addSubNodes(container);
} }
} }
QList<InternalNode::Pointer> InternalNodeListProperty::allSubNodes() const InternalNodeListProperty::ManyNodes InternalNodeListProperty::allSubNodes() const
{ {
QList<InternalNode::Pointer> nodes; ManyNodes nodes;
nodes.reserve(1024); nodes.reserve(1024);
addSubNodes(nodes); addSubNodes(nodes);

View File

@@ -15,6 +15,9 @@ class InternalNodeListProperty final : public InternalNodeAbstractProperty
{ {
public: public:
using Pointer = std::shared_ptr<InternalNodeListProperty>; using Pointer = std::shared_ptr<InternalNodeListProperty>;
using FewNodes = QVarLengthArray<InternalNodePointer, 32>;
using ManyNodes = QVarLengthArray<InternalNodePointer, 1024>;
static constexpr PropertyType type = PropertyType::NodeList; static constexpr PropertyType type = PropertyType::NodeList;
InternalNodeListProperty(PropertyNameView name, const InternalNodePointer &propertyOwner); InternalNodeListProperty(PropertyNameView name, const InternalNodePointer &propertyOwner);
@@ -22,46 +25,49 @@ public:
bool isValid() const override; bool isValid() const override;
bool isEmpty() 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 count() const override;
int indexOf(const InternalNodePointer &node) const override; int indexOf(const InternalNodePointer &node) const override;
const InternalNodePointer &at(int index) const const InternalNodePointer &at(int index) const
{ {
Q_ASSERT(index >= 0 && index < m_nodeList.size()); Q_ASSERT(index >= 0 && index < m_nodes.size());
return m_nodeList[index]; return m_nodes[index];
} }
InternalNodePointer &at(int index) InternalNodePointer &at(int index)
{ {
Q_ASSERT(index >= 0 && index < m_nodeList.size()); Q_ASSERT(index >= 0 && index < m_nodes.size());
return m_nodeList[index]; return m_nodes[index];
} }
InternalNodePointer &find(InternalNodePointer node) 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; return *found;
} }
QList<InternalNodePointer> allSubNodes() const; ManyNodes allSubNodes() const;
const QList<InternalNodePointer> &nodeList() const; const FewNodes &nodeList() const;
void slide(int from, int to); void slide(int from, int to);
void addSubNodes(QList<InternalNodePointer> &container) const; void addSubNodes(ManyNodes &container) const;
QList<InternalNodePointer>::iterator begin() { return m_nodeList.begin(); } FewNodes::iterator begin() { return m_nodes.begin(); }
QList<InternalNodePointer>::iterator end() { return m_nodeList.end(); } FewNodes::iterator end() { return m_nodes.end(); }
const QList<InternalNodePointer> &nodes() const { return m_nodeList; } const FewNodes &nodes() const { return m_nodes; }
protected: protected:
void add(const InternalNodePointer &node) override; void add(const InternalNodePointer &node) override;
void remove(const InternalNodePointer &node) override; void remove(const InternalNodePointer &node) override;
private: private:
QList<InternalNodePointer> m_nodeList; FewNodes m_nodes;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -60,9 +60,9 @@ void InternalNodeProperty::add(const InternalNode::Pointer &node)
m_node = node; m_node = node;
} }
QList<InternalNode::Pointer> InternalNodeProperty::allSubNodes() const InternalNodeProperty::ManyNodes InternalNodeProperty::allSubNodes() const
{ {
QList<InternalNode::Pointer> nodes; ManyNodes nodes;
nodes.reserve(1024); nodes.reserve(1024);
addSubNodes(nodes); addSubNodes(nodes);
@@ -70,7 +70,7 @@ QList<InternalNode::Pointer> InternalNodeProperty::allSubNodes() const
return nodes; return nodes;
} }
void InternalNodeProperty::addSubNodes(QList<InternalNodePointer> &container) const void InternalNodeProperty::addSubNodes(ManyNodes &container) const
{ {
container.push_back(m_node); container.push_back(m_node);
m_node->addSubNodes(container); m_node->addSubNodes(container);

View File

@@ -12,6 +12,8 @@ class InternalNodeProperty : public InternalNodeAbstractProperty
{ {
public: public:
using Pointer = std::shared_ptr<InternalNodeProperty>; using Pointer = std::shared_ptr<InternalNodeProperty>;
using ManyNodes = QVarLengthArray<InternalNodePointer, 1024>;
static constexpr PropertyType type = PropertyType::Node; static constexpr PropertyType type = PropertyType::Node;
InternalNodeProperty(PropertyNameView name, const InternalNodePointer &node); InternalNodeProperty(PropertyNameView name, const InternalNodePointer &node);
@@ -21,8 +23,8 @@ public:
int count() const override; int count() const override;
int indexOf(const InternalNodePointer &node) const override; int indexOf(const InternalNodePointer &node) const override;
QList<InternalNodePointer> allSubNodes() const; ManyNodes allSubNodes() const;
void addSubNodes(QList<InternalNodePointer> &container) const; void addSubNodes(ManyNodes &container) const;
const InternalNodePointer &node() const { return m_node; } const InternalNodePointer &node() const { return m_node; }

View File

@@ -367,12 +367,12 @@ void ModelPrivate::removeNodeFromModel(const InternalNodePointer &node)
node->resetParentProperty(); node->resetParentProperty();
m_selectedInternalNodeList.removeAll(node); m_selectedInternalNodes.removeAll(node);
if (!node->id.isEmpty()) if (!node->id.isEmpty())
m_idNodeHash.remove(node->id); m_idNodeHash.remove(node->id);
node->isValid = false; node->isValid = false;
node->traceToken.end(); node->traceToken.end();
std::erase(m_nodes, node); m_nodes.removeOne(node);
m_internalIdNodeHash.remove(node->internalId); m_internalIdNodeHash.remove(node->internalId);
} }
@@ -677,10 +677,10 @@ void ModelPrivate::notifyInstanceErrorChange(const QVector<qint32> &instanceIds)
void ModelPrivate::notifyInstancesCompleted(const QVector<ModelNode> &modelNodeVector) void ModelPrivate::notifyInstancesCompleted(const QVector<ModelNode> &modelNodeVector)
{ {
QVector<InternalNodePointer> internalVector(toInternalNodeVector(modelNodeVector)); auto internalNodes = toInternalNodeList(modelNodeVector);
notifyInstanceChanges([&](AbstractView *view) { 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<ModelNode> &modelNodeVector) void ModelPrivate::notifyInstancesRenderImageChanged(const QVector<ModelNode> &modelNodeVector)
{ {
QVector<InternalNodePointer> internalVector(toInternalNodeVector(modelNodeVector)); auto internalNodes = toInternalNodeList(modelNodeVector);
notifyInstanceChanges([&](AbstractView *view) { notifyInstanceChanges([&](AbstractView *view) {
view->instancesRenderImageChanged(toModelNodeVector(internalVector, view)); view->instancesRenderImageChanged(toModelNodeList(internalNodes, view));
}); });
} }
void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector<ModelNode> &modelNodeVector) void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector<ModelNode> &modelNodeVector)
{ {
QVector<InternalNodePointer> internalVector(toInternalNodeVector(modelNodeVector)); auto internalNodes = toInternalNodeList(modelNodeVector);
notifyInstanceChanges([&](AbstractView *view) { notifyInstanceChanges([&](AbstractView *view) {
view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view)); view->instancesPreviewImageChanged(toModelNodeList(internalNodes, view));
}); });
} }
void ModelPrivate::notifyInstancesChildrenChanged(const QVector<ModelNode> &modelNodeVector) void ModelPrivate::notifyInstancesChildrenChanged(const QVector<ModelNode> &modelNodeVector)
{ {
QVector<InternalNodePointer> internalVector(toInternalNodeVector(modelNodeVector)); auto internalNodes = toInternalNodeList(modelNodeVector);
notifyInstanceChanges([&](AbstractView *view) { 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, void ModelPrivate::notifyInstanceToken(const QString &token, int number,
const QVector<ModelNode> &modelNodeVector) const QVector<ModelNode> &modelNodeVector)
{ {
QVector<InternalNodePointer> internalVector(toInternalNodeVector(modelNodeVector)); auto internalNodes = toInternalNodeList(modelNodeVector);
notifyInstanceChanges([&](AbstractView *view) { 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<ModelNode> &modelNodeList, const QList<ModelNode> &modelNodeList,
const QList<QVariant> &data) const QList<QVariant> &data)
{ {
QList<InternalNodePointer> internalList(toInternalNodeList(modelNodeList)); auto internalList = toInternalNodeList(modelNodeList);
notifyNodeInstanceViewLast([&](AbstractView *view) { notifyNodeInstanceViewLast([&](AbstractView *view) {
view->customNotification(senderView, identifier, toModelNodeList(internalList, view), data); view->customNotification(senderView, identifier, toModelNodeList(internalList, view), data);
}); });
@@ -1159,7 +1159,7 @@ void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListProperty *intern
}); });
} }
void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList) void ModelPrivate::setSelectedNodes(const FewNodes &selectedNodeList)
{ {
auto sortedSelectedList = Utils::filtered(selectedNodeList, [](const auto &node) { auto sortedSelectedList = Utils::filtered(selectedNodeList, [](const auto &node) {
return node && node->isValid; return node && node->isValid;
@@ -1169,7 +1169,7 @@ void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNo
sortedSelectedList.erase(std::unique(sortedSelectedList.begin(), sortedSelectedList.end()), sortedSelectedList.erase(std::unique(sortedSelectedList.begin(), sortedSelectedList.end()),
sortedSelectedList.end()); sortedSelectedList.end());
if (sortedSelectedList == m_selectedInternalNodeList) if (sortedSelectedList == m_selectedInternalNodes)
return; return;
auto flowToken = traceToken.tickWithFlow("selected model nodes"_t); auto flowToken = traceToken.tickWithFlow("selected model nodes"_t);
@@ -1177,21 +1177,21 @@ void ModelPrivate::setSelectedNodes(const QList<InternalNodePointer> &selectedNo
if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure
std::set_difference(sortedSelectedList.begin(), std::set_difference(sortedSelectedList.begin(),
sortedSelectedList.end(), sortedSelectedList.end(),
m_selectedInternalNodeList.begin(), m_selectedInternalNodes.begin(),
m_selectedInternalNodeList.end(), m_selectedInternalNodes.end(),
Utils::make_iterator([&](const auto &node) { Utils::make_iterator([&](const auto &node) {
node->traceToken.tick(flowToken, "select model node"_t); node->traceToken.tick(flowToken, "select model node"_t);
})); }));
} }
const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList; const auto lastSelectedNodeList = std::move(m_selectedInternalNodes);
m_selectedInternalNodeList = sortedSelectedList; m_selectedInternalNodes = sortedSelectedList;
if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure if constexpr (decltype(traceToken)::categoryIsActive()) { // the compiler should optimize it away but to be sure
std::set_difference(lastSelectedNodeList.begin(), std::set_difference(lastSelectedNodeList.begin(),
lastSelectedNodeList.end(), lastSelectedNodeList.end(),
m_selectedInternalNodeList.begin(), m_selectedInternalNodes.begin(),
m_selectedInternalNodeList.end(), m_selectedInternalNodes.end(),
Utils::make_iterator([&](const auto &node) { Utils::make_iterator([&](const auto &node) {
node->traceToken.tick(flowToken, "deselect model node"_t); node->traceToken.tick(flowToken, "deselect model node"_t);
})); }));
@@ -1204,9 +1204,9 @@ void ModelPrivate::clearSelectedNodes()
{ {
auto tracer = traceToken.begin("clear selected model nodes"_t); auto tracer = traceToken.begin("clear selected model nodes"_t);
const QList<InternalNodePointer> lastSelectedNodeList = m_selectedInternalNodeList; auto lastSelectedNodeList = m_selectedInternalNodes;
m_selectedInternalNodeList.clear(); m_selectedInternalNodes.clear();
changeSelectedNodes(m_selectedInternalNodeList, lastSelectedNodeList); changeSelectedNodes(m_selectedInternalNodes, lastSelectedNodeList);
} }
void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const AuxiliaryDataKeyView &key) 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()); notifyAuxiliaryDataChanged(node, key, QVariant());
} }
QList<ModelNode> ModelPrivate::toModelNodeList(const QList<InternalNodePointer> &nodeList, AbstractView *view) const QList<ModelNode> ModelPrivate::toModelNodeList(std::span<const InternalNodePointer> nodeList,
AbstractView *view) const
{ {
QList<ModelNode> modelNodeList; QList<ModelNode> modelNodeList;
modelNodeList.reserve(nodeList.size()); modelNodeList.reserve(nodeList.size());
@@ -1227,19 +1228,9 @@ QList<ModelNode> ModelPrivate::toModelNodeList(const QList<InternalNodePointer>
return modelNodeList; return modelNodeList;
} }
QVector<ModelNode> ModelPrivate::toModelNodeVector(const QVector<InternalNodePointer> &nodeVector, AbstractView *view) const ModelPrivate::ManyNodes ModelPrivate::toInternalNodeList(const QList<ModelNode> &modelNodeList) const
{ {
QVector<ModelNode> modelNodeVector; ManyNodes newNodeList;
modelNodeVector.reserve(nodeVector.size());
for (const InternalNodePointer &node : nodeVector)
modelNodeVector.emplace_back(node, m_model, view);
return modelNodeVector;
}
QList<InternalNodePointer> ModelPrivate::toInternalNodeList(const QList<ModelNode> &modelNodeList) const
{
QList<InternalNodePointer> newNodeList;
newNodeList.reserve(modelNodeList.size()); newNodeList.reserve(modelNodeList.size());
for (const ModelNode &modelNode : modelNodeList) for (const ModelNode &modelNode : modelNodeList)
newNodeList.append(modelNode.internalNode()); newNodeList.append(modelNode.internalNode());
@@ -1247,16 +1238,6 @@ QList<InternalNodePointer> ModelPrivate::toInternalNodeList(const QList<ModelNod
return newNodeList; return newNodeList;
} }
QVector<InternalNodePointer> ModelPrivate::toInternalNodeVector(const QVector<ModelNode> &modelNodeVector) const
{
QVector<InternalNodePointer> newNodeVector;
newNodeVector.reserve(modelNodeVector.size());
for (const ModelNode &modelNode : modelNodeVector)
newNodeVector.append(modelNode.internalNode());
return newNodeVector;
}
QList<InternalProperty *> ModelPrivate::toInternalProperties(const AbstractProperties &properties) QList<InternalProperty *> ModelPrivate::toInternalProperties(const AbstractProperties &properties)
{ {
QList<InternalProperty *> internalProperties; QList<InternalProperty *> internalProperties;
@@ -1290,8 +1271,8 @@ QList<std::tuple<InternalBindingProperty *, QString>> ModelPrivate::toInternalBi
return internalProperties; return internalProperties;
} }
void ModelPrivate::changeSelectedNodes(const QList<InternalNodePointer> &newSelectedNodeList, void ModelPrivate::changeSelectedNodes(const FewNodes &newSelectedNodeList,
const QList<InternalNodePointer> &oldSelectedNodeList) const FewNodes &oldSelectedNodeList)
{ {
for (const QPointer<AbstractView> &view : std::as_const(m_viewList)) { for (const QPointer<AbstractView> &view : std::as_const(m_viewList)) {
Q_ASSERT(view != nullptr); Q_ASSERT(view != nullptr);
@@ -1305,14 +1286,15 @@ void ModelPrivate::changeSelectedNodes(const QList<InternalNodePointer> &newSele
} }
} }
QList<InternalNodePointer> 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) if (!node->isValid)
return {}; return empty;
} }
return m_selectedInternalNodeList; return m_selectedInternalNodes;
} }
void ModelPrivate::selectNode(const InternalNodePointer &node) void ModelPrivate::selectNode(const InternalNodePointer &node)
@@ -1320,14 +1302,14 @@ void ModelPrivate::selectNode(const InternalNodePointer &node)
if (selectedNodes().contains(node)) if (selectedNodes().contains(node))
return; return;
QList<InternalNodePointer> selectedNodeList(selectedNodes()); FewNodes selectedNodeList(selectedNodes());
selectedNodeList += node; selectedNodeList += node;
setSelectedNodes(selectedNodeList); setSelectedNodes(selectedNodeList);
} }
void ModelPrivate::deselectNode(const InternalNodePointer &node) void ModelPrivate::deselectNode(const InternalNodePointer &node)
{ {
QList<InternalNodePointer> selectedNodeList(selectedNodes()); FewNodes selectedNodeList(selectedNodes());
bool isRemoved = selectedNodeList.removeOne(node); bool isRemoved = selectedNodeList.removeOne(node);
if (isRemoved) if (isRemoved)
@@ -1697,16 +1679,17 @@ bool ModelPrivate::hasNodeForInternalId(qint32 internalId) const
{ {
return m_internalIdNodeHash.contains(internalId); return m_internalIdNodeHash.contains(internalId);
} }
QList<InternalNodePointer> ModelPrivate::allNodesOrdered() const
ModelPrivate::ManyNodes ModelPrivate::allNodesOrdered() const
{ {
if (!m_rootInternalNode || !m_rootInternalNode->isValid) if (!m_rootInternalNode || !m_rootInternalNode->isValid)
return {}; return {};
// the nodes must be ordered. // the nodes must be ordered.
QList<InternalNodePointer> nodeList; ManyNodes nodeList;
nodeList.append(m_rootInternalNode); nodeList.append(m_rootInternalNode);
nodeList.append(m_rootInternalNode->allSubNodes()); m_rootInternalNode->addSubNodes(nodeList);
// FIXME: This is horribly expensive compared to a loop. // FIXME: This is horribly expensive compared to a loop.
auto nodesSorted = nodeList; auto nodesSorted = nodeList;
@@ -1716,7 +1699,7 @@ QList<InternalNodePointer> ModelPrivate::allNodesOrdered() const
return nodeList; return nodeList;
} }
std::vector<InternalNodePointer> ModelPrivate::allNodesUnordered() const ModelPrivate::ManyNodes ModelPrivate::allNodesUnordered() const
{ {
return m_nodes; return m_nodes;
} }
@@ -2251,7 +2234,7 @@ void Model::setSelectedModelNodes(const QList<ModelNode> &selectedNodeList)
unlockedNodes.push_back(modelNode); unlockedNodes.push_back(modelNode);
} }
d->setSelectedNodes(toInternalNodeList(unlockedNodes)); d->setSelectedNodes(toInternalNodeList<Internal::InternalNode::FewNodes>(unlockedNodes));
} }
void Model::clearMetaInfoCache() void Model::clearMetaInfoCache()

View File

@@ -79,6 +79,9 @@ class ModelPrivate : public QObject,
friend Internal::WriteLocker; friend Internal::WriteLocker;
public: public:
using FewNodes = QVarLengthArray<InternalNodePointer, 32>;
using ManyNodes = QVarLengthArray<InternalNodePointer, 1024>;
ModelPrivate(Model *model, ModelPrivate(Model *model,
ProjectStorageDependencies m_projectStorageDependencies, ProjectStorageDependencies m_projectStorageDependencies,
const TypeName &type, const TypeName &type,
@@ -226,13 +229,12 @@ public:
void notifyRewriterBeginTransaction(); void notifyRewriterBeginTransaction();
void notifyRewriterEndTransaction(); void notifyRewriterEndTransaction();
void setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList); void setSelectedNodes(const FewNodes &selectedNodeList);
void clearSelectedNodes(); void clearSelectedNodes();
QList<InternalNodePointer> selectedNodes() const; const FewNodes &selectedNodes() const;
void selectNode(const InternalNodePointer &node); void selectNode(const InternalNodePointer &node);
void deselectNode(const InternalNodePointer &node); void deselectNode(const InternalNodePointer &node);
void changeSelectedNodes(const QList<InternalNodePointer> &newSelectedNodeList, void changeSelectedNodes(const FewNodes &newSelectedNodeList, const FewNodes &oldSelectedNodeList);
const QList<InternalNodePointer> &oldSelectedNodeList);
void setAuxiliaryData(const InternalNodePointer &node, void setAuxiliaryData(const InternalNodePointer &node,
const AuxiliaryDataKeyView &key, const AuxiliaryDataKeyView &key,
@@ -296,8 +298,8 @@ public:
InternalNodePointer nodeForInternalId(qint32 internalId) const; InternalNodePointer nodeForInternalId(qint32 internalId) const;
bool hasNodeForInternalId(qint32 internalId) const; bool hasNodeForInternalId(qint32 internalId) const;
std::vector<InternalNodePointer> allNodesUnordered() const; ManyNodes allNodesUnordered() const;
QList<InternalNodePointer> allNodesOrdered() const; ManyNodes allNodesOrdered() const;
bool isWriteLocked() const; bool isWriteLocked() const;
@@ -330,10 +332,9 @@ private:
void removePropertyWithoutNotification(InternalProperty *property); void removePropertyWithoutNotification(InternalProperty *property);
void removeAllSubNodes(const InternalNodePointer &node); void removeAllSubNodes(const InternalNodePointer &node);
void removeNodeFromModel(const InternalNodePointer &node); void removeNodeFromModel(const InternalNodePointer &node);
QList<InternalNodePointer> toInternalNodeList(const QList<ModelNode> &modelNodeList) const; ManyNodes toInternalNodeList(const QList<ModelNode> &modelNodeList) const;
QList<ModelNode> toModelNodeList(const QList<InternalNodePointer> &nodeList, AbstractView *view) const; QList<ModelNode> toModelNodeList(std::span<const InternalNodePointer> nodeList,
QVector<ModelNode> toModelNodeVector(const QVector<InternalNodePointer> &nodeVector, AbstractView *view) const; AbstractView *view) const;
QVector<InternalNodePointer> toInternalNodeVector(const QVector<ModelNode> &modelNodeVector) const;
static QList<InternalProperty *> toInternalProperties(const AbstractProperties &properties); static QList<InternalProperty *> toInternalProperties(const AbstractProperties &properties);
static QList<std::tuple<QmlDesigner::Internal::InternalBindingProperty *, QString>> static QList<std::tuple<QmlDesigner::Internal::InternalBindingProperty *, QString>>
toInternalBindingProperties(const ModelResourceSet::SetExpressions &setExpressions); toInternalBindingProperties(const ModelResourceSet::SetExpressions &setExpressions);
@@ -355,10 +356,10 @@ private:
Imports m_possibleImportList; Imports m_possibleImportList;
Imports m_usedImportList; Imports m_usedImportList;
QList<QPointer<AbstractView>> m_viewList; QList<QPointer<AbstractView>> m_viewList;
QList<InternalNodePointer> m_selectedInternalNodeList; FewNodes m_selectedInternalNodes;
QHash<QString,InternalNodePointer> m_idNodeHash; QHash<QString,InternalNodePointer> m_idNodeHash;
QHash<qint32, InternalNodePointer> m_internalIdNodeHash; QHash<qint32, InternalNodePointer> m_internalIdNodeHash;
std::vector<InternalNodePointer> m_nodes; ManyNodes m_nodes;
InternalNodePointer m_currentStateNode; InternalNodePointer m_currentStateNode;
InternalNodePointer m_rootInternalNode; InternalNodePointer m_rootInternalNode;
InternalNodePointer m_currentTimelineNode; InternalNodePointer m_currentTimelineNode;

View File

@@ -1399,4 +1399,19 @@ QString ModelNode::behaviorPropertyName() const
return m_internalNode->behaviorPropertyName; return m_internalNode->behaviorPropertyName;
} }
template<typename Result>
Result toInternalNodeList(const QList<ModelNode> &nodeList)
{
Result newNodeList;
for (const ModelNode &node : nodeList)
newNodeList.append(node.internalNode());
return newNodeList;
}
template QMLDESIGNERCORE_EXPORT QVarLengthArray<Internal::InternalNodePointer, 1024> toInternalNodeList<
QVarLengthArray<Internal::InternalNodePointer, 1024>>(const QList<ModelNode> &nodeList);
template QMLDESIGNERCORE_EXPORT QVarLengthArray<Internal::InternalNodePointer, 32> toInternalNodeList<
QVarLengthArray<Internal::InternalNodePointer, 32>>(const QList<ModelNode> &nodeList);
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -40,12 +40,12 @@ Internal::InternalNodeListPropertyPointer &NodeListProperty::internalNodeListPro
return m_internalNodeListProperty; return m_internalNodeListProperty;
} }
static QList<ModelNode> internalNodesToModelNodes(const QList<Internal::InternalNode::Pointer> &inputList, Model* model, AbstractView *view) static QList<ModelNode> internalNodesToModelNodes(const auto &inputList, Model *model, AbstractView *view)
{ {
QList<ModelNode> modelNodeList; QList<ModelNode> modelNodeList;
for (const Internal::InternalNode::Pointer &internalNode : inputList) { for (const Internal::InternalNode::Pointer &internalNode : inputList)
modelNodeList.append(ModelNode(internalNode, model, view)); modelNodeList.append(ModelNode(internalNode, model, view));
}
return modelNodeList; return modelNodeList;
} }

View File

@@ -15,6 +15,7 @@
#include <sqlitedatabase.h> #include <sqlitedatabase.h>
#include <tracing/qmldesignertracing.h> #include <tracing/qmldesignertracing.h>
#include <utils/algorithm.h>
#include <utils/set_algorithm.h> #include <utils/set_algorithm.h>
#include <QDirIterator> #include <QDirIterator>
@@ -273,8 +274,8 @@ void ProjectStorageUpdater::update(Update update)
keyValue("qml types paths", qmlTypesPaths)}; keyValue("qml types paths", qmlTypesPaths)};
Storage::Synchronization::SynchronizationPackage package; Storage::Synchronization::SynchronizationPackage package;
WatchedSourceIdsIds watchedSourceIds{Utils::span{directories}.size()}; WatchedSourceIdsIds watchedSourceIds{Utils::usize(directories)};
NotUpdatedSourceIds notUpdatedSourceIds{Utils::span{directories}.size()}; NotUpdatedSourceIds notUpdatedSourceIds{Utils::usize(directories)};
updateDirectories(directories, package, notUpdatedSourceIds, watchedSourceIds); updateDirectories(directories, package, notUpdatedSourceIds, watchedSourceIds);
updateQmlTypes(qmlTypesPaths, package, notUpdatedSourceIds, watchedSourceIds); updateQmlTypes(qmlTypesPaths, package, notUpdatedSourceIds, watchedSourceIds);