From: "Shawn O. Pearce" <spearce@spearce.org>
To: Robin Rosenberg <robin.rosenberg@dewire.com>
Cc: git@vger.kernel.org
Subject: [JGIT PATCH 13/13] Remove ObjectIdMap from the JGit library
Date: Tue, 28 Apr 2009 14:12:26 -0700 [thread overview]
Message-ID: <1240953146-12878-14-git-send-email-spearce@spearce.org> (raw)
In-Reply-To: <1240953146-12878-13-git-send-email-spearce@spearce.org>
Nobody within the library uses it anymore.
Applications should consider ObjectIdSubclassMap, or just use a normal
JDK map type like HashMap or TreeMap. In general ObjectIdSubclassMap
supports major map functionality, runs faster, and uses less memory for
the same sized data set.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
.../tst/org/spearce/jgit/lib/ObjectIdMapTest.java | 103 ----------
.../src/org/spearce/jgit/lib/ObjectIdMap.java | 201 --------------------
2 files changed, 0 insertions(+), 304 deletions(-)
delete mode 100644 org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectIdMapTest.java
delete mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/ObjectIdMap.java
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectIdMapTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectIdMapTest.java
deleted file mode 100644
index f1c1c0c..0000000
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectIdMapTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
- *
- * 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 Git Development Community 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.spearce.jgit.lib;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
-import java.util.TreeMap;
-
-import junit.framework.TestCase;
-
-/**
- * Test functionality of ObjectIdMap
- *
- * The reason this class exists is performance, but those figures
- * are hard to make stable.
- */
-public class ObjectIdMapTest extends TestCase {
-
- ObjectId[] ids = new ObjectId[500];
-
- protected void setUp() throws Exception {
- int b=0;
- for (int i=0; i<ids.length; ++i) {
- byte[] data = new byte[Constants.OBJECT_ID_LENGTH];
- for (int j=0; j<Constants.OBJECT_ID_LENGTH; ++j)
- data[j] = (byte) (b++^0xEE);
- ids[i] = ObjectId.fromRaw(data);
- }
- }
-
- protected void tearDown() throws Exception {
- ids = null; // avoid out of memory
- }
-
- /**
- * Verify that ObjectIdMap and TreeMap functionally are equivalent.
- */
- @SuppressWarnings("unchecked")
- public void testFunc() {
- Map treeMap = new TreeMap();
- for (int i=0; i<ids.length/100; ++i)
- treeMap.put(ids[i],ids[i]);
- Map levelMapWithTree = new ObjectIdMap(new TreeMap());
- for (int i=0; i<ids.length/100; ++i)
- levelMapWithTree.put(ids[i],ids[i]);
-
- assertEquals(treeMap, levelMapWithTree);
- assertEquals(treeMap.values(), levelMapWithTree.values());
- assertEquals(treeMap.keySet(), levelMapWithTree.keySet());
-
- treeMap.remove(ids[30]);
- levelMapWithTree.remove(ids[30]);
- assertFalse(treeMap.containsKey(ids[30]));
- assertFalse(levelMapWithTree.containsKey(ids[30]));
- assertEquals(treeMap.values(), levelMapWithTree.values());
- assertEquals(treeMap.keySet(), levelMapWithTree.keySet());
- }
-
- void assertEquals(Collection a, Collection b) {
- Object[] aa = a.toArray();
- Object[] ba = b.toArray();
- Arrays.sort(aa);
- Arrays.sort(ba);
- assertTrue(Arrays.equals(aa, ba));
- }
-
-}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectIdMap.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectIdMap.java
deleted file mode 100644
index d5b4294..0000000
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectIdMap.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
- *
- * 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 Git Development Community 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.spearce.jgit.lib;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.AbstractMap;
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Very much like a map, but specialized to partition the data on the first byte
- * of the key. This is about twice as fast. See test class.
- *
- * Inspiration is taken from the Git pack file format which uses this technique
- * to improve lookup performance.
- *
- * @param <V>
- * The value we map ObjectId's to.
- *
- */
-public class ObjectIdMap<V> extends AbstractMap<ObjectId, V> {
-
- @SuppressWarnings("unchecked")
- final Map<ObjectId, V>[] level0 = new Map[256];
-
- /**
- * Construct an ObjectIdMap with an underlying TreeMap implementation
- */
- public ObjectIdMap() {
- this(new TreeMap());
- }
-
- /**
- * Construct an ObjectIdMap with the same underlying map implementation as
- * the provided example.
- *
- * @param sample
- */
- @SuppressWarnings("unchecked")
- public ObjectIdMap(Map sample) {
- try {
- Method m=sample.getClass().getMethod("clone", (Class[])null);
- for (int i=0; i<256; ++i) {
- level0[i] = (Map)m.invoke(sample, (Object[])null);
- }
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException(e);
- } catch (IllegalArgumentException e) {
- throw new IllegalArgumentException(e);
- } catch (InvocationTargetException e) {
- throw new IllegalArgumentException(e);
- } catch (SecurityException e) {
- throw new IllegalArgumentException(e);
- } catch (NoSuchMethodException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- public void clear() {
- for (int i=0; i<256; ++i)
- level0[i].clear();
- }
-
- public boolean containsKey(Object key) {
- return submap((ObjectId)key).containsKey(key);
- }
-
- private final Map<ObjectId, V> submap(ObjectId key) {
- return level0[key.getFirstByte()];
- }
-
- public boolean containsValue(Object value) {
- for (int i=0; i<256; ++i)
- if (level0[i].containsValue(value))
- return true;
- return false;
- }
-
- private Set<Map.Entry<ObjectId, V>> entrySet =
- new AbstractSet<Map.Entry<ObjectId, V>>() {
-
- @Override
- final public Iterator<Map.Entry<ObjectId, V>> iterator() {
- return new Iterator<Entry<ObjectId,V>>() {
- private int levelIndex;
- private boolean hasNext;
- private Iterator<Map.Entry<ObjectId, V>> levelIterator;
- private Iterator<Map.Entry<ObjectId, V>> lastIterator;
- {
- step();
- }
- public boolean hasNext() {
- return hasNext;
- }
- public java.util.Map.Entry<ObjectId, V> next() {
- Entry<ObjectId, V> ret = levelIterator.next();
- step();
- return ret;
- }
- public void remove() {
- lastIterator.remove();
- }
-
- private void step() {
- hasNext = false;
- lastIterator = levelIterator;
- while ((levelIterator==null || !(hasNext=levelIterator.hasNext()))) {
- if (levelIndex < level0.length)
- levelIterator = level0[levelIndex++].entrySet().iterator();
- else
- break;
- }
- }
- };
- }
-
- @Override
- public int size() {
- int ret=0;
- for (int i=0; i<256; ++i)
- ret += level0[i].size();
- return ret;
- }
- };
-
-
- public Set<Map.Entry<ObjectId, V>> entrySet() {
- return entrySet;
- }
-
- public V get(Object key) {
- return submap((ObjectId)key).get(key);
- }
-
- public boolean isEmpty() {
- for (int i=0; i<256; ++i)
- if (!level0[i].isEmpty())
- return false;
- return true;
- }
-
- public V put(ObjectId key, V value) {
- return submap(key).put(key, value);
- }
-
- public void putAll(Map<? extends ObjectId, ? extends V> arg0) {
- for (Map.Entry<? extends ObjectId, ? extends V> entry : arg0.entrySet()) {
- final ObjectId k = entry.getKey();
- final V v = entry.getValue();
- put(k,v);
- }
- }
-
- public V remove(Object key) {
- return submap((ObjectId) key).remove(key);
- }
-
- public int size() {
- return entrySet().size();
- }
-
-}
--
1.6.3.rc1.205.g37f8
next prev parent reply other threads:[~2009-04-28 21:15 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-28 21:12 [JGIT PATCH 00/13] Misc. bug fixes and cleanups Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 01/13] Fix performance problem recently introduced to DeltaPackedObjectLoader Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 02/13] Don't use ByteWindows when checking pack file headers/footers Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 03/13] Rewrite WindowCache to be easier to follow and maintain Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 04/13] Document the IllegalArgumentException thrown by WindowCache.reconfigure Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 05/13] Create the new WindowCache before clearing the old one Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 06/13] Better handle concurrent reads during a WindowCache reconfiguration Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 07/13] Clear dead OffsetCache cells when clearing a reference Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 08/13] Work around Sun JVM bug "Cleared SoftReference not added to queue" Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 09/13] Replace inefficient new String(String) constructor to silence FindBugs Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 10/13] Replace inefficient new Long(long) " Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 11/13] Change IndexPack to use ObjectIdSubclassMap instead of ObjectIdMap Shawn O. Pearce
2009-04-28 21:12 ` [JGIT PATCH 12/13] Use getCachedBytes in IndexPack to avoid an unnecessary copy Shawn O. Pearce
2009-04-28 21:12 ` Shawn O. Pearce [this message]
2009-04-29 19:45 ` [JGIT PATCH 10/13] Replace inefficient new Long(long) constructor to silence FindBugs Robin Rosenberg
2009-04-29 20:42 ` [PATCH 12/11] Add a test for LongMap, IndexPack's helper class Shawn O. Pearce
2009-04-29 20:10 ` [JGIT PATCH 09/13] Replace inefficient new String(String) constructor to silence FindBugs Robin Rosenberg
2009-04-29 20:22 ` Shawn O. Pearce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1240953146-12878-14-git-send-email-spearce@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).