Oh, IntIntMap, you are the retarded stepchild of the samskivert.util package.

You don't implement Map, you don't grow or shrink...
but at least now you return Interators and have a proper entrySet() method.
(Added a note that maybe someday we should fix it up more.)


git-svn-id: https://samskivert.googlecode.com/svn/trunk@1703 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
ray
2005-08-25 20:04:13 +00:00
parent 6bdd153cba
commit 3283e99310
@@ -20,9 +20,11 @@
package com.samskivert.util; package com.samskivert.util;
import java.util.AbstractSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.ConcurrentModificationException; import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Set;
/** /**
* An int int map is like an int map, but with integers as values as well * An int int map is like an int map, but with integers as values as well
@@ -30,8 +32,18 @@ import java.util.NoSuchElementException;
* to indicate no value, -1 is returned instead. This means that you must * to indicate no value, -1 is returned instead. This means that you must
* be careful if you intend to store -1 as a valid value in the table. * be careful if you intend to store -1 as a valid value in the table.
*/ */
//
// TODO: make this a proper map, perhaps even an extension of HashIntMap
// or at least share a common abstract ancestor.
public class IntIntMap public class IntIntMap
{ {
public interface Entry extends IntMap.Entry
{
public int getIntValue ();
public int setIntValue (int value);
}
public final static int DEFAULT_BUCKETS = 64; public final static int DEFAULT_BUCKETS = 64;
public IntIntMap (int buckets) public IntIntMap (int buckets)
@@ -158,14 +170,14 @@ public class IntIntMap
_size = 0; _size = 0;
} }
public Iterator keys () public Interator keys ()
{ {
return new Interator(true); return new KeyValueInterator(true);
} }
public Iterator values () public Interator values ()
{ {
return new Interator(false); return new KeyValueInterator(false);
} }
/** /**
@@ -216,7 +228,23 @@ public class IntIntMap
return ret; return ret;
} }
class Record /**
* Get a set of all the entries in this map.
*/
public Set entrySet ()
{
return new AbstractSet() {
public int size () {
return _size;
}
public Iterator iterator() {
return new EntryIterator();
}
};
}
class Record implements Entry
{ {
public Record next; public Record next;
public int key; public int key;
@@ -227,15 +255,53 @@ public class IntIntMap
this.key = key; this.key = key;
this.value = value; this.value = value;
} }
public Object getKey () {
return new Integer(key);
}
public int getIntKey () {
return key;
}
public Object getValue () {
return new Integer(value);
}
public int getIntValue () {
return value;
}
public Object setValue (Object v) {
return new Integer(setIntValue(((Integer) v).intValue()));
}
public int setIntValue (int v) {
int oldVal = value;
value = v;
return oldVal;
}
public boolean equals (Object o) {
if (o instanceof Entry) {
Entry that = (Entry) o;
return (this.key == that.getIntKey()) &&
(this.value == that.getIntValue());
}
return false;
}
public int hashCode () {
return key;
}
} }
class Interator implements Iterator class EntryIterator implements Iterator
{ {
public Interator (boolean returnKeys) public EntryIterator ()
{ {
this._modCount = IntIntMap.this._modCount; this._modCount = IntIntMap.this._modCount;
_index = _buckets.length; _index = _buckets.length;
_returnKeys = returnKeys;
} }
/** /**
@@ -276,7 +342,7 @@ public class IntIntMap
if (hasNext()) { if (hasNext()) {
_prev = _next; _prev = _next;
_next = _next.next; _next = _next.next;
return new Integer(_returnKeys ? _prev.key : _prev.value); return _prev;
} else { } else {
throw new NoSuchElementException("IntIntMapIterator"); throw new NoSuchElementException("IntIntMapIterator");
@@ -298,10 +364,31 @@ public class IntIntMap
private int _index; private int _index;
private Record _next, _prev; private Record _next, _prev;
private boolean _returnKeys;
private int _modCount; private int _modCount;
} }
protected class KeyValueInterator extends EntryIterator
implements Interator
{
public KeyValueInterator (boolean keys)
{
_keys = keys;
}
public int nextInt ()
{
Entry entry = (Entry) super.next();
return _keys ? entry.getIntKey() : entry.getIntValue();
}
public Object next ()
{
return new Integer(nextInt());
}
protected boolean _keys;
}
// public static void main (String[] args) // public static void main (String[] args)
// { // {
// IntIntMap table = new IntIntMap(); // IntIntMap table = new IntIntMap();