Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -1,5 +1,6 @@
/* AbstractMap.java -- Abstract implementation of most of Map
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -38,6 +39,8 @@ exception statement from your version. */
package java.util;
import java.io.Serializable;
/**
* An abstract implementation of Map to make it easier to create your own
* implementations. In order to create an unmodifiable Map, subclass
@ -64,9 +67,43 @@ package java.util;
* @since 1.2
* @status updated to 1.4
*/
public abstract class AbstractMap implements Map
public abstract class AbstractMap<K, V> implements Map<K, V>
{
/** An "enum" of iterator types. */
/** @since 1.6 */
public static class SimpleImmutableEntry<K, V>
implements Entry<K, V>, Serializable
{
K key;
V value;
public SimpleImmutableEntry(K key, V value)
{
this.key = key;
this.value = value;
}
public SimpleImmutableEntry(Entry<? extends K, ? extends V> entry)
{
this(entry.getKey(), entry.getValue());
}
public K getKey()
{
return key;
}
public V getValue()
{
return value;
}
public V setValue(V value)
{
throw new UnsupportedOperationException("setValue not supported on immutable entry");
}
}
/** An "enum" of iterator types. */
// Package visible for use by subclasses.
static final int KEYS = 0,
VALUES = 1,
@ -76,13 +113,13 @@ public abstract class AbstractMap implements Map
* The cache for {@link #keySet()}.
*/
// Package visible for use by subclasses.
Set keys;
Set<K> keys;
/**
* The cache for {@link #values()}.
*/
// Package visible for use by subclasses.
Collection values;
Collection<V> values;
/**
* The main constructor, for use by subclasses.
@ -104,7 +141,7 @@ public abstract class AbstractMap implements Map
* @return the entry set
* @see Map.Entry
*/
public abstract Set entrySet();
public abstract Set<Map.Entry<K, V>> entrySet();
/**
* Remove all entries from this Map (optional operation). This default
@ -133,7 +170,7 @@ public abstract class AbstractMap implements Map
*/
protected Object clone() throws CloneNotSupportedException
{
AbstractMap copy = (AbstractMap) super.clone();
AbstractMap<K, V> copy = (AbstractMap<K, V>) super.clone();
// Clear out the caches; they are stale.
copy.keys = null;
copy.values = null;
@ -155,10 +192,10 @@ public abstract class AbstractMap implements Map
*/
public boolean containsKey(Object key)
{
Iterator entries = entrySet().iterator();
Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
int pos = size();
while (--pos >= 0)
if (equals(key, ((Map.Entry) entries.next()).getKey()))
if (equals(key, entries.next().getKey()))
return true;
return false;
}
@ -178,10 +215,10 @@ public abstract class AbstractMap implements Map
*/
public boolean containsValue(Object value)
{
Iterator entries = entrySet().iterator();
Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
int pos = size();
while (--pos >= 0)
if (equals(value, ((Map.Entry) entries.next()).getValue()))
if (equals(value, entries.next().getValue()))
return true;
return false;
}
@ -198,9 +235,9 @@ public abstract class AbstractMap implements Map
*/
public boolean equals(Object o)
{
return (o == this ||
(o instanceof Map &&
entrySet().equals(((Map) o).entrySet())));
return (o == this
|| (o instanceof Map
&& entrySet().equals(((Map<K, V>) o).entrySet())));
}
/**
@ -215,13 +252,13 @@ public abstract class AbstractMap implements Map
* @throws NullPointerException if this map does not accept null keys
* @see #containsKey(Object)
*/
public Object get(Object key)
public V get(Object key)
{
Iterator entries = entrySet().iterator();
Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
int pos = size();
while (--pos >= 0)
{
Map.Entry entry = (Map.Entry) entries.next();
Map.Entry<K, V> entry = entries.next();
if (equals(key, entry.getKey()))
return entry.getValue();
}
@ -273,10 +310,10 @@ public abstract class AbstractMap implements Map
* @see #containsKey(Object)
* @see #values()
*/
public Set keySet()
public Set<K> keySet()
{
if (keys == null)
keys = new AbstractSet()
keys = new AbstractSet<K>()
{
/**
* Retrieves the number of keys in the backing map.
@ -294,7 +331,7 @@ public abstract class AbstractMap implements Map
*
* @param key The key to search for.
* @return True if the key was found, false otherwise.
*/
*/
public boolean contains(Object key)
{
return containsKey(key);
@ -307,14 +344,15 @@ public abstract class AbstractMap implements Map
*
* @return An iterator over the keys.
*/
public Iterator iterator()
public Iterator<K> iterator()
{
return new Iterator()
return new Iterator<K>()
{
/**
* The iterator returned by <code>entrySet()</code>.
*/
private final Iterator map_iterator = entrySet().iterator();
private final Iterator<Map.Entry<K, V>> map_iterator
= entrySet().iterator();
/**
* Returns true if a call to <code>next()</code> will
@ -333,10 +371,10 @@ public abstract class AbstractMap implements Map
* by the underlying <code>entrySet()</code> iterator.
*
* @return The next key.
*/
public Object next()
*/
public K next()
{
return ((Map.Entry) map_iterator.next()).getKey();
return map_iterator.next().getKey();
}
/**
@ -374,7 +412,7 @@ public abstract class AbstractMap implements Map
* @throws NullPointerException if the map forbids null keys or values
* @see #containsKey(Object)
*/
public Object put(Object key, Object value)
public V put(K key, V value)
{
throw new UnsupportedOperationException();
}
@ -396,13 +434,16 @@ public abstract class AbstractMap implements Map
* @throws NullPointerException if <code>m</code> is null.
* @see #put(Object, Object)
*/
public void putAll(Map m)
public void putAll(Map<? extends K, ? extends V> m)
{
Iterator entries = m.entrySet().iterator();
// FIXME: bogus circumlocution.
Iterator entries2 = m.entrySet().iterator();
Iterator<Map.Entry<? extends K, ? extends V>> entries
= (Iterator<Map.Entry<? extends K, ? extends V>>) entries2;
int pos = m.size();
while (--pos >= 0)
{
Map.Entry entry = (Map.Entry) entries.next();
Map.Entry<? extends K, ? extends V> entry = entries.next();
put(entry.getKey(), entry.getValue());
}
}
@ -424,17 +465,17 @@ public abstract class AbstractMap implements Map
* @throws UnsupportedOperationException if deletion is unsupported
* @see Iterator#remove()
*/
public Object remove(Object key)
public V remove(Object key)
{
Iterator entries = entrySet().iterator();
Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
int pos = size();
while (--pos >= 0)
{
Map.Entry entry = (Map.Entry) entries.next();
Map.Entry<K, V> entry = entries.next();
if (equals(key, entry.getKey()))
{
// Must get the value before we remove it from iterator.
Object r = entry.getValue();
V r = entry.getValue();
entries.remove();
return r;
}
@ -469,11 +510,11 @@ public abstract class AbstractMap implements Map
*/
public String toString()
{
Iterator entries = entrySet().iterator();
Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
StringBuffer r = new StringBuffer("{");
for (int pos = size(); pos > 0; pos--)
{
Map.Entry entry = (Map.Entry) entries.next();
Map.Entry<K, V> entry = entries.next();
r.append(entry.getKey());
r.append('=');
r.append(entry.getValue());
@ -504,18 +545,18 @@ public abstract class AbstractMap implements Map
* @see #containsValue(Object)
* @see #keySet()
*/
public Collection values()
public Collection<V> values()
{
if (values == null)
values = new AbstractCollection()
values = new AbstractCollection<V>()
{
/**
/**
* Returns the number of values stored in
* the backing map.
*
* @return The number of values.
*/
public int size()
public int size()
{
return AbstractMap.this.size();
}
@ -539,46 +580,47 @@ public abstract class AbstractMap implements Map
*
* @return An iterator over the values.
*/
public Iterator iterator()
public Iterator<V> iterator()
{
return new Iterator()
return new Iterator<V>()
{
/**
* The iterator returned by <code>entrySet()</code>.
*/
private final Iterator map_iterator = entrySet().iterator();
private final Iterator<Map.Entry<K, V>> map_iterator
= entrySet().iterator();
/**
* Returns true if a call to <code>next()</call> will
* return another value.
*
* @return True if the iterator has not yet reached
* the last value.
*/
/**
* Returns true if a call to <code>next()</call> will
* return another value.
*
* @return True if the iterator has not yet reached
* the last value.
*/
public boolean hasNext()
{
return map_iterator.hasNext();
}
/**
* Returns the value from the next entry retrieved
* by the underlying <code>entrySet()</code> iterator.
*
* @return The next value.
*/
public Object next()
/**
* Returns the value from the next entry retrieved
* by the underlying <code>entrySet()</code> iterator.
*
* @return The next value.
*/
public V next()
{
return ((Map.Entry) map_iterator.next()).getValue();
return map_iterator.next().getValue();
}
/**
* Removes the map entry which has a key equal
* to that returned by the last call to
* <code>next()</code>.
*
* @throws UnsupportedOperationException if the
* map doesn't support removal.
*/
/**
* Removes the map entry which has a key equal
* to that returned by the last call to
* <code>next()</code>.
*
* @throws UnsupportedOperationException if the
* map doesn't support removal.
*/
public void remove()
{
map_iterator.remove();
@ -623,31 +665,36 @@ public abstract class AbstractMap implements Map
*
* @author Jon Zeppieri
* @author Eric Blake (ebb9@email.byu.edu)
*
* @since 1.6
*/
// XXX - FIXME Use fully qualified implements as gcj 3.1 workaround.
// Bug still exists in 3.4.1
static class BasicMapEntry implements Map.Entry
public static class SimpleEntry<K, V> implements Entry<K, V>, Serializable
{
/**
* The key. Package visible for direct manipulation.
*/
Object key;
K key;
/**
* The value. Package visible for direct manipulation.
*/
Object value;
V value;
/**
* Basic constructor initializes the fields.
* @param newKey the key
* @param newValue the value
*/
BasicMapEntry(Object newKey, Object newValue)
public SimpleEntry(K newKey, V newValue)
{
key = newKey;
value = newValue;
}
public SimpleEntry(Entry<? extends K, ? extends V> entry)
{
this(entry.getKey(), entry.getValue());
}
/**
* Compares the specified object with this entry. Returns true only if
@ -662,14 +709,14 @@ public abstract class AbstractMap implements Map
* @param o the object to compare
* @return <code>true</code> if it is equal
*/
public final boolean equals(Object o)
public boolean equals(Object o)
{
if (! (o instanceof Map.Entry))
return false;
// Optimize for our own entries.
if (o instanceof BasicMapEntry)
if (o instanceof SimpleEntry)
{
BasicMapEntry e = (BasicMapEntry) o;
SimpleEntry e = (SimpleEntry) o;
return (AbstractMap.equals(key, e.key)
&& AbstractMap.equals(value, e.value));
}
@ -683,7 +730,7 @@ public abstract class AbstractMap implements Map
*
* @return the key
*/
public final Object getKey()
public final K getKey()
{
return key;
}
@ -694,7 +741,7 @@ public abstract class AbstractMap implements Map
*
* @return the value
*/
public final Object getValue()
public final V getValue()
{
return value;
}
@ -728,9 +775,9 @@ public abstract class AbstractMap implements Map
* @throws IllegalArgumentException if something else about this
* value prevents it being stored in the map.
*/
public Object setValue(Object newVal)
public V setValue(V newVal)
{
Object r = value;
V r = value;
value = newVal;
return r;
}
@ -745,5 +792,7 @@ public abstract class AbstractMap implements Map
{
return key + "=" + value;
}
} // class BasicMapEntry
} // class SimpleEntry
}