EA-28385 - assert: IntervalTreeImpl$IntervalNode.removeIntervalInternal

This commit is contained in:
Alexey Kudravtsev
2012-12-04 15:35:06 +04:00
parent 02dd19f6b8
commit 660aed6855
2 changed files with 14 additions and 5 deletions
@@ -52,6 +52,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
private volatile int myStart;
private volatile int myEnd;
private volatile boolean isValid = true;
private volatile boolean isAttachedToTree; // true if the node is inserted to the tree
protected final List<Getter<E>> intervals;
protected int maxEnd; // max of all intervalEnd()s among all children.
protected int delta; // delta of startOffset. getStartOffset() = myStartOffset + Sum of deltas up to root
@@ -143,15 +144,19 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
public void removeIntervalInternal(int i) {
intervals.remove(i);
assert myIntervalTree.keySize > 0 : myIntervalTree.keySize;
myIntervalTree.keySize--;
if (isAttachedToTree) { // for detached node, do not update tree node count
assert myIntervalTree.keySize > 0 : myIntervalTree.keySize;
myIntervalTree.keySize--;
}
}
public void addInterval(@NotNull E interval) {
myIntervalTree.assertUnderWriteLock();
intervals.add(createGetter(interval));
myIntervalTree.keySize++;
myIntervalTree.setNode(interval, this);
if (isAttachedToTree) { // for detached node, do not update tree node count
myIntervalTree.keySize++;
myIntervalTree.setNode(interval, this);
}
}
protected Getter<E> createGetter(@NotNull E interval) {
@@ -719,6 +724,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
onInsertNode();
keySize += node.intervals.size();
insertCase1(node);
node.isAttachedToTree = true;
verifyProperties();
deleteNodes(gced);
@@ -942,6 +948,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
keySize -= node.intervals.size();
assert keySize >= 0 : keySize;
node.isAttachedToTree = false;
}
@Override
@@ -366,7 +366,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
private void reTarget(int start, int end, int newBase) {
l.writeLock().lock();
try {
//updateMarkersOnChange(new DocumentEventImpl(myDocument, ));
checkMax(true);
List<IntervalNode<T>> affected = new ArrayList<IntervalNode<T>>();
collectNodesToRetarget(getRoot(), start, end, affected);
@@ -379,11 +379,13 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
node.setRight(null);
node.setParent(null);
node.changeDelta(shift);
node.setValid(true);
pushDelta(node);
findOrInsert(node);
}
}
finally {
checkMax(true);
l.writeLock().unlock();
}
}