151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util;
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class provides a skeletal implementation of the <tt>Collection</tt>
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interface, to minimize the effort required to implement this interface. <p>
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * To implement an unmodifiable collection, the programmer needs only to
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * extend this class and provide implementations for the <tt>iterator</tt> and
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>size</tt> methods.  (The iterator returned by the <tt>iterator</tt>
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method must implement <tt>hasNext</tt> and <tt>next</tt>.)<p>
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * To implement a modifiable collection, the programmer must additionally
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * override this class's <tt>add</tt> method (which otherwise throws an
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>UnsupportedOperationException</tt>), and the iterator returned by the
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>iterator</tt> method must additionally implement its <tt>remove</tt>
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method.<p>
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The programmer should generally provide a void (no argument) and
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Collection</tt> constructor, as per the recommendation in the
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>Collection</tt> interface specification.<p>
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The documentation for each non-abstract method in this class describes its
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation in detail.  Each of these methods may be overridden if
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the collection being implemented admits a more efficient implementation.<p>
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class is a member of the
52d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/collections/index.html">
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Collections Framework</a>.
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Josh Bloch
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Neal Gafter
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Collection
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class AbstractCollection<E> implements Collection<E> {
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sole constructor.  (For invocation by subclass constructors, typically
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implicit.)
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected AbstractCollection() {
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Query Operations
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns an iterator over the elements contained in this collection.
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return an iterator over the elements contained in this collection
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract Iterator<E> iterator();
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract int size();
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation returns <tt>size() == 0</tt>.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean isEmpty() {
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return size() == 0;
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over the elements in the collection,
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * checking each element in turn for equality with the specified element.
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException   {@inheritDoc}
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException {@inheritDoc}
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean contains(Object o) {
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (o==null) {
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            while (it.hasNext())
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (it.next()==null)
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return true;
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            while (it.hasNext())
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (o.equals(it.next()))
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return true;
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return false;
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation returns an array containing all the elements
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned by this collection's iterator, in the same order, stored in
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * consecutive elements of the array, starting with index {@code 0}.
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The length of the returned array is equal to the number of elements
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned by the iterator, even if the size of this collection changes
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * during iteration, as might happen if the collection permits
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * concurrent modification during iteration.  The {@code size} method is
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * called only as an optimization hint; the correct result is returned
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * even if the iterator returns a different number of elements.
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This method is equivalent to:
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *  <pre> {@code
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * List<E> list = new ArrayList<E>(size());
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for (E e : this)
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     list.add(e);
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * return list.toArray();
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * }</pre>
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object[] toArray() {
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Estimate size of array; be prepared to see more or fewer elements
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Object[] r = new Object[size()];
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < r.length; i++) {
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (! it.hasNext()) // fewer elements than expected
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return Arrays.copyOf(r, i);
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            r[i] = it.next();
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return it.hasNext() ? finishToArray(r, it) : r;
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation returns an array containing all the elements
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned by this collection's iterator in the same order, stored in
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * consecutive elements of the array, starting with index {@code 0}.
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If the number of elements returned by the iterator is too large to
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * fit into the specified array, then the elements are returned in a
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * newly allocated array with length equal to the number of elements
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned by the iterator, even if the size of this collection
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * changes during iteration, as might happen if the collection permits
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * concurrent modification during iteration.  The {@code size} method is
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * called only as an optimization hint; the correct result is returned
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * even if the iterator returns a different number of elements.
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This method is equivalent to:
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *  <pre> {@code
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * List<E> list = new ArrayList<E>(size());
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for (E e : this)
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     list.add(e);
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * return list.toArray(a);
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * }</pre>
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ArrayStoreException  {@inheritDoc}
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException {@inheritDoc}
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public <T> T[] toArray(T[] a) {
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Estimate size of array; be prepared to see more or fewer elements
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int size = size();
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        T[] r = a.length >= size ? a :
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                  (T[])java.lang.reflect.Array
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                  .newInstance(a.getClass().getComponentType(), size);
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (int i = 0; i < r.length; i++) {
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (! it.hasNext()) { // fewer elements than expected
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (a == r) {
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    r[i] = null; // null-terminate
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } else if (a.length < i) {
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return Arrays.copyOf(r, i);
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } else {
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    System.arraycopy(r, 0, a, 0, i);
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (a.length > i) {
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        a[i] = null;
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return a;
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            r[i] = (T)it.next();
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // more elements than expected
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return it.hasNext() ? finishToArray(r, it) : r;
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The maximum size of array to allocate.
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Some VMs reserve some header words in an array.
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to allocate larger arrays may result in
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * OutOfMemoryError: Requested array size exceeds VM limit
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Reallocates the array being used within toArray when the iterator
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned more elements than expected, and finishes filling it from
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the iterator.
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param r the array, replete with previously stored elements
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param it the in-progress iterator over this collection
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return array containing the elements in the given array, plus any
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         further elements returned by the iterator, trimmed to size
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int i = r.length;
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (it.hasNext()) {
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int cap = r.length;
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (i == cap) {
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                int newCap = cap + (cap >> 1) + 1;
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                // overflow-conscious code
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (newCap - MAX_ARRAY_SIZE > 0)
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    newCap = hugeCapacity(cap + 1);
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                r = Arrays.copyOf(r, newCap);
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            r[i++] = (T)it.next();
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // trim if overallocated
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (i == r.length) ? r : Arrays.copyOf(r, i);
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static int hugeCapacity(int minCapacity) {
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (minCapacity < 0) // overflow
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new OutOfMemoryError
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ("Required array size too large");
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (minCapacity > MAX_ARRAY_SIZE) ?
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            Integer.MAX_VALUE :
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            MAX_ARRAY_SIZE;
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Modification Operations
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation always throws an
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt>.
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalArgumentException      {@inheritDoc}
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalStateException         {@inheritDoc}
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean add(E e) {
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new UnsupportedOperationException();
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over the collection looking for the
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified element.  If it finds the element, it removes the element
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * from the collection using the iterator's remove method.
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Note that this implementation throws an
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt> if the iterator returned by this
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * collection's iterator method does not implement the <tt>remove</tt>
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method and this collection contains the specified object.
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean remove(Object o) {
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (o==null) {
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            while (it.hasNext()) {
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (it.next()==null) {
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    it.remove();
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return true;
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            while (it.hasNext()) {
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (o.equals(it.next())) {
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    it.remove();
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    return true;
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return false;
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Bulk Operations
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over the specified collection,
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * checking each element returned by the iterator in turn to see
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if it's contained in this collection.  If all elements are so
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * contained <tt>true</tt> is returned, otherwise <tt>false</tt>.
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #contains(Object)
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean containsAll(Collection<?> c) {
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (Object e : c)
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (!contains(e))
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return false;
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return true;
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over the specified collection, and adds
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * each object returned by the iterator to this collection, in turn.
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Note that this implementation will throw an
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt> unless <tt>add</tt> is
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * overridden (assuming the specified collection is non-empty).
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalArgumentException      {@inheritDoc}
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IllegalStateException         {@inheritDoc}
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #add(Object)
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean addAll(Collection<? extends E> c) {
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean modified = false;
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (E e : c)
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (add(e))
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                modified = true;
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return modified;
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over this collection, checking each
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * element returned by the iterator in turn to see if it's contained
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the specified collection.  If it's so contained, it's removed from
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this collection with the iterator's <tt>remove</tt> method.
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Note that this implementation will throw an
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt> if the iterator returned by the
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and this collection contains one or more elements in common with the
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified collection.
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #remove(Object)
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #contains(Object)
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean removeAll(Collection<?> c) {
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean modified = false;
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<?> it = iterator();
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (it.hasNext()) {
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (c.contains(it.next())) {
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                it.remove();
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                modified = true;
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return modified;
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over this collection, checking each
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * element returned by the iterator in turn to see if it's contained
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the specified collection.  If it's not so contained, it's removed
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * from this collection with the iterator's <tt>remove</tt> method.
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Note that this implementation will throw an
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt> if the iterator returned by the
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>iterator</tt> method does not implement the <tt>remove</tt> method
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and this collection contains one or more elements not present in the
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified collection.
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws ClassCastException            {@inheritDoc}
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException          {@inheritDoc}
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #remove(Object)
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #contains(Object)
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean retainAll(Collection<?> c) {
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        boolean modified = false;
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (it.hasNext()) {
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (!c.contains(it.next())) {
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                it.remove();
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                modified = true;
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return modified;
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@inheritDoc}
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>This implementation iterates over this collection, removing each
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * element using the <tt>Iterator.remove</tt> operation.  Most
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implementations will probably choose to override this method for
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * efficiency.
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Note that this implementation will throw an
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>UnsupportedOperationException</tt> if the iterator returned by this
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * collection's <tt>iterator</tt> method does not implement the
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>remove</tt> method and this collection is non-empty.
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws UnsupportedOperationException {@inheritDoc}
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void clear() {
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        while (it.hasNext()) {
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            it.next();
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            it.remove();
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    //  String conversion
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a string representation of this collection.  The string
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * representation consists of a list of the collection's elements in the
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * order they are returned by its iterator, enclosed in square brackets
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (<tt>"[]"</tt>).  Adjacent elements are separated by the characters
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>", "</tt> (comma and space).  Elements are converted to strings as
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by {@link String#valueOf(Object)}.
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a string representation of this collection
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Iterator<E> it = iterator();
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (! it.hasNext())
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return "[]";
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringBuilder sb = new StringBuilder();
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append('[');
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        for (;;) {
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            E e = it.next();
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sb.append(e == this ? "(this Collection)" : e);
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (! it.hasNext())
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return sb.append(']').toString();
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sb.append(',').append(' ');
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
466