Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2017-05-15 10:41:36 +0300
committerMike Krüger <mkrueger@xamarin.com>2017-05-15 10:41:36 +0300
commit6404a7d2ab9580c5a424eb14ae2bea47913a4bb0 (patch)
tree7a57f6c76e5d1bca133b707a4189cc06c480398c /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor
parentbfabca2fe464297a93e22673c8d34880f36d8d83 (diff)
[Ide] Optimized IDE SegmentTree implementation as well.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs31
1 files changed, 18 insertions, 13 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs
index 81c4d8790f..2b05291074 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Editor/SegmentTree.cs
@@ -117,11 +117,13 @@ namespace MonoDevelop.Ide.Editor
{
if (tree.Root == null)
yield break;
- var intervalStack = new Stack<Interval> ();
- intervalStack.Push (new Interval (tree.Root, offset, offset + length));
- while (intervalStack.Count > 0) {
- var interval = intervalStack.Pop ();
- if (interval.end < 0)
+ var intervalStack = new Interval (null, tree.Root, offset, offset + length);
+ while (true) {
+ var interval = intervalStack;
+ if (interval == null)
+ break;
+ intervalStack = intervalStack.tail;
+ if (interval.end < 0)
continue;
var node = interval.node;
@@ -133,21 +135,21 @@ namespace MonoDevelop.Ide.Editor
nodeEnd -= leftNode.TotalLength;
}
- if (node.DistanceToMaxEnd < nodeStart)
+ if (node.DistanceToMaxEnd < nodeStart)
continue;
if (leftNode != null)
- intervalStack.Push (new Interval (leftNode, interval.start, interval.end));
+ intervalStack = new Interval (intervalStack, leftNode, interval.start, interval.end);
- if (nodeEnd < 0)
+ if (nodeEnd < 0)
continue;
if (nodeStart <= node.Length)
yield return (T)node;
var rightNode = node.Right;
- if (rightNode != null)
- intervalStack.Push (new Interval (rightNode, nodeStart, nodeEnd));
+ if (rightNode != null)
+ intervalStack = new Interval (intervalStack, rightNode, nodeStart, nodeEnd);
}
}
@@ -315,14 +317,17 @@ namespace MonoDevelop.Ide.Editor
const bool Black = false;
const bool Red = true;
-
- struct Interval
+
+ class Interval
{
+ internal Interval tail;
+
internal TreeSegment node;
internal int start, end;
- public Interval (TreeSegment node,int start,int end)
+ public Interval (Interval tail, TreeSegment node, int start, int end)
{
+ this.tail = tail;
this.node = node;
this.start = start;
this.end = end;