Index: java/util/DoubleEnumeration.java =================================================================== RCS file: /cvs/classpath/java/util/DoubleEnumeration.java,v retrieving revision 1.5 diff -u -r1.5 DoubleEnumeration.java --- java/util/DoubleEnumeration.java 2000/10/26 10:19:00 1.5 +++ java/util/DoubleEnumeration.java 2001/01/09 22:46:49 @@ -1,5 +1,5 @@ -/* java.util.DoubleEnumeration - Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* gnu.java.util.DoubleEnumeration + Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -24,57 +24,68 @@ This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ +package gnu.java.util; -package java.util; import java.io.*; +import java.util.Enumeration; +import java.util.NoSuchElementException; + /** - * This is a package private class that combines two Enumerations. + * This is a helper class that combines two Enumerations. * It returns the elements of the first Enumeration until it has * no more elements and then returns the elements of the second * Enumeration.
* * In the default case: *
+ * doubleEnum = new DoubleEnumeration(enum1, enum2);
  * while (doubleEnum.hasMoreElements()) {
  *    Object o = doubleEnum.nextElement();
  *    do_something(o);
  * }
  * 
- * it calls hasMoreElements of the first Enumeration as few times as + * it calls hasMoreElements of the Enumerations as few times as * possible. + * The references to the Enumerations are cleared as soon as they have no + * more elements to help garbage collecting. * - * @author Jochen Hoenicke */ -class DoubleEnumeration implements Enumeration + * @author Jochen Hoenicke + * @author Mark Wielaard (address@hidden) + */ +public class DoubleEnumeration implements Enumeration { /** - * This is true as long as the first enumeration may have more + * This is true as long as one of the enumerations has more * elements. + * Only valid when hasChecked is true. + * Set in hasMoreElements() */ - boolean hasMore; + private boolean hasMore; /** - * This is true, if it is sure that the first enumeration has + * This is true, if it is sure that hasMore indicates wether there are * more elements. + * Set to true in hasMoreElements(). + * Set to false in getNextElement(). */ - boolean hasChecked; + private boolean hasChecked; /** * The first enumeration. */ - Enumeration e1; + private Enumeration e1; /** * The second enumeration. */ - Enumeration e2; + private Enumeration e2; /** * Creates a new Enumeration combining the given two enumerations. * The enumerations mustn't be accessed by other classes. */ - DoubleEnumeration(Enumeration e1, Enumeration e2) + public DoubleEnumeration(Enumeration e1, Enumeration e2) { this.e1 = e1; this.e2 = e2; - hasMore = true; hasChecked = false; } @@ -84,21 +95,34 @@ */ public boolean hasMoreElements() { - if (hasMore) - hasChecked = hasMore = e1.hasMoreElements(); - return hasMore ? true : e2.hasMoreElements(); + if (hasChecked) + return hasMore; + + hasMore = (e1 != null && e1.hasMoreElements()); + + if (!hasMore) { + e1 = e2; + e2 = null; + hasMore = (e1 != null && e1.hasMoreElements()); + } + + hasChecked = true; + return hasMore; } /** * Returns the next element. This returns the next element of the * first enumeration, if it has more elements, otherwise the next - * element of the second enumeration. + * element of the second enumeration. If both enumeration don't have + * any elements it throws a NoSuchElementException. */ public Object nextElement() { - if (hasMore && !hasChecked) - hasMore = e1.hasMoreElements(); - hasChecked = false; - return hasMore ? e1.nextElement() : e2.nextElement(); + if (!hasMoreElements()) + throw new NoSuchElementException(); + else { + hasChecked = false; + return e1.nextElement(); + } } }