summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-27 16:49:13 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-27 16:49:13 +0000
commitc7eb31c1df5ae341b484d999d7926701f6070a93 (patch)
tree9de64cbb27269963917f1df98d09816e61b3e110 /libjava
parent1785b647c73cfe054bd95725c39ac711dc324852 (diff)
downloadgcc-c7eb31c1df5ae341b484d999d7926701f6070a93.tar.gz
* java/util/IdentityHashMap.java (containsKey): Use getHash.
(get): Likewise. (put): Likewise. (remove): Likewise. (getHash): New method. (tombstone, emptyslot): Now static final. (put): Correctly determine when to rehash, and correctly rehash. (containsKey, remove): Test against table length with `>='. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45841 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog11
-rw-r--r--libjava/java/util/IdentityHashMap.java29
2 files changed, 29 insertions, 11 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index eae459916e1..56fecfbaf68 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,14 @@
+2001-09-27 Tom Tromey <tromey@redhat.com>
+
+ * java/util/IdentityHashMap.java (containsKey): Use getHash.
+ (get): Likewise.
+ (put): Likewise.
+ (remove): Likewise.
+ (getHash): New method.
+ (tombstone, emptyslot): Now static final.
+ (put): Correctly determine when to rehash, and correctly rehash.
+ (containsKey, remove): Test against table length with `>='.
+
2001-09-26 Tom Tromey <tromey@redhat.com>
* gnu/classpath/Configuration.java.in (INIT_LOAD_LIBRARY): New
diff --git a/libjava/java/util/IdentityHashMap.java b/libjava/java/util/IdentityHashMap.java
index c23f8ac3dd4..da028ed9c02 100644
--- a/libjava/java/util/IdentityHashMap.java
+++ b/libjava/java/util/IdentityHashMap.java
@@ -103,7 +103,7 @@ public class IdentityHashMap extends AbstractMap
public boolean containsKey (Object key)
{
- int h = Math.abs (2 * System.identityHashCode (key) % table.length);
+ int h = getHash (key);
int save = h;
while (true)
{
@@ -112,7 +112,7 @@ public class IdentityHashMap extends AbstractMap
if (table[h] == emptyslot)
return false;
h += 2;
- if (h > table.length)
+ if (h >= table.length)
h = 0;
if (h == save)
return false;
@@ -174,7 +174,7 @@ public class IdentityHashMap extends AbstractMap
public Object get (Object key)
{
- int h = Math.abs (2 * System.identityHashCode (key) % table.length);
+ int h = getHash (key);
int save = h;
while (true)
{
@@ -230,14 +230,15 @@ public class IdentityHashMap extends AbstractMap
public Object put (Object key, Object value)
{
- // Rehash is the load factor is too high.
- if (size * 3 / 2 > table.length)
+ // Rehash if the load factor is too high. We use a factor of 1.5
+ // -- the division by 2 is implicit on both sides.
+ if (size * 3 > table.length)
{
Object[] old = table;
table = new Object[old.length * 2];
Arrays.fill (table, emptyslot);
size = 0;
- for (int i = 0; i < old.length; ++i)
+ for (int i = 0; i < old.length; i += 2)
{
if (old[i] != tombstone && old[i] != emptyslot)
{
@@ -248,7 +249,7 @@ public class IdentityHashMap extends AbstractMap
}
}
- int h = Math.abs (2 * System.identityHashCode (key) % table.length);
+ int h = getHash (key);
int save = h;
int del = -1;
while (true)
@@ -288,7 +289,7 @@ public class IdentityHashMap extends AbstractMap
public Object remove (Object key)
{
- int h = Math.abs (2 * System.identityHashCode (key) % table.length);
+ int h = getHash (key);
int save = h;
while (true)
{
@@ -301,7 +302,7 @@ public class IdentityHashMap extends AbstractMap
return r;
}
h += 2;
- if (h > table.length)
+ if (h >= table.length)
h = 0;
if (h == save)
break;
@@ -413,14 +414,20 @@ public class IdentityHashMap extends AbstractMap
}
}
+ // Compute the hash value we will use for an object.
+ private int getHash (Object o)
+ {
+ return 2 * Math.abs (System.identityHashCode (o) % (table.length / 2));
+ }
+
// Number of items in hash table.
private int size;
// The table itself.
private Object[] table;
// This object is used to mark deleted items.
- private Object tombstone = new Object ();
+ private static final Object tombstone = new Object ();
// This object is used to mark empty slots. We need this because
// using null is ambiguous.
- private Object emptyslot = new Object ();
+ private static final Object emptyslot = new Object ();
}