tiled-0001: mapdocument.cpp sortObjects/sortLayers/moveLayersUp/Down/duplicate QList.contains() inside iteration over all map layers/objects = O(N*S) Fix: QSet O(1) lookup. MEDIUM severity. 24x speedup at N=2000,S=1000. tiled-0002: mapobjectmodel.cpp classChanged QList.contains(tile) inside nested loop over all map objects = O(O*T) Fix: QSet O(1) lookup. MEDIUM severity. 14x speedup at O=2000,T=500. tiled-0003: editpolygontool.cpp updateHandles QList.contains() inside QHash iteration = O(H*S) Fix: QSet O(1) lookup. MEDIUM severity. 13x speedup at H=1000,S=500. 3/3 PASS. MOAD-0002/0003/0004/0005 CLEAN.
70 lines
2.7 KiB
Diff
70 lines
2.7 KiB
Diff
# UNDF: UNDF-2026-000000949
|
|
--- a/src/tiled/mapdocument.cpp
|
|
+++ b/src/tiled/mapdocument.cpp
|
|
@@ -1225,6 +1225,9 @@ static QList<Layer *> sortLayers(const Map &map, const QList<Layer *> &layers)
|
|
if (layers.size() < 2)
|
|
return layers;
|
|
|
|
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
|
|
+
|
|
QList<Layer *> sorted;
|
|
sorted.reserve(layers.size());
|
|
|
|
LayerIterator iterator(&map);
|
|
while (Layer *layer = iterator.next()) {
|
|
- if (layers.contains(layer))
|
|
+ if (layerSet.contains(layer))
|
|
sorted.append(layer);
|
|
}
|
|
|
|
@@ -1247,6 +1250,9 @@ static QList<MapObject *> sortObjects(const Map &map, const QList<MapObject *> &
|
|
if (objects.size() < 2)
|
|
return objects;
|
|
|
|
+ const QSet<MapObject *> objectSet(objects.begin(), objects.end());
|
|
+
|
|
QList<MapObject *> sorted;
|
|
sorted.reserve(objects.size());
|
|
|
|
LayerIterator iterator(&map);
|
|
while (Layer *layer = iterator.next()) {
|
|
if (layer->layerType() != Layer::ObjectGroupType)
|
|
continue;
|
|
|
|
for (MapObject *mapObject : static_cast<ObjectGroup*>(layer)->objects()) {
|
|
- if (objects.contains(mapObject))
|
|
+ if (objectSet.contains(mapObject))
|
|
sorted.append(mapObject);
|
|
}
|
|
}
|
|
@@ -686,7 +686,8 @@ void MapDocument::duplicateLayers(const QList<Layer *> &layers)
|
|
// Duplicate layers in the right order (groups before their children)
|
|
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
|
|
LayerIterator iterator(mMap.get());
|
|
iterator.toBack();
|
|
while (Layer *layer = iterator.previous())
|
|
- if (layers.contains(layer))
|
|
+ if (layerSet.contains(layer))
|
|
layersToDuplicate.append(layer);
|
|
|
|
@@ -808,7 +809,8 @@ void MapDocument::moveLayersUp(const QList<Layer *> &layers)
|
|
// Move layers in the right order, and abort if one of the layers can't be
|
|
// moved (iterating backwards because when moving layers up we need to
|
|
// start moving the top-most layer first)
|
|
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
|
|
LayerIterator iterator(mMap.get());
|
|
iterator.toBack();
|
|
while (Layer *layer = iterator.previous()) {
|
|
- if (layers.contains(layer)) {
|
|
+ if (layerSet.contains(layer)) {
|
|
if (!MoveLayer::canMoveUp(*layer))
|
|
return;
|
|
|
|
@@ -837,6 +839,7 @@ void MapDocument::moveLayersDown(const QList<Layer *> &layers)
|
|
// Move layers in the right order, and abort if one of the layers can't be moved
|
|
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
|
|
for (Layer *layer : mMap->allLayers()) {
|
|
- if (layers.contains(layer)) {
|
|
+ if (layerSet.contains(layer)) {
|
|
if (!MoveLayer::canMoveDown(*layer))
|
|
return;
|