Hi, This fixes --enable-collections by adding the new java.util classes and by using Iterators explicitly (not through the enhanced for-loop which only works with java.lang.Iterable). But I am not sure it really makes sense to keep this supported. Could someone that uses it test that it still works as expected?
2007-04-06 Mark Wielaard <[EMAIL PROTECTED]> * lib/mkcollections.pl.in: Add externalclasses. * java/util/Collections.java: Unroll enhanced for loops. * java/util/HashMap.java: Likewise. * java/util/Hashtable.java: Likewise. * java/util/TreeMap.java: Likewise. Committed, Mark
Index: lib/mkcollections.pl.in =================================================================== RCS file: /cvsroot/classpath/classpath/lib/mkcollections.pl.in,v retrieving revision 1.5 diff -u -r1.5 mkcollections.pl.in --- lib/mkcollections.pl.in 22 Jul 2006 20:30:47 -0000 1.5 +++ lib/mkcollections.pl.in 6 Apr 2007 15:35:55 -0000 @@ -55,6 +55,12 @@ TreeMap TreeSet Vector); +my @externalclasses=qw(AbstractQueue + ArrayDeque + Deque + NavigableMap + NavigableSet + Queue); my $destPkg = $destpath; $destPkg =~ s!/!.!g; @@ -109,6 +115,9 @@ for $clazz (@javautilclasses) { $_ =~ s/java.util.$clazz/$clazz/g; } + for $clazz (@externalclasses) { + $_ =~ s/java.util.$clazz/$clazz/g; + } $_ =~ s/abstract (interface)/$1/g; @@ -139,3 +148,11 @@ print "$outfile\n"; convert ($file, $infile, $outfile); } + +for $file (@externalclasses) { + my $infile = "$classpath/external/jsr166/java/util/$file.java"; + my $outfile = "$destpath/$file.java"; + print "$outfile\n"; + convert ($file, $infile, $outfile); +} + Index: java/util/Collections.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Collections.java,v retrieving revision 1.49 diff -u -r1.49 Collections.java --- java/util/Collections.java 28 Dec 2006 23:30:53 -0000 1.49 +++ java/util/Collections.java 6 Apr 2007 15:35:56 -0000 @@ -1462,8 +1462,10 @@ public static int frequency (Collection<?> c, Object o) { int result = 0; - for (Object v : c) + final Iterator<?> it = c.iterator(); + while (it.hasNext()) { + Object v = it.next(); if (AbstractCollection.equals(o, v)) ++result; } @@ -1524,8 +1526,9 @@ public static boolean disjoint(Collection<?> c1, Collection<?> c2) { Collection<Object> oc1 = (Collection<Object>) c1; - for (Object o : oc1) - if (c2.contains(o)) + final Iterator<Object> it = oc1.iterator(); + while (it.hasNext()) + if (c2.contains(it.next())) return false; return true; } @@ -5827,8 +5830,10 @@ public boolean addAll(Collection<? extends E> coll) { Collection<E> typedColl = (Collection<E>) c; - for (E element : typedColl) + final Iterator<E> it = typedColl.iterator(); + while (it.hasNext()) { + final E element = it.next(); if (!type.isInstance(element)) throw new ClassCastException("A member of the collection is not of the correct type."); } @@ -6169,9 +6174,10 @@ public boolean addAll(int index, Collection<? extends E> coll) { Collection<E> typedColl = (Collection<E>) coll; - for (E element : typedColl) + final Iterator<E> it = typedColl.iterator(); + while (it.hasNext()) { - if (!type.isInstance(element)) + if (!type.isInstance(it.next())) throw new ClassCastException("A member of the collection is not of the correct type."); } return list.addAll(index, coll); @@ -6872,8 +6878,10 @@ public void putAll(Map<? extends K, ? extends V> map) { Map<K,V> typedMap = (Map<K,V>) map; - for (Map.Entry<K,V> entry : typedMap.entrySet()) + final Iterator<Map.Entry<K,V>> it = typedMap.entrySet().iterator(); + while (it.hasNext()) { + final Map.Entry<K,V> entry = it.next(); if (!keyType.isInstance(entry.getKey())) throw new ClassCastException("A key is of the wrong type."); if (!valueType.isInstance(entry.getValue())) @@ -7494,8 +7502,9 @@ public boolean addAll(Collection<? extends T> c) { boolean result = false; - for (T e : c) - result |= deque.offerFirst(e); + final Iterator<? extends T> it = c.iterator(); + while (it.hasNext()) + result |= deque.offerFirst(it.next()); return result; } @@ -7572,8 +7581,9 @@ public boolean addAll(Collection<? extends E> c) { boolean result = false; - for (E e : c) - result |= (map.put(e, true) == null); + final Iterator<? extends E> it = c.iterator(); + while (it.hasNext()) + result |= (map.put(it.next(), true) == null); return result; } Index: java/util/HashMap.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/HashMap.java,v retrieving revision 1.33 diff -u -r1.33 HashMap.java --- java/util/HashMap.java 10 Dec 2006 20:25:46 -0000 1.33 +++ java/util/HashMap.java 6 Apr 2007 15:35:56 -0000 @@ -380,11 +380,11 @@ */ public void putAll(Map<? extends K, ? extends V> m) { - Map<K,V> addMap; - - addMap = (Map<K,V>) m; - for (Map.Entry<K,V> e : addMap.entrySet()) + final Map<K,V> addMap = (Map<K,V>) m; + final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator(); + while (it.hasNext()) { + final Map.Entry<K,V> e = it.next(); // Optimize in case the Entry is one of our own. if (e instanceof AbstractMap.SimpleEntry) { @@ -710,12 +710,12 @@ */ void putAllInternal(Map<? extends K, ? extends V> m) { - Map<K,V> addMap; - - addMap = (Map<K,V>) m; + final Map<K,V> addMap = (Map<K,V>) m; + final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator(); size = 0; - for (Map.Entry<K,V> e : addMap.entrySet()) + while (it.hasNext()) { + final Map.Entry<K,V> e = it.next(); size++; K key = e.getKey(); int idx = hash(key); Index: java/util/Hashtable.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Hashtable.java,v retrieving revision 1.40 diff -u -r1.40 Hashtable.java --- java/util/Hashtable.java 10 Dec 2006 20:25:46 -0000 1.40 +++ java/util/Hashtable.java 6 Apr 2007 15:35:56 -0000 @@ -505,12 +505,11 @@ */ public synchronized void putAll(Map<? extends K, ? extends V> m) { - Map<K,V> addMap; - - addMap = (Map<K,V>) m; - - for (Map.Entry<K,V> e : addMap.entrySet()) + final Map<K,V> addMap = (Map<K,V>) m; + final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator(); + while (it.hasNext()) { + final Map.Entry<K,V> e = it.next(); // Optimize in case the Entry is one of our own. if (e instanceof AbstractMap.SimpleEntry) { @@ -857,13 +856,12 @@ */ void putAllInternal(Map<? extends K, ? extends V> m) { - Map<K,V> addMap; - - addMap = (Map<K,V>) m; + final Map<K,V> addMap = (Map<K,V>) m; + final Iterator<Map.Entry<K,V>> it = addMap.entrySet().iterator(); size = 0; - - for (Map.Entry<K,V> e : addMap.entrySet()) + while (it.hasNext()); { + final Map.Entry<K,V> e = it.next(); size++; K key = e.getKey(); int idx = hash(key); Index: java/util/TreeMap.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/TreeMap.java,v retrieving revision 1.33 diff -u -r1.33 TreeMap.java --- java/util/TreeMap.java 28 Dec 2006 03:04:42 -0000 1.33 +++ java/util/TreeMap.java 6 Apr 2007 15:35:56 -0000 @@ -2721,8 +2721,10 @@ public String toString() { StringBuilder r = new StringBuilder("{"); - for (Entry<DK,DV> e : entrySet()) + final Iterator<Entry<DK,DV>> it = entrySet().iterator(); + while (it.hasNext()) { + final Entry<DK,DV> e = it.next(); r.append(e.getKey()); r.append('='); r.append(e.getValue()); @@ -3157,8 +3159,10 @@ public String toString() { StringBuilder r = new StringBuilder("["); - for (D o : this) + final Iterator<D> it = iterator(); + while (it.hasNext()) { + final D o = it.next(); if (o == this) r.append("<this>"); else