This commit is contained in:
Alexey Kudravtsev
2011-09-15 13:10:17 +04:00
parent 0d95fac77b
commit 5faa21d5ca
4 changed files with 26 additions and 29 deletions
@@ -161,8 +161,8 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
if (modCount == treeModCount) {
return deltaUpToRoot;
}
IntervalNode node = this;
IntervalNode treeRoot = myIntervalTree.getRoot();
IntervalNode<E> node = this;
IntervalNode<E> treeRoot = myIntervalTree.getRoot();
if (treeRoot == null) return delta; // someone modified the tree in the meantime
int deltaUp = 0;
boolean allDeltasAreNull = true;
@@ -174,7 +174,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
allDeltasAreNull = node.allDeltasUpAreNull;
break;
}
IntervalNode parent = node.getParent();
IntervalNode<E> parent = node.getParent();
if (parent == null) {
break; // can happen when remove node and explicitly set valid to true (e.g. in RangeMarkerTree)
}
@@ -285,7 +285,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
@NotNull
protected abstract IntervalNode<T> createNewNode(@NotNull T key, int start, int end, boolean greedyToLeft, boolean greedyToRight, int layer);
protected abstract IntervalNode<T> lookupNode(@NotNull T key);
protected abstract void setNode(@NotNull T key, IntervalNode node);
protected abstract void setNode(@NotNull T key, IntervalNode<T> node);
private int compareNodes(@NotNull IntervalNode<T> i1, int delta1, @NotNull IntervalNode<T> i2, int delta2, @NotNull List<IntervalNode<T>> invalid) {
if (!i2.hasAliveKey(false)) {
@@ -560,15 +560,15 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
}
// finds previous in the in-order traversal
private IntervalNode previous(@NotNull IntervalNode node) {
IntervalNode left = node.getLeft();
private IntervalNode<T> previous(@NotNull IntervalNode<T> node) {
IntervalNode<T> left = node.getLeft();
if (left != null) {
while (left.getRight() != null) {
left = left.getRight();
}
return left;
}
IntervalNode parent = node.getParent();
IntervalNode<T> parent = node.getParent();
while (parent != null) {
if (parent.getRight() == node) break;
node = parent;
@@ -775,7 +775,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
T key = root.intervals.get(i).get();
if (key == null) continue;
contains |= key == interval;
IntervalNode node = lookupNode(key);
IntervalNode<T> node = lookupNode(key);
assert node == root : node;
assert node.getTree() == this : node;
}
@@ -783,7 +783,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
assert contains : root.intervals + "; " + interval;
}
IntervalNode e = root;
IntervalNode<T> e = root;
while (e.getParent() != null) e = e.getParent();
assert e == getRoot(); // assert the node belongs to our tree
}
@@ -883,7 +883,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
Color acolor = a.color;
Color dcolor = d.color;
assert !a.isValid() || a.delta == 0 : a.delta;
for (IntervalNode n = a.getLeft(); n != null; n = n.getRight()) {
for (IntervalNode<T> n = a.getLeft(); n != null; n = n.getRight()) {
assert !n.isValid() || n.delta == 0 : n.delta;
}
swapNodes(a, d);
@@ -977,7 +977,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
IntervalNode<T> node2 = node1.getLeft();
IntervalNode<T> node3 = node1.getRight();
IntervalNode parent = node1.getParent();
IntervalNode<T> parent = node1.getParent();
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot();
pushDelta(node1);
pushDelta(node2);
@@ -1003,7 +1003,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
IntervalNode<T> node2 = node1.getLeft();
IntervalNode<T> node3 = node1.getRight();
IntervalNode parent = node1.getParent();
IntervalNode<T> parent = node1.getParent();
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot();
pushDelta(node1);
pushDelta(node2);
@@ -1031,14 +1031,13 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
super.replaceNode(node, child);
if (child != null && myNode.isValid()) {
((IntervalNode)child).changeDelta(myNode.delta);
((IntervalNode<T>)child).changeDelta(myNode.delta);
//todo correct max up to root??
}
}
private void assertAllDeltasAreNull(Node<T> myNode) {
if (myNode == null) return;
IntervalNode node = (IntervalNode)myNode;
private void assertAllDeltasAreNull(IntervalNode<T> node) {
if (node == null) return;
if (!node.isValid()) return;
assert node.delta == 0;
assert node.modCount != modCount || node.allDeltasUpAreNull;
@@ -1080,7 +1079,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
boolean nodeRemoved = node.removeInterval(interval);
assert nodeRemoved || !node.intervals.isEmpty();
IntervalNode insertedNode = addInterval(interval, start, end, greedyToLeft, greedyToRight, layer);
IntervalNode<T> insertedNode = addInterval(interval, start, end, greedyToLeft, greedyToRight, layer);
assert node != insertedNode;
int after = size();
@@ -147,7 +147,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
}
@Override
protected void setNode(@NotNull T key, IntervalNode intervalNode) {
protected void setNode(@NotNull T key, IntervalNode<T> intervalNode) {
((RangeMarkerImpl)key).myNode = (RMNode)intervalNode;
}
@@ -176,19 +176,18 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
}
private void updateMarkersOnChange(DocumentEvent e) {
long start = System.currentTimeMillis();
try {
l.writeLock().lock();
if (size() == 0) return;
checkMax(true);
modCount++;
List<IntervalNode> affected = new SmartList<IntervalNode>();
List<IntervalNode<T>> affected = new SmartList<IntervalNode<T>>();
collectAffectedMarkersAndShiftSubtrees(getRoot(), e, affected);
checkMax(false);
if (!affected.isEmpty()) {
for (IntervalNode node : affected) {
for (IntervalNode<T> node : affected) {
// assumption: interval.getEndOffset() will never be accessed during remove()
int startOffset = node.intervalStart();
int endOffset = node.intervalEnd();
@@ -203,7 +202,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
assert node.intervalEnd() == endOffset;
}
checkMax(true);
for (IntervalNode node : affected) {
for (IntervalNode<T> node : affected) {
List<Getable<T>> keys = node.intervals;
if (keys.isEmpty()) continue; // collected away
@@ -242,17 +241,16 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
}
checkMax(true);
IntervalNode root = getRoot();
IntervalNode<T> root = getRoot();
assert root == null || root.maxEnd + root.delta <= myDocument.getTextLength();
}
finally {
l.writeLock().unlock();
long finish = System.currentTimeMillis();
}
}
// returns true if all deltas involved are still 0
private boolean collectAffectedMarkersAndShiftSubtrees(IntervalNode root, @NotNull DocumentEvent e, @NotNull List<IntervalNode> affected) {
private boolean collectAffectedMarkersAndShiftSubtrees(IntervalNode<T> root, @NotNull DocumentEvent e, @NotNull List<IntervalNode<T>> affected) {
if (root == null) return true;
boolean norm = pushDelta(root);
@@ -274,7 +272,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
int lengthDelta = e.getNewLength() - e.getOldLength();
int newD = root.changeDelta(lengthDelta);
norm &= newD == 0;
IntervalNode left = root.getLeft();
IntervalNode<T> left = root.getLeft();
if (left != null) {
int newL = left.changeDelta(-lengthDelta);
norm &= newL == 0;
@@ -28,7 +28,7 @@ import java.awt.*;
* Implementation of the markup element for the editor and document.
* @author max
*/
class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx, Getable<RangeHighlighterImpl> {
class RangeHighlighterImpl extends RangeMarkerImpl implements RangeHighlighterEx, Getable<RangeHighlighterEx> {
private final RangeHighlighterData data;
RangeHighlighterImpl(@NotNull MarkupModel model,
@@ -31,7 +31,7 @@ public class RangeHighlighterTree extends RangeMarkerTree<RangeHighlighterEx> {
}
@Override
protected int compareEqualStartIntervals(@NotNull IntervalNode i1, @NotNull IntervalNode i2) {
protected int compareEqualStartIntervals(@NotNull IntervalNode<RangeHighlighterEx> i1, @NotNull IntervalNode<RangeHighlighterEx> i2) {
RHNode o1 = (RHNode)i1;
RHNode o2 = (RHNode)i2;
if (o1.myLayer != o2.myLayer) {
@@ -62,7 +62,7 @@ public class RangeHighlighterTree extends RangeMarkerTree<RangeHighlighterEx> {
//range highlighters are strongly referenced
@Override
protected Getable<RangeHighlighterEx> createGetable(@NotNull RangeHighlighterEx interval) {
return (Getable)interval;
return (RangeHighlighterImpl)interval;
}
}