diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2010-09-20 18:04:00 -0700 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2010-09-20 18:05:41 -0700 |
commit | 590a9f94a1256c1e7dba2b848771a14c23064f38 (patch) | |
tree | 354eae2470f56c76ba6f5c80fb7c51c9929f0525 /org.eclipse.jgit/src/org/eclipse/jgit/diff | |
parent | 048d7342df9b7199c509992ca17ca4a774a89208 (diff) | |
download | jgit-590a9f94a1256c1e7dba2b848771a14c23064f38.tar.gz jgit-590a9f94a1256c1e7dba2b848771a14c23064f38.zip |
Add Subsequence utility methods
DiffAlgorithm implementations may find it useful to construct an Edit
and use that to later subsequence the two base sequences, so define
two new utility methods a() and b() to construct the A and B ranges.
Once a subsequence has had Edits created for it the indexes are
within the space of the subsequence. These must be shifted back to
the original base sequence's indexes. Define toBase() as a utility
method to perform that shifting work in-place, so DiffAlgorithm
implementations have an efficient way to convert back to the caller's
original space.
Change-Id: I8d788e4d158b9f466fa9cb4a40865fb806376aee
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/diff')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java index aee869dc9e..20544b1e44 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java @@ -54,6 +54,81 @@ package org.eclipse.jgit.diff; * the base sequence type. */ public final class Subsequence<S extends Sequence> extends Sequence { + /** + * Construct a subsequence around the A region/base sequence. + * + * @param <S> + * the base sequence type. + * @param a + * the A sequence. + * @param region + * the region of {@code a} to create a subsequence around. + * @return subsequence of {@code base} as described by A in {@code region}. + */ + public static <S extends Sequence> Subsequence<S> a(S a, Edit region) { + return new Subsequence<S>(a, region.beginA, region.endA); + } + + /** + * Construct a subsequence around the B region/base sequence. + * + * @param <S> + * the base sequence type. + * @param b + * the B sequence. + * @param region + * the region of {@code b} to create a subsequence around. + * @return subsequence of {@code base} as described by B in {@code region}. + */ + public static <S extends Sequence> Subsequence<S> b(S b, Edit region) { + return new Subsequence<S>(b, region.beginB, region.endB); + } + + /** + * Adjust the Edit to reflect positions in the base sequence. + * + * @param <S> + * the base sequence type. + * @param e + * edit to adjust in-place. Prior to invocation the indexes are + * in terms of the two subsequences; after invocation the indexes + * are in terms of the base sequences. + * @param a + * the A sequence. + * @param b + * the B sequence. + */ + public static <S extends Sequence> void toBase(Edit e, Subsequence<S> a, + Subsequence<S> b) { + e.beginA += a.begin; + e.endA += a.begin; + + e.beginB += b.begin; + e.endB += b.begin; + } + + /** + * Adjust the Edits to reflect positions in the base sequence. + * + * @param <S> + * the base sequence type. + * @param edits + * edits to adjust in-place. Prior to invocation the indexes are + * in terms of the two subsequences; after invocation the indexes + * are in terms of the base sequences. + * @param a + * the A sequence. + * @param b + * the B sequence. + * @return always {@code edits} (as the list was updated in-place). + */ + public static <S extends Sequence> EditList toBase(EditList edits, + Subsequence<S> a, Subsequence<S> b) { + for (Edit e : edits) + toBase(e, a, b); + return edits; + } + final S base; final int begin; |