Merge "HistogramDiff: Convert stack recursion to heap managed queue"
This commit is contained in:
commit
fd07ee54ef
|
@ -43,6 +43,9 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.diff;
|
package org.eclipse.jgit.diff;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An extended form of Bram Cohen's patience diff algorithm.
|
* An extended form of Bram Cohen's patience diff algorithm.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -130,15 +133,14 @@ public void setMaxChainLength(int maxLen) {
|
||||||
public <S extends Sequence> void diffNonCommon(EditList edits,
|
public <S extends Sequence> void diffNonCommon(EditList edits,
|
||||||
HashedSequenceComparator<S> cmp, HashedSequence<S> a,
|
HashedSequenceComparator<S> cmp, HashedSequence<S> a,
|
||||||
HashedSequence<S> b, Edit region) {
|
HashedSequence<S> b, Edit region) {
|
||||||
new State<S>(edits, cmp, a, b).diffReplace(region);
|
new State<S>(edits, cmp, a, b).diffRegion(region);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class State<S extends Sequence> {
|
private class State<S extends Sequence> {
|
||||||
private final HashedSequenceComparator<S> cmp;
|
private final HashedSequenceComparator<S> cmp;
|
||||||
|
|
||||||
private final HashedSequence<S> a;
|
private final HashedSequence<S> a;
|
||||||
|
|
||||||
private final HashedSequence<S> b;
|
private final HashedSequence<S> b;
|
||||||
|
private final List<Edit> queue = new ArrayList<Edit>();
|
||||||
|
|
||||||
/** Result edits we have determined that must be made to convert a to b. */
|
/** Result edits we have determined that must be made to convert a to b. */
|
||||||
final EditList edits;
|
final EditList edits;
|
||||||
|
@ -151,7 +153,13 @@ private class State<S extends Sequence> {
|
||||||
this.edits = edits;
|
this.edits = edits;
|
||||||
}
|
}
|
||||||
|
|
||||||
void diffReplace(Edit r) {
|
void diffRegion(Edit r) {
|
||||||
|
diffReplace(r);
|
||||||
|
while (!queue.isEmpty())
|
||||||
|
diff(queue.remove(queue.size() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void diffReplace(Edit r) {
|
||||||
Edit lcs = new HistogramDiffIndex<S>(maxChainLength, cmp, a, b, r)
|
Edit lcs = new HistogramDiffIndex<S>(maxChainLength, cmp, a, b, r)
|
||||||
.findLongestCommonSequence();
|
.findLongestCommonSequence();
|
||||||
if (lcs != null) {
|
if (lcs != null) {
|
||||||
|
@ -163,8 +171,8 @@ void diffReplace(Edit r) {
|
||||||
//
|
//
|
||||||
edits.add(r);
|
edits.add(r);
|
||||||
} else {
|
} else {
|
||||||
diff(r.before(lcs));
|
queue.add(r.after(lcs));
|
||||||
diff(r.after(lcs));
|
queue.add(r.before(lcs));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (fallback instanceof LowLevelDiffAlgorithm) {
|
} else if (fallback instanceof LowLevelDiffAlgorithm) {
|
||||||
|
|
Loading…
Reference in New Issue