From 276d38065bcc2c91e762b4bd9b143523ac19e014 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 6 Sep 2010 14:00:34 -0700 Subject: [PATCH] Define a subsequence utility type A diff algorithm may find this type useful if it wants to delegate a particular range of elements to another algorithm, without changing the underlying sequence types. Change-Id: I4544467781233e21ac8b35081304b2bad7db00f6 Signed-off-by: Shawn O. Pearce --- .../org/eclipse/jgit/diff/Subsequence.java | 88 +++++++++++++++++++ .../jgit/diff/SubsequenceComparator.java | 79 +++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java new file mode 100644 index 000000000..aee869dc9 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Subsequence.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2010, Google Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.diff; + +/** + * Wraps a {@link Sequence} to have a narrower range of elements. + * + * This sequence acts as a proxy for the real sequence, translating element + * indexes on the fly by adding {@code begin} to them. Sequences of this type + * must be used with a {@link SubsequenceComparator}. + * + * @param + * the base sequence type. + */ +public final class Subsequence extends Sequence { + final S base; + + final int begin; + + private final int size; + + /** + * Construct a subset of another sequence. + * + * The size of the subsequence will be {@code end - begin}. + * + * @param base + * the real sequence. + * @param begin + * First element index of {@code base} that will be part of this + * new subsequence. The element at {@code begin} will be this + * sequence's element 0. + * @param end + * One past the last element index of {@code base} that will be + * part of this new subsequence. + */ + public Subsequence(S base, int begin, int end) { + this.base = base; + this.begin = begin; + this.size = end - begin; + } + + @Override + public int size() { + return size; + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java new file mode 100644 index 000000000..4ad955e64 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/SubsequenceComparator.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2010, Google Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.diff; + +/** + * Wrap another comparator for use with {@link Subsequence}. + * + * This comparator acts as a proxy for the real comparator, translating element + * indexes on the fly by adding the subsequence's begin offset to them. + * Comparators of this type must be used with a {@link Subsequence}. + * + * @param + * the base sequence type. + */ +public final class SubsequenceComparator extends + SequenceComparator> { + private final SequenceComparator cmp; + + /** + * Construct a comparator wrapping another comparator. + * + * @param cmp + * the real comparator. + */ + public SubsequenceComparator(SequenceComparator cmp) { + this.cmp = cmp; + } + + @Override + public boolean equals(Subsequence a, int ai, Subsequence b, int bi) { + return cmp.equals(a.base, ai + a.begin, b.base, bi + b.begin); + } + + @Override + public int hash(Subsequence seq, int ptr) { + return cmp.hash(seq.base, ptr + seq.begin); + } +}