Skip to content

Commit 0a39da9

Browse files
committed
perf: replace recursion with iteration
1 parent 20f2501 commit 0a39da9

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
package com.avaloq.tools.ddk.xtext.resource.persistence;
1212

1313
import java.io.IOException;
14+
import java.util.ArrayDeque;
1415
import java.util.ArrayList;
16+
import java.util.Deque;
1517
import java.util.List;
1618

1719
import org.eclipse.emf.common.notify.Adapter;
@@ -80,24 +82,30 @@ static void installProxyNodeModel(final Resource resource) {
8082
ProxyCompositeNode rootNode = installProxyNodeModel(root, idToEObjectMap);
8183
idToEObjectMap.trimToSize();
8284
rootNode.idToEObjectMap = idToEObjectMap;
83-
85+
// System.out.println(resource.getContents().size() + " -> " + idToEObjectMap.size());
8486
if (resource instanceof XtextResource) {
8587
((XtextResource) resource).setParseResult(new ParseResult(root, rootNode, false));
8688
}
8789
}
8890

8991
private static ProxyCompositeNode installProxyNodeModel(final EObject eObject, final List<EObject> map) {
90-
ProxyCompositeNode result = new ProxyCompositeNode();
91-
eObject.eAdapters().add(result);
92+
Deque<EObject> deque = new ArrayDeque<>();
93+
deque.push(eObject);
94+
ProxyCompositeNode rootComposite = new ProxyCompositeNode();
95+
eObject.eAdapters().add(rootComposite);
9296
map.add(eObject);
9397

94-
for (FeatureIterator<EObject> it = (FeatureIterator<EObject>) eObject.eContents().iterator(); it.hasNext();) {
95-
EObject child = it.next();
96-
if (!it.feature().isTransient()) {
97-
installProxyNodeModel(child, map);
98+
while (!deque.isEmpty()) {
99+
for (FeatureIterator<EObject> it = (FeatureIterator<EObject>) deque.pop().eContents().reversed().iterator(); it.hasNext();) {
100+
EObject child = it.next();
101+
if (!it.feature().isTransient()) {
102+
child.eAdapters().add(new ProxyCompositeNode());
103+
map.add(child);
104+
deque.push(child);
105+
}
98106
}
99107
}
100-
return result;
108+
return rootComposite;
101109
}
102110

103111
/**

0 commit comments

Comments
 (0)