aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/AbstractSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/AbstractSet.java')
-rw-r--r--libjava/java/util/AbstractSet.java72
1 files changed, 59 insertions, 13 deletions
diff --git a/libjava/java/util/AbstractSet.java b/libjava/java/util/AbstractSet.java
index 6c3f219..e45e47e 100644
--- a/libjava/java/util/AbstractSet.java
+++ b/libjava/java/util/AbstractSet.java
@@ -1,5 +1,5 @@
/* AbstractSet.java -- Abstract implementation of most of Set
- Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -35,10 +35,28 @@ package java.util;
* on them - specifically, no element may be in the set more than once). This
* class simply provides implementations of equals() and hashCode() to fulfil
* the requirements placed on them by the Set interface.
+ *
+ * @author Original author unknown
+ * @author Eric Blake <ebb9@email.byu.edu>
+ * @see Collection
+ * @see AbstractCollection
+ * @see Set
+ * @see HashSet
+ * @see TreeSet
+ * @see LinkedHashSet
+ * @since 1.2
+ * @status updated to 1.4
*/
public abstract class AbstractSet extends AbstractCollection implements Set
{
/**
+ * The main constructor, for use by subclasses.
+ */
+ protected AbstractSet()
+ {
+ }
+
+ /**
* Tests whether the given object is equal to this Set. This implementation
* first checks whether this set <em>is</em> the given object, and returns
* true if so. Otherwise, if o is a Set and is the same size as this one, it
@@ -50,12 +68,9 @@ public abstract class AbstractSet extends AbstractCollection implements Set
*/
public boolean equals(Object o)
{
- if (o == this)
- return true;
- else if (o instanceof Set && ((Set) o).size() == size())
- return containsAll((Collection) o);
- else
- return false;
+ return (o == this ||
+ (o instanceof Set && ((Set) o).size() == size()
+ && containsAll((Collection) o)));
}
/**
@@ -69,14 +84,45 @@ public abstract class AbstractSet extends AbstractCollection implements Set
public int hashCode()
{
Iterator itr = iterator();
- int size = size();
int hash = 0;
- for (int pos = 0; pos < size; pos++)
+ int pos = size();
+ while (--pos >= 0)
+ hash += hashCode(itr.next());
+ return hash;
+ }
+
+ /**
+ * Removes from this set all elements in the given collection (optional
+ * operation). This implementation uses <code>size()</code> to determine
+ * the smaller collection. Then, if this set is smaller, it iterates
+ * over the set, calling Iterator.remove if the collection contains
+ * the element. If this set is larger, it iterates over the collection,
+ * calling Set.remove for all elements in the collection. Note that
+ * this operation will fail if a remove methods is not supported.
+ *
+ * @param c the collection of elements to remove
+ * @return true if the set was modified as a result
+ * @throws UnsupportedOperationException if remove is not supported
+ * @throws NullPointerException if the collection is null
+ * @see AbstractCollection#remove(Object)
+ * @see Collection#contains(Object)
+ * @see Iterator#remove()
+ */
+ public boolean removeAll(Collection c)
+ {
+ int oldsize = size();
+ int count = c.size();
+ Iterator i;
+ if (oldsize < count)
{
- Object obj = itr.next();
- if (obj != null)
- hash += obj.hashCode();
+ for (i = iterator(), count = oldsize; count > 0; count--)
+ if (c.contains(i.next()))
+ i.remove();
}
- return hash;
+ else
+ for (i = c.iterator(); count > 0; count--)
+ remove(i.next());
+ return oldsize != size();
}
+
}