Author: bayard
Date: Tue Sep 15 05:56:40 2009
New Revision: 815097
URL: http://svn.apache.org/viewvc?rev=815097&view=rev
Log:
Merging from -r468106:814127 of collections_jdk5_branch - namely where this
code was generified; mostly in r738956.
Also see the following revisions:
------------------------------------------------------------------------
r751869 | mbenson | 2009-03-09 15:10:00 -0700 (Mon, 09 Mar 2009) | 1 line
return type narrowing
------------------------------------------------------------------------
Modified:
commons/proper/collections/trunk/src/java/org/apache/commons/collections/set/ListOrderedSet.java
Modified:
commons/proper/collections/trunk/src/java/org/apache/commons/collections/set/ListOrderedSet.java
URL:
http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/set/ListOrderedSet.java?rev=815097&r1=815096&r2=815097&view=diff
==============================================================================
---
commons/proper/collections/trunk/src/java/org/apache/commons/collections/set/ListOrderedSet.java
(original)
+++
commons/proper/collections/trunk/src/java/org/apache/commons/collections/set/ListOrderedSet.java
Tue Sep 15 05:56:40 2009
@@ -21,8 +21,10 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.Set;
+import org.apache.commons.collections.OrderedIterator;
import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
import org.apache.commons.collections.list.UnmodifiableList;
@@ -36,7 +38,7 @@
* <p>
* The ListOrderedSet also has various useful direct methods. These include
many
* from <code>List</code>, such as <code>get(int)</code>,
<code>remove(int)</code>
- * and <code>indexOf(int)</code>. An unmodifiable <code>List</code> view of
+ * and <code>indexOf(int)</code>. An unmodifiable <code>List</code> view of
* the set can be obtained via <code>asList()</code>.
* <p>
* This class cannot implement the <code>List</code> interface directly as
@@ -50,26 +52,26 @@
* @author Stephen Colebourne
* @author Henning P. Schmiedehausen
*/
-public class ListOrderedSet extends AbstractSerializableSetDecorator
implements Set {
+public class ListOrderedSet<E> extends AbstractSerializableSetDecorator<E>
implements Set<E> {
/** Serialization version */
private static final long serialVersionUID = -228664372470420141L;
/** Internal list to hold the sequence of objects */
- protected final List setOrder;
+ protected final List<E> setOrder;
/**
* Factory method to create an ordered set specifying the list and set to
use.
* <p>
* The list and set must both be empty.
- *
+ *
* @param set the set to decorate, must be empty and not null
* @param list the list to decorate, must be empty and not null
* @throws IllegalArgumentException if set or list is null
* @throws IllegalArgumentException if either the set or list is not empty
* @since Commons Collections 3.1
*/
- public static ListOrderedSet decorate(Set set, List list) {
+ public static <E> ListOrderedSet<E> decorate(Set<E> set, List<E> list) {
if (set == null) {
throw new IllegalArgumentException("Set must not be null");
}
@@ -79,19 +81,19 @@
if (set.size() > 0 || list.size() > 0) {
throw new IllegalArgumentException("Set and List must be empty");
}
- return new ListOrderedSet(set, list);
+ return new ListOrderedSet<E>(set, list);
}
/**
* Factory method to create an ordered set.
* <p>
* An <code>ArrayList</code> is used to retain order.
- *
+ *
* @param set the set to decorate, must not be null
* @throws IllegalArgumentException if set is null
*/
- public static ListOrderedSet decorate(Set set) {
- return new ListOrderedSet(set);
+ public static <E> ListOrderedSet<E> decorate(Set<E> set) {
+ return new ListOrderedSet<E>(set);
}
/**
@@ -101,53 +103,53 @@
* <p>
* NOTE: If the list contains duplicates, the duplicates are removed,
* altering the specified list.
- *
+ *
* @param list the list to decorate, must not be null
* @throws IllegalArgumentException if list is null
*/
- public static ListOrderedSet decorate(List list) {
+ public static <E> ListOrderedSet<E> decorate(List<E> list) {
if (list == null) {
throw new IllegalArgumentException("List must not be null");
}
- Set set = new HashSet(list);
+ Set<E> set = new HashSet<E>(list);
list.retainAll(set);
-
- return new ListOrderedSet(set, list);
+
+ return new ListOrderedSet<E>(set, list);
}
//-----------------------------------------------------------------------
/**
* Constructs a new empty <code>ListOrderedSet</code> using
* a <code>HashSet</code> and an <code>ArrayList</code> internally.
- *
+ *
* @since Commons Collections 3.1
*/
public ListOrderedSet() {
- super(new HashSet());
- setOrder = new ArrayList();
+ super(new HashSet<E>());
+ setOrder = new ArrayList<E>();
}
/**
* Constructor that wraps (not copies).
- *
+ *
* @param set the set to decorate, must not be null
* @throws IllegalArgumentException if set is null
*/
- protected ListOrderedSet(Set set) {
+ protected ListOrderedSet(Set<E> set) {
super(set);
- setOrder = new ArrayList(set);
+ setOrder = new ArrayList<E>(set);
}
/**
* Constructor that wraps (not copies) the Set and specifies the list to
use.
* <p>
* The set and list must both be correctly initialised to the same
elements.
- *
+ *
* @param set the set to decorate, must not be null
* @param list the list to decorate, must not be null
* @throws IllegalArgumentException if set or list is null
*/
- protected ListOrderedSet(Set set, List list) {
+ protected ListOrderedSet(Set<E> set, List<E> list) {
super(set);
if (list == null) {
throw new IllegalArgumentException("List must not be null");
@@ -158,10 +160,10 @@
//-----------------------------------------------------------------------
/**
* Gets an unmodifiable view of the order of the Set.
- *
+ *
* @return an unmodifiable list view
*/
- public List asList() {
+ public List<E> asList() {
return UnmodifiableList.decorate(setOrder);
}
@@ -171,27 +173,22 @@
setOrder.clear();
}
- public Iterator iterator() {
- return new OrderedSetIterator(setOrder.iterator(), collection);
+ public OrderedIterator<E> iterator() {
+ return new OrderedSetIterator<E>(setOrder.listIterator(), collection);
}
- public boolean add(Object object) {
- if (collection.contains(object)) {
- // re-adding doesn't change order
- return collection.add(object);
- } else {
- // first add, so add to both set and list
- boolean result = collection.add(object);
+ public boolean add(E object) {
+ if (collection.add(object)) {
setOrder.add(object);
- return result;
+ return true;
}
+ return false;
}
- public boolean addAll(Collection coll) {
+ public boolean addAll(Collection<? extends E> coll) {
boolean result = false;
- for (Iterator it = coll.iterator(); it.hasNext();) {
- Object object = it.next();
- result = result | add(object);
+ for (E e : coll) {
+ result |= add(e);
}
return result;
}
@@ -202,25 +199,24 @@
return result;
}
- public boolean removeAll(Collection coll) {
+ public boolean removeAll(Collection<?> coll) {
boolean result = false;
- for (Iterator it = coll.iterator(); it.hasNext();) {
- Object object = it.next();
- result = result | remove(object);
+ for (Iterator<?> it = coll.iterator(); it.hasNext();) {
+ result |= remove(it.next());
}
return result;
}
- public boolean retainAll(Collection coll) {
+ public boolean retainAll(Collection<?> coll) {
boolean result = collection.retainAll(coll);
if (result == false) {
return false;
- } else if (collection.size() == 0) {
+ }
+ if (collection.size() == 0) {
setOrder.clear();
} else {
- for (Iterator it = setOrder.iterator(); it.hasNext();) {
- Object object = it.next();
- if (collection.contains(object) == false) {
+ for (Iterator<E> it = setOrder.iterator(); it.hasNext();) {
+ if (!collection.contains(it.next())) {
it.remove();
}
}
@@ -232,12 +228,12 @@
return setOrder.toArray();
}
- public Object[] toArray(Object a[]) {
+ public <T> T[] toArray(T a[]) {
return setOrder.toArray(a);
}
//-----------------------------------------------------------------------
- public Object get(int index) {
+ public E get(int index) {
return setOrder.get(index);
}
@@ -245,23 +241,22 @@
return setOrder.indexOf(object);
}
- public void add(int index, Object object) {
- if (contains(object) == false) {
+ public void add(int index, E object) {
+ if (!contains(object)) {
collection.add(object);
setOrder.add(index, object);
}
}
- public boolean addAll(int index, Collection coll) {
+ public boolean addAll(int index, Collection<? extends E> coll) {
boolean changed = false;
- for (Iterator it = coll.iterator(); it.hasNext();) {
- Object object = it.next();
- if (contains(object) == false) {
- collection.add(object);
- setOrder.add(index, object);
- index++;
- changed = true;
+ for (E e : coll) {
+ if (contains(e)) {
+ continue;
}
+ collection.add(e);
+ setOrder.add(index++, e);
+ changed = true;
}
return changed;
}
@@ -273,9 +268,9 @@
}
/**
- * Uses the underlying List's toString so that order is achieved.
- * This means that the decorated Set's toString is not used, so
- * any custom toStrings will be ignored.
+ * Uses the underlying List's toString so that order is achieved.
+ * This means that the decorated Set's toString is not used, so
+ * any custom toStrings will be ignored.
*/
// Fortunately List.toString and Set.toString look the same
public String toString() {
@@ -286,19 +281,20 @@
/**
* Internal iterator handle remove.
*/
- static class OrderedSetIterator extends AbstractIteratorDecorator {
-
+ static class OrderedSetIterator<E> extends AbstractIteratorDecorator<E>
implements OrderedIterator<E> {
+
/** Object we iterate on */
- protected final Collection set;
+ protected final Collection<E> set;
+
/** Last object retrieved */
- protected Object last;
+ protected E last;
- private OrderedSetIterator(Iterator iterator, Collection set) {
+ private OrderedSetIterator(ListIterator<E> iterator, Collection<E>
set) {
super(iterator);
this.set = set;
}
- public Object next() {
+ public E next() {
last = iterator.next();
return last;
}
@@ -308,6 +304,15 @@
iterator.remove();
last = null;
}
+
+ public boolean hasPrevious() {
+ return ((ListIterator<E>) iterator).hasPrevious();
+ }
+
+ public E previous() {
+ last = ((ListIterator<E>) iterator).previous();
+ return last;
+ }
}
}