aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2010-09-10 17:48:24 -0700
committerShawn O. Pearce <spearce@spearce.org>2010-09-20 18:15:21 -0700
commitbaaddd51f1ffcda73640579af47983da8f7ce5f9 (patch)
tree32d1fc5fae1f295806034de807cb39cc34c95d84 /org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
parente0970cd1b4d10888fc73ea903b2f6a62be6b0225 (diff)
downloadjgit-baaddd51f1ffcda73640579af47983da8f7ce5f9.tar.gz
jgit-baaddd51f1ffcda73640579af47983da8f7ce5f9.zip
Move cached element hash codes to HashedSequence
Most diff implementations really want to use cached hash codes for elements, rather than element equality, as they need to perform many compares and unique hash codes for elements can really speed that process up. To make it easier to define element hash functions, move the caching of hash codes into a wrapper sequence type, so that individual sequence types like RawText don't need to do this themselves. This has a nice property of also allowing the sequence to no longer care about the specific SequenceComparator that is going to be used, and permits the caching to only examine the middle region that isn't common to the two inputs. Change-Id: If8623556da9419117b07c5073e8bce39de02570e Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java72
1 files changed, 72 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
new file mode 100644
index 0000000000..2a26700c13
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HashedSequence.java
@@ -0,0 +1,72 @@
+/*
+ * 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 assign hash codes to elements.
+ *
+ * This sequence acts as a proxy for the real sequence, caching element hash
+ * codes so they don't need to be recomputed each time. Sequences of this type
+ * must be used with a {@link HashedSequenceComparator}.
+ *
+ * To construct an instance of this type use {@link HashedSequencePair}.
+ *
+ * @param <S>
+ * the base sequence type.
+ */
+public final class HashedSequence<S extends Sequence> extends Sequence {
+ final S base;
+
+ final int[] hashes;
+
+ HashedSequence(S base, int[] hashes) {
+ this.base = base;
+ this.hashes = hashes;
+ }
+
+ @Override
+ public int size() {
+ return base.size();
+ }
+}