diff --git a/projects/samskivert/src/java/com/samskivert/util/HashIntMap.java b/projects/samskivert/src/java/com/samskivert/util/HashIntMap.java
index fa705b6e..32c3b05e 100644
--- a/projects/samskivert/src/java/com/samskivert/util/HashIntMap.java
+++ b/projects/samskivert/src/java/com/samskivert/util/HashIntMap.java
@@ -28,6 +28,7 @@ import java.io.Serializable;
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
+import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
@@ -37,12 +38,13 @@ import java.util.Set;
* lookup or insert values. The hash int map is an int map that uses a
* hashtable mechanism to store its key/value mappings.
*/
-public class HashIntMap
- extends AbstractMap implements IntMap, Cloneable, Serializable
+public class HashIntMap extends AbstractMap
+ implements IntMap, Cloneable, Serializable
{
- public interface Entry extends AbstractMap.Entry
+ public interface Entry extends IntMap.Entry
{
- public int getIntKey ();
+ // this interface does nothing,
+ // is included for bass-ackwards compatability
}
/**
@@ -216,6 +218,21 @@ public class HashIntMap
return null;
}
+ // documentation inherited
+ public void putAll (Map t)
+ {
+ if (t instanceof IntMap) {
+ // if we can, avoid creating Integer objects while copying
+ for (Iterator itr = t.entrySet().iterator(); itr.hasNext(); ) {
+ IntMap.Entry entry = (IntMap.Entry) itr.next();
+ put(entry.getIntKey(), entry.getValue());
+ }
+
+ } else {
+ super.putAll(t);
+ }
+ }
+
// documentation inherited
public void clear ()
{
@@ -362,13 +379,92 @@ public class HashIntMap
protected Record _record, _last;
}
- /**
- * Returns an iteration over the keys of this hash int map. The keys
- * are returned as Integer objects.
- */
- public Iterator keys ()
+ protected class IntKeySet extends AbstractSet
+ implements IntSet
{
- return keySet().iterator();
+ public Iterator iterator () {
+ return interator();
+ }
+
+ public Interator interator () {
+ return new Interator () {
+ private Iterator i = entrySet().iterator();
+
+ public boolean hasNext () {
+ return i.hasNext();
+ }
+
+ public Object next () {
+ return ((IntMap.Entry) i.next()).getKey();
+ }
+
+ public int nextInt () {
+ return ((IntMap.Entry) i.next()).getIntKey();
+ }
+
+ public void remove () {
+ i.remove();
+ }
+ };
+ }
+
+ public int size () {
+ return HashIntMap.this.size();
+ }
+
+ public boolean contains (Object t) {
+ return HashIntMap.this.containsKey(t);
+ }
+
+ public boolean contains (int t) {
+ return HashIntMap.this.containsKey(t);
+ }
+
+ public boolean add (int t) {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean remove (Object o) {
+ return (null != HashIntMap.this.remove(o));
+ }
+
+ public boolean remove (int value) {
+ return (null != HashIntMap.this.remove(value));
+ }
+
+ public int[] toIntArray () {
+ int[] vals = new int[size()];
+ int ii=0;
+ for (Interator intr = interator(); intr.hasNext(); ) {
+ vals[ii++] = intr.nextInt();
+ }
+ return vals;
+ }
+ }
+
+ // documentation inherited from interface IntMap
+ public IntSet intKeySet ()
+ {
+ // damn Sun bastards made the 'keySet' variable with default access,
+ // so we can't share it
+ if (_keySet == null) {
+ _keySet = new IntKeySet();
+ }
+ return _keySet;
+ }
+
+ // documentation inherited
+ public Set keySet ()
+ {
+ return intKeySet();
+ }
+
+ /**
+ * Returns an interation over the keys of this hash int map.
+ */
+ public Interator keys ()
+ {
+ return intKeySet().interator();
}
/**
@@ -494,6 +590,9 @@ public class HashIntMap
protected int _size;
protected float _loadFactor;
+ /** A stateless view of our keys, so we re-use it. */
+ protected transient volatile IntSet _keySet = null;
+
/** Change this if the fields or inheritance hierarchy ever changes
* (which is extremely unlikely). We override this because I'm tired
* of serialized crap not working depending on whether I compiled with
diff --git a/projects/samskivert/src/java/com/samskivert/util/IntMap.java b/projects/samskivert/src/java/com/samskivert/util/IntMap.java
index dff974e9..7c181427 100644
--- a/projects/samskivert/src/java/com/samskivert/util/IntMap.java
+++ b/projects/samskivert/src/java/com/samskivert/util/IntMap.java
@@ -31,6 +31,15 @@ import java.util.Map;
*/
public interface IntMap extends Map
{
+ /**
+ * An IntMap entry (key-value pair). The int key may be retrieved
+ * directly, avoiding the creation of an Integer object.
+ */
+ public interface Entry extends Map.Entry
+ {
+ public int getIntKey ();
+ }
+
/**
* Returns true if this map contains a mapping for the
* specified key.
@@ -75,4 +84,9 @@ public interface IntMap extends Map
* null if there was no mapping for key.
*/
public Object remove (int key);
+
+ /**
+ * Get a set of all the keys, as an IntSet.
+ */
+ public IntSet intKeySet ();
}