OSDN Git Service

Merged gcj-eclipse branch to trunk.
[pf3gnuchains/gcc-fork.git] / libjava / classpath / java / util / TreeMap.java
index 60d0a4d..88abce1 100644 (file)
@@ -90,8 +90,8 @@ import java.io.Serializable;
  * @since 1.2
  * @status updated to 1.4
  */
-public class TreeMap extends AbstractMap
-  implements SortedMap, Cloneable, Serializable
+public class TreeMap<K, V> extends AbstractMap<K, V>
+  implements SortedMap<K, V>, Cloneable, Serializable
 {
   // Implementation note:
   // A red-black tree is a binary search tree with the additional properties
@@ -140,7 +140,7 @@ public class TreeMap extends AbstractMap
   /**
    * The cache for {@link #entrySet()}.
    */
-  private transient Set entries;
+  private transient Set<Map.Entry<K,V>> entries;
 
   /**
    * Counts the number of modifications this TreeMap has undergone, used
@@ -154,7 +154,7 @@ public class TreeMap extends AbstractMap
    * Package visible for use by nested classes.
    * @serial the comparator ordering this tree, or null
    */
-  final Comparator comparator;
+  final Comparator<? super K> comparator;
 
   /**
    * Class to represent an entry in the tree. Holds a single key-value pair,
@@ -162,25 +162,25 @@ public class TreeMap extends AbstractMap
    *
    * @author Eric Blake (ebb9@email.byu.edu)
    */
-  private static final class Node extends AbstractMap.BasicMapEntry
+  private static final class Node<K, V> extends AbstractMap.SimpleEntry<K, V>
   {
     // All fields package visible for use by nested classes.
     /** The color of this node. */
     int color;
 
     /** The left child node. */
-    Node left = nil;
+    Node<K, V> left = nil;
     /** The right child node. */
-    Node right = nil;
+    Node<K, V> right = nil;
     /** The parent node. */
-    Node parent = nil;
+    Node<K, V> parent = nil;
 
     /**
      * Simple constructor.
      * @param key the key
      * @param value the value
      */
-    Node(Object key, Object value, int color)
+    Node(K key, V value, int color)
     {
       super(key, value);
       this.color = color;
@@ -210,7 +210,7 @@ public class TreeMap extends AbstractMap
    * @param c the sort order for the keys of this map, or null
    *        for the natural order
    */
-  public TreeMap(Comparator c)
+  public TreeMap(Comparator<? super K> c)
   {
     comparator = c;
     fabricateTree(0);
@@ -230,7 +230,7 @@ public class TreeMap extends AbstractMap
    * @throws NullPointerException if map is null
    * @see Comparable
    */
-  public TreeMap(Map map)
+  public TreeMap(Map<? extends K, ? extends V> map)
   {
     this((Comparator) null);
     putAll(map);
@@ -244,7 +244,7 @@ public class TreeMap extends AbstractMap
    * @param sm a SortedMap, whose entries will be put into this TreeMap
    * @throws NullPointerException if sm is null
    */
-  public TreeMap(SortedMap sm)
+  public TreeMap(SortedMap<K, ? extends V> sm)
   {
     this(sm.comparator());
     int pos = sm.size();
@@ -313,7 +313,7 @@ public class TreeMap extends AbstractMap
    *
    * @return the map's comparator
    */
-  public Comparator comparator()
+  public Comparator<? super K> comparator()
   {
     return comparator;
   }
@@ -329,7 +329,7 @@ public class TreeMap extends AbstractMap
    */
   public boolean containsKey(Object key)
   {
-    return getNode(key) != nil;
+    return getNode((K) key) != nil;
   }
 
   /**
@@ -364,19 +364,19 @@ public class TreeMap extends AbstractMap
    * @see #values()
    * @see Map.Entry
    */
-  public Set entrySet()
+  public Set<Map.Entry<K,V>> entrySet()
   {
     if (entries == null)
       // Create an AbstractSet with custom implementations of those methods
       // that can be overriden easily and efficiently.
-      entries = new AbstractSet()
+      entries = new AbstractSet<Map.Entry<K,V>>()
       {
         public int size()
         {
           return size;
         }
 
-        public Iterator iterator()
+        public Iterator<Map.Entry<K,V>> iterator()
         {
           return new TreeIterator(ENTRIES);
         }
@@ -390,8 +390,8 @@ public class TreeMap extends AbstractMap
         {
           if (! (o instanceof Map.Entry))
             return false;
-          Map.Entry me = (Map.Entry) o;
-          Node n = getNode(me.getKey());
+          Map.Entry<K,V> me = (Map.Entry<K,V>) o;
+          Node<K,V> n = getNode(me.getKey());
           return n != nil && AbstractSet.equals(me.getValue(), n.value);
       }
 
@@ -399,8 +399,8 @@ public class TreeMap extends AbstractMap
         {
           if (! (o instanceof Map.Entry))
             return false;
-          Map.Entry me = (Map.Entry) o;
-          Node n = getNode(me.getKey());
+          Map.Entry<K,V> me = (Map.Entry<K,V>) o;
+          Node<K,V> n = getNode(me.getKey());
           if (n != nil && AbstractSet.equals(me.getValue(), n.value))
             {
               removeNode(n);
@@ -418,7 +418,7 @@ public class TreeMap extends AbstractMap
    * @return the first key
    * @throws NoSuchElementException if the map is empty
    */
-  public Object firstKey()
+  public K firstKey()
   {
     if (root == nil)
       throw new NoSuchElementException();
@@ -439,10 +439,10 @@ public class TreeMap extends AbstractMap
    * @see #put(Object, Object)
    * @see #containsKey(Object)
    */
-  public Object get(Object key)
+  public V get(Object key)
   {
     // Exploit fact that nil.value == null.
-    return getNode(key).value;
+    return getNode((K) key).value;
   }
 
   /**
@@ -460,9 +460,9 @@ public class TreeMap extends AbstractMap
    * @throws NullPointerException if toKey is null, but the comparator does not
    *         tolerate null elements
    */
-  public SortedMap headMap(Object toKey)
+  public SortedMap<K, V> headMap(K toKey)
   {
-    return new SubMap(nil, toKey);
+    return new SubMap((K)(Object)nil, toKey);
   }
 
   /**
@@ -474,19 +474,19 @@ public class TreeMap extends AbstractMap
    * @see #values()
    * @see #entrySet()
    */
-  public Set keySet()
+  public Set<K> keySet()
   {
     if (keys == null)
       // Create an AbstractSet with custom implementations of those methods
       // that can be overriden easily and efficiently.
-      keys = new AbstractSet()
+      keys = new AbstractSet<K>()
       {
         public int size()
         {
           return size;
         }
 
-        public Iterator iterator()
+        public Iterator<K> iterator()
         {
           return new TreeIterator(KEYS);
         }
@@ -503,7 +503,7 @@ public class TreeMap extends AbstractMap
 
         public boolean remove(Object key)
         {
-          Node n = getNode(key);
+          Node<K,V> n = getNode((K) key);
           if (n == nil)
             return false;
           removeNode(n);
@@ -519,7 +519,7 @@ public class TreeMap extends AbstractMap
    * @return the last key
    * @throws NoSuchElementException if the map is empty
    */
-  public Object lastKey()
+  public K lastKey()
   {
     if (root == nil)
       throw new NoSuchElementException("empty");
@@ -542,10 +542,10 @@ public class TreeMap extends AbstractMap
    * @see #get(Object)
    * @see Object#equals(Object)
    */
-  public Object put(Object key, Object value)
+  public V put(K key, V value)
   {
-    Node current = root;
-    Node parent = nil;
+    Node<K,V> current = root;
+    Node<K,V> parent = nil;
     int comparison = 0;
 
     // Find new node's parent.
@@ -595,13 +595,13 @@ public class TreeMap extends AbstractMap
    * @throws NullPointerException if a key in m is null, and the comparator
    *         does not tolerate nulls
    */
-  public void putAll(Map m)
+  public void putAll(Map<? extends K, ? extends V> m)
   {
     Iterator itr = m.entrySet().iterator();
     int pos = m.size();
     while (--pos >= 0)
       {
-        Map.Entry e = (Map.Entry) itr.next();
+        Map.Entry<K,V> e = (Map.Entry<K,V>) itr.next();
         put(e.getKey(), e.getValue());
       }
   }
@@ -619,13 +619,13 @@ public class TreeMap extends AbstractMap
    * @throws NullPointerException if key is null, but the comparator does
    *         not tolerate nulls
    */
-  public Object remove(Object key)
+  public V remove(Object key)
   {
-    Node n = getNode(key);
+    Node<K, V> n = getNode((K)key);
     if (n == nil)
       return null;
     // Note: removeNode can alter the contents of n, so save value now.
-    Object result = n.value;
+    V result = n.value;
     removeNode(n);
     return result;
   }
@@ -659,7 +659,7 @@ public class TreeMap extends AbstractMap
    *         comparator does not tolerate null elements
    * @throws IllegalArgumentException if fromKey is greater than toKey
    */
-  public SortedMap subMap(Object fromKey, Object toKey)
+  public SortedMap<K, V> subMap(K fromKey, K toKey)
   {
     return new SubMap(fromKey, toKey);
   }
@@ -679,9 +679,9 @@ public class TreeMap extends AbstractMap
    * @throws NullPointerException if fromKey is null, but the comparator
    *         does not tolerate null elements
    */
-  public SortedMap tailMap(Object fromKey)
+  public SortedMap<K, V> tailMap(K fromKey)
   {
-    return new SubMap(fromKey, nil);
+    return new SubMap(fromKey, (K)(Object)nil);
   }
 
   /**
@@ -694,19 +694,19 @@ public class TreeMap extends AbstractMap
    * @see #keySet()
    * @see #entrySet()
    */
-  public Collection values()
+  public Collection<V> values()
   {
     if (values == null)
       // We don't bother overriding many of the optional methods, as doing so
       // wouldn't provide any significant performance advantage.
-      values = new AbstractCollection()
+      values = new AbstractCollection<V>()
       {
         public int size()
         {
           return size;
         }
 
-        public Iterator iterator()
+        public Iterator<V> iterator()
         {
           return new TreeIterator(VALUES);
         }
@@ -729,7 +729,7 @@ public class TreeMap extends AbstractMap
    *         or are not Comparable with natural ordering
    * @throws NullPointerException if o1 or o2 is null with natural ordering
    */
-  final int compare(Object o1, Object o2)
+  final int compare(K o1, K o2)
   {
     return (comparator == null
             ? ((Comparable) o1).compareTo(o2)
@@ -742,7 +742,7 @@ public class TreeMap extends AbstractMap
    * @param node the child of the node just deleted, possibly nil
    * @param parent the parent of the node just deleted, never nil
    */
-  private void deleteFixup(Node node, Node parent)
+  private void deleteFixup(Node<K,V> node, Node<K,V> parent)
   {
     // if (parent == nil)
     //   throw new InternalError();
@@ -754,7 +754,7 @@ public class TreeMap extends AbstractMap
         if (node == parent.left)
           {
             // Rebalance left side.
-            Node sibling = parent.right;
+            Node<K,V> sibling = parent.right;
             // if (sibling == nil)
             //   throw new InternalError();
             if (sibling.color == RED)
@@ -798,7 +798,7 @@ public class TreeMap extends AbstractMap
         else
           {
             // Symmetric "mirror" of left-side case.
-            Node sibling = parent.left;
+            Node<K,V> sibling = parent.left;
             // if (sibling == nil)
             //   throw new InternalError();
             if (sibling.color == RED)
@@ -931,7 +931,7 @@ public class TreeMap extends AbstractMap
    *
    * @return the first node
    */
-  final Node firstNode()
+  final Node<K, V> firstNode()
   {
     // Exploit fact that nil.left == nil.
     Node node = root;
@@ -947,9 +947,9 @@ public class TreeMap extends AbstractMap
    * @param key the key to search for
    * @return the node where the key is found, or nil
    */
-  final Node getNode(Object key)
+  final Node<K, V> getNode(K key)
   {
-    Node current = root;
+    Node<K,V> current = root;
     while (current != nil)
       {
         int comparison = compare(key, current.key);
@@ -970,13 +970,13 @@ public class TreeMap extends AbstractMap
    * @param key the upper bound, exclusive
    * @return the previous node
    */
-  final Node highestLessThan(Object key)
+  final Node<K,V> highestLessThan(K key)
   {
     if (key == nil)
       return lastNode();
 
-    Node last = nil;
-    Node current = root;
+    Node<K,V> last = nil;
+    Node<K,V> current = root;
     int comparison = 0;
 
     while (current != nil)
@@ -998,7 +998,7 @@ public class TreeMap extends AbstractMap
    *
    * @param n the newly inserted node
    */
-  private void insertFixup(Node n)
+  private void insertFixup(Node<K,V> n)
   {
     // Only need to rebalance when parent is a RED node, and while at least
     // 2 levels deep into the tree (ie: node has a grandparent). Remember
@@ -1073,7 +1073,7 @@ public class TreeMap extends AbstractMap
    *
    * @return the last node
    */
-  private Node lastNode()
+  private Node<K,V> lastNode()
   {
     // Exploit fact that nil.right == nil.
     Node node = root;
@@ -1091,13 +1091,13 @@ public class TreeMap extends AbstractMap
    * @param first true to return the first element instead of nil for nil key
    * @return the next node
    */
-  final Node lowestGreaterThan(Object key, boolean first)
+  final Node<K,V> lowestGreaterThan(K key, boolean first)
   {
     if (key == nil)
       return first ? firstNode() : nil;
 
-    Node last = nil;
-    Node current = root;
+    Node<K,V> last = nil;
+    Node<K,V> current = root;
     int comparison = 0;
 
     while (current != nil)
@@ -1120,7 +1120,7 @@ public class TreeMap extends AbstractMap
    * @param node the current node, not nil
    * @return the prior node in sorted order
    */
-  private Node predecessor(Node node)
+  private Node<K,V> predecessor(Node<K,V> node)
   {
     if (node.left != nil)
       {
@@ -1169,21 +1169,21 @@ public class TreeMap extends AbstractMap
 
   /**
    * Construct a tree from sorted keys in linear time, with values of "".
-   * Package visible for use by TreeSet.
+   * Package visible for use by TreeSet, which uses a value type of String.
    *
    * @param keys the iterator over the sorted keys
    * @param count the number of nodes to insert
    * @see TreeSet#TreeSet(SortedSet)
    */
-  final void putKeysLinear(Iterator keys, int count)
+  final void putKeysLinear(Iterator<K> keys, int count)
   {
     fabricateTree(count);
-    Node node = firstNode();
+    Node<K,V> node = firstNode();
 
     while (--count >= 0)
       {
         node.key = keys.next();
-        node.value = "";
+        node.value = (V) "";
         node = successor(node);
       }
   }
@@ -1211,10 +1211,10 @@ public class TreeMap extends AbstractMap
    *
    * @param node the node to remove
    */
-  final void removeNode(Node node)
+  final void removeNode(Node<K,V> node)
   {
-    Node splice;
-    Node child;
+    Node<K,V> splice;
+    Node<K,V> child;
 
     modCount++;
     size--;
@@ -1268,7 +1268,7 @@ public class TreeMap extends AbstractMap
    *
    * @param node the node to rotate
    */
-  private void rotateLeft(Node node)
+  private void rotateLeft(Node<K,V> node)
   {
     Node child = node.right;
     // if (node == nil || child == nil)
@@ -1301,7 +1301,7 @@ public class TreeMap extends AbstractMap
    *
    * @param node the node to rotate
    */
-  private void rotateRight(Node node)
+  private void rotateRight(Node<K,V> node)
   {
     Node child = node.left;
     // if (node == nil || child == nil)
@@ -1336,7 +1336,7 @@ public class TreeMap extends AbstractMap
    * @param node the current node, not nil
    * @return the next node in sorted order
    */
-  final Node successor(Node node)
+  final Node<K,V> successor(Node<K,V> node)
   {
     if (node.right != nil)
       {
@@ -1346,7 +1346,7 @@ public class TreeMap extends AbstractMap
         return node;
       }
 
-    Node parent = node.parent;
+    Node<K,V> parent = node.parent;
     // Exploit fact that nil.right == nil and node is non-nil.
     while (node == parent.right)
       {
@@ -1489,24 +1489,26 @@ public class TreeMap extends AbstractMap
    *
    * @author Eric Blake (ebb9@email.byu.edu)
    */
-  private final class SubMap extends AbstractMap implements SortedMap
+  private final class SubMap<SK extends K,SV extends V>
+    extends AbstractMap<SK,SV>
+    implements SortedMap<SK,SV>
   {
     /**
      * The lower range of this view, inclusive, or nil for unbounded.
      * Package visible for use by nested classes.
      */
-    final Object minKey;
+    final SK minKey;
 
     /**
      * The upper range of this view, exclusive, or nil for unbounded.
      * Package visible for use by nested classes.
      */
-    final Object maxKey;
+    final SK maxKey;
 
     /**
      * The cache for {@link #entrySet()}.
      */
-    private Set entries;
+    private Set<Map.Entry<SK,SV>> entries;
 
     /**
      * Create a SubMap representing the elements between minKey (inclusive)
@@ -1517,9 +1519,9 @@ public class TreeMap extends AbstractMap
      * @param maxKey the upper bound
      * @throws IllegalArgumentException if minKey &gt; maxKey
      */
-    SubMap(Object minKey, Object maxKey)
+    SubMap(SK minKey, SK maxKey)
     {
-      if (minKey != nil && maxKey != nil && compare(minKey, maxKey) > 0)
+      if (minKey != nil && maxKey != nil && compare((K) minKey, (K) maxKey) > 0)
         throw new IllegalArgumentException("fromKey > toKey");
       this.minKey = minKey;
       this.maxKey = maxKey;
@@ -1533,10 +1535,10 @@ public class TreeMap extends AbstractMap
      * @param key the key to check
      * @return true if the key is in range
      */
-    boolean keyInRange(Object key)
+    boolean keyInRange(SK key)
     {
-      return ((minKey == nil || compare(key, minKey) >= 0)
-              && (maxKey == nil || compare(key, maxKey) < 0));
+      return ((minKey == nil || compare((K) key, (K) minKey) >= 0)
+              && (maxKey == nil || compare((K) key, (K) maxKey) < 0));
     }
 
     public void clear()
@@ -1551,14 +1553,14 @@ public class TreeMap extends AbstractMap
         }
     }
 
-    public Comparator comparator()
+    public Comparator<? super SK> comparator()
     {
       return comparator;
     }
 
     public boolean containsKey(Object key)
     {
-      return keyInRange(key) && TreeMap.this.containsKey(key);
+      return keyInRange((SK) key) && TreeMap.this.containsKey(key);
     }
 
     public boolean containsValue(Object value)
@@ -1574,19 +1576,19 @@ public class TreeMap extends AbstractMap
       return false;
     }
 
-    public Set entrySet()
+    public Set<Map.Entry<SK,SV>> entrySet()
     {
       if (entries == null)
         // Create an AbstractSet with custom implementations of those methods
         // that can be overriden easily and efficiently.
-        entries = new AbstractSet()
+        entries = new AbstractSet<Map.Entry<SK,SV>>()
         {
           public int size()
           {
             return SubMap.this.size();
           }
 
-          public Iterator iterator()
+          public Iterator<Map.Entry<SK,SV>> iterator()
           {
             Node first = lowestGreaterThan(minKey, true);
             Node max = lowestGreaterThan(maxKey, false);
@@ -1602,11 +1604,11 @@ public class TreeMap extends AbstractMap
           {
             if (! (o instanceof Map.Entry))
               return false;
-            Map.Entry me = (Map.Entry) o;
-            Object key = me.getKey();
+            Map.Entry<SK,SV> me = (Map.Entry<SK,SV>) o;
+            SK key = me.getKey();
             if (! keyInRange(key))
               return false;
-            Node n = getNode(key);
+            Node<K,V> n = getNode((K) key);
             return n != nil && AbstractSet.equals(me.getValue(), n.value);
           }
 
@@ -1614,11 +1616,11 @@ public class TreeMap extends AbstractMap
           {
             if (! (o instanceof Map.Entry))
               return false;
-            Map.Entry me = (Map.Entry) o;
-            Object key = me.getKey();
+            Map.Entry<SK,SV> me = (Map.Entry<SK,SV>) o;
+            SK key = me.getKey();
             if (! keyInRange(key))
               return false;
-            Node n = getNode(key);
+            Node<K,V> n = getNode((K) key);
             if (n != nil && AbstractSet.equals(me.getValue(), n.value))
               {
                 removeNode(n);
@@ -1630,29 +1632,29 @@ public class TreeMap extends AbstractMap
       return entries;
     }
 
-    public Object firstKey()
+    public SK firstKey()
     {
-      Node node = lowestGreaterThan(minKey, true);
+      Node<SK,SV> node = (Node<SK,SV>) lowestGreaterThan(minKey, true);
       if (node == nil || ! keyInRange(node.key))
         throw new NoSuchElementException();
       return node.key;
     }
 
-    public Object get(Object key)
+    public SV get(Object key)
     {
-      if (keyInRange(key))
-        return TreeMap.this.get(key);
+      if (keyInRange((SK) key))
+        return (SV) TreeMap.this.get(key);
       return null;
     }
 
-    public SortedMap headMap(Object toKey)
+    public SortedMap<SK,SV> headMap(SK toKey)
     {
       if (! keyInRange(toKey))
         throw new IllegalArgumentException("key outside range");
       return new SubMap(minKey, toKey);
     }
 
-    public Set keySet()
+    public Set<SK> keySet()
     {
       if (this.keys == null)
         // Create an AbstractSet with custom implementations of those methods
@@ -1664,7 +1666,7 @@ public class TreeMap extends AbstractMap
             return SubMap.this.size();
           }
 
-          public Iterator iterator()
+          public Iterator<SK> iterator()
           {
             Node first = lowestGreaterThan(minKey, true);
             Node max = lowestGreaterThan(maxKey, false);
@@ -1678,16 +1680,16 @@ public class TreeMap extends AbstractMap
 
           public boolean contains(Object o)
           {
-            if (! keyInRange(o))
+            if (! keyInRange((SK) o))
               return false;
-            return getNode(o) != nil;
+            return getNode((K) o) != nil;
           }
 
           public boolean remove(Object o)
           {
-            if (! keyInRange(o))
+            if (! keyInRange((SK) o))
               return false;
-            Node n = getNode(o);
+            Node n = getNode((K) o);
             if (n != nil)
               {
                 removeNode(n);
@@ -1699,25 +1701,25 @@ public class TreeMap extends AbstractMap
       return this.keys;
     }
 
-    public Object lastKey()
+    public SK lastKey()
     {
-      Node node = highestLessThan(maxKey);
+      Node<SK,SV> node = (Node<SK,SV>) highestLessThan(maxKey);
       if (node == nil || ! keyInRange(node.key))
         throw new NoSuchElementException();
-      return node.key;
+      return (SK) node.key;
     }
 
-    public Object put(Object key, Object value)
+    public SV put(SK key, SV value)
     {
       if (! keyInRange(key))
         throw new IllegalArgumentException("Key outside range");
-      return TreeMap.this.put(key, value);
+      return (SV) TreeMap.this.put(key, value);
     }
 
-    public Object remove(Object key)
+    public SV remove(Object key)
     {
-      if (keyInRange(key))
-        return TreeMap.this.remove(key);
+      if (keyInRange((SK)key))
+        return (SV) TreeMap.this.remove(key);
       return null;
     }
 
@@ -1734,21 +1736,21 @@ public class TreeMap extends AbstractMap
       return count;
     }
 
-    public SortedMap subMap(Object fromKey, Object toKey)
+    public SortedMap<SK, SV> subMap(SK fromKey, SK toKey)
     {
       if (! keyInRange(fromKey) || ! keyInRange(toKey))
         throw new IllegalArgumentException("key outside range");
       return new SubMap(fromKey, toKey);
     }
 
-    public SortedMap tailMap(Object fromKey)
+    public SortedMap<SK, SV> tailMap(SK fromKey)
     {
       if (! keyInRange(fromKey))
         throw new IllegalArgumentException("key outside range");
       return new SubMap(fromKey, maxKey);
     }
 
-    public Collection values()
+    public Collection<SV> values()
     {
       if (this.values == null)
         // Create an AbstractCollection with custom implementations of those
@@ -1760,7 +1762,7 @@ public class TreeMap extends AbstractMap
             return SubMap.this.size();
           }
 
-          public Iterator iterator()
+          public Iterator<SV> iterator()
           {
             Node first = lowestGreaterThan(minKey, true);
             Node max = lowestGreaterThan(maxKey, false);