Merge "HistogramDiff: Convert stack recursion to heap managed queue"

This commit is contained in:
Robin Rosenberg 2014-08-02 05:35:18 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit fd07ee54ef
1 changed files with 14 additions and 6 deletions

View File

@ -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) {