1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License. You may obtain a copy of the License at 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Array; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class {@code AbstractCollection} is an abstract implementation of the {@code 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Collection} interface. A subclass must implement the abstract methods {@code 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * iterator()} and {@code size()} to create an immutable collection. To create a 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * modifiable collection it's necessary to override the {@code add()} method that 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * currently throws an {@code UnsupportedOperationException}. 283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * 293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @since 1.2 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class AbstractCollection<E> implements Collection<E> { 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * Constructs a new instance of this AbstractCollection. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected AbstractCollection() { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean add(E object) { 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new UnsupportedOperationException(); 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempts to add all of the objects contained in {@code collection} 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to the contents of this {@code Collection} (optional). This implementation 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * iterates over the given {@code Collection} and calls {@code add} for each 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element. If any of these calls return {@code true}, then {@code true} is 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returned as result of this method call, {@code false} otherwise. If this 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} does not support adding elements, an {@code 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * UnsupportedOperationException} is thrown. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the passed {@code Collection} is changed during the process of adding elements 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to this {@code Collection}, the behavior depends on the behavior of the passed 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection}. 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param collection 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the collection of objects. 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this {@code Collection} is modified, {@code false} 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise. 613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws UnsupportedOperationException 623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if adding to this {@code Collection} is not supported. 633819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if the class of an object is inappropriate for this 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection}. 663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws IllegalArgumentException 673819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if an object cannot be added to this {@code Collection}. 683819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 693819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if {@code collection} is {@code null}, or if it contains 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code null} elements and this {@code Collection} does not support 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * such elements. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean addAll(Collection<? extends E> collection) { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean result = false; 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<? extends E> it = collection.iterator(); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (add(it.next())) { 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = true; 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Removes all elements from this {@code Collection}, leaving it empty (optional). 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This implementation iterates over this {@code Collection} and calls the {@code 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * remove} method on each element. If the iterator does not support removal 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of elements, an {@code UnsupportedOperationException} is thrown. 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Concrete implementations usually can clear a {@code Collection} more efficiently 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and should therefore overwrite this method. 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws UnsupportedOperationException 943819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * it the iterator does not support removing elements from 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this {@code Collection} 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #iterator 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #isEmpty 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #size 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void clear() { 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<E> it = iterator(); 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.next(); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.remove(); 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Tests whether this {@code Collection} contains the specified object. This 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implementation iterates over this {@code Collection} and tests, whether any 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element is equal to the given object. If {@code object != null} then 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code object.equals(e)} is called for each element {@code e} returned by 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the iterator until the element is found. If {@code object == null} then 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * each element {@code e} returned by the iterator is compared with the test 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code e == null}. 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param object 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the object to search for. 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if object is an element of this {@code Collection}, {@code 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * false} otherwise. 1213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the object to look for isn't of the correct type. 1233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the object to look for is {@code null} and this 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} doesn't support {@code null} elements. 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean contains(Object object) { 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<E> it = iterator(); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (object != null) { 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (object.equals(it.next())) { 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (it.next() == null) { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Tests whether this {@code Collection} contains all objects contained in the 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified {@code Collection}. This implementation iterates over the specified 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection}. If one element returned by the iterator is not contained in 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this {@code Collection}, then {@code false} is returned; {@code true} otherwise. 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param collection 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the collection of objects. 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if all objects in the specified {@code Collection} are 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements of this {@code Collection}, {@code false} otherwise. 1553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if one or more elements of {@code collection} isn't of the 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * correct type. 1583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} contains at least one {@code null} 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element and this {@code Collection} doesn't support {@code null} 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements. 1623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} is {@code null}. 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean containsAll(Collection<?> collection) { 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = collection.iterator(); 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!contains(it.next())) { 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns if this {@code Collection} contains no elements. This implementation 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * tests, whether {@code size} returns 0. 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this {@code Collection} has no elements, {@code false} 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise. 1813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #size 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean isEmpty() { 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return size() == 0; 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an instance of {@link Iterator} that may be used to access the 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * objects contained by this {@code Collection}. The order in which the elements are 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returned by the {@link Iterator} is not defined unless the instance of the 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} has a defined order. In that case, the elements are returned in that order. 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In this class this method is declared abstract and has to be implemented 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by concrete {@code Collection} implementations. 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return an iterator for accessing the {@code Collection} contents. 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract Iterator<E> iterator(); 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Removes one instance of the specified object from this {@code Collection} if one 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is contained (optional). This implementation iterates over this 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} and tests for each element {@code e} returned by the iterator, 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * whether {@code e} is equal to the given object. If {@code object != null} 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * then this test is performed using {@code object.equals(e)}, otherwise 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * using {@code object == null}. If an element equal to the given object is 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * found, then the {@code remove} method is called on the iterator and 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code true} is returned, {@code false} otherwise. If the iterator does 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * not support removing elements, an {@code UnsupportedOperationException} 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is thrown. 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param object 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the object to remove. 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this {@code Collection} is modified, {@code false} 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise. 2173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws UnsupportedOperationException 2183819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if removing from this {@code Collection} is not supported. 2193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 2203819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if the object passed is not of the correct type. 2213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code object} is {@code null} and this {@code Collection} 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * doesn't support {@code null} elements. 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean remove(Object object) { 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = iterator(); 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (object != null) { 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (object.equals(it.next())) { 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.remove(); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (it.next() == null) { 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.remove(); 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Removes all occurrences in this {@code Collection} of each object in the 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified {@code Collection} (optional). After this method returns none of the 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements in the passed {@code Collection} can be found in this {@code Collection} 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * anymore. 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This implementation iterates over this {@code Collection} and tests for each 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element {@code e} returned by the iterator, whether it is contained in 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the specified {@code Collection}. If this test is positive, then the {@code 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * remove} method is called on the iterator. If the iterator does not 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * support removing elements, an {@code UnsupportedOperationException} is 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown. 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param collection 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the collection of objects to remove. 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this {@code Collection} is modified, {@code false} 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise. 2623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws UnsupportedOperationException 2633819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if removing from this {@code Collection} is not supported. 2643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if one or more elements of {@code collection} isn't of the 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * correct type. 2673819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} contains at least one {@code null} 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element and this {@code Collection} doesn't support {@code null} 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements. 2713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} is {@code null}. 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean removeAll(Collection<?> collection) { 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean result = false; 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = iterator(); 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (collection.contains(it.next())) { 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.remove(); 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = true; 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Removes all objects from this {@code Collection} that are not also found in the 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} passed (optional). After this method returns this {@code Collection} 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will only contain elements that also can be found in the {@code Collection} 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed to this method. 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This implementation iterates over this {@code Collection} and tests for each 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element {@code e} returned by the iterator, whether it is contained in 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the specified {@code Collection}. If this test is negative, then the {@code 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * remove} method is called on the iterator. If the iterator does not 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * support removing elements, an {@code UnsupportedOperationException} is 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thrown. 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param collection 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the collection of objects to retain. 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this {@code Collection} is modified, {@code false} 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * otherwise. 3033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws UnsupportedOperationException 3043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * if removing from this {@code Collection} is not supported. 3053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws ClassCastException 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if one or more elements of {@code collection} 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * isn't of the correct type. 3083819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} contains at least one 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code null} element and this {@code Collection} doesn't support 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code null} elements. 3123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @throws NullPointerException 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if {@code collection} is {@code null}. 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean retainAll(Collection<?> collection) { 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean result = false; 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = iterator(); 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!collection.contains(it.next())) { 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project it.remove(); 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = true; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a count of how many objects this {@code Collection} contains. 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In this class this method is declared abstract and has to be implemented 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by concrete {@code Collection} implementations. 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return how many objects this {@code Collection} contains, or {@code Integer.MAX_VALUE} 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if there are more than {@code Integer.MAX_VALUE} elements in this 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection}. 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public abstract int size(); 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Object[] toArray() { 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int size = size(), index = 0; 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = iterator(); 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object[] array = new Object[size]; 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (index < size) { 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project array[index++] = it.next(); 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return array; 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @SuppressWarnings("unchecked") 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public <T> T[] toArray(T[] contents) { 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int size = size(), index = 0; 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (size > contents.length) { 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Class<?> ct = contents.getClass().getComponentType(); 3543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson contents = (T[]) Array.newInstance(ct, size); 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 3563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson for (E entry : this) { 3573819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson contents[index++] = (T) entry; 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (index < contents.length) { 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project contents[index] = null; 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return contents; 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the string representation of this {@code Collection}. The presentation 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has a specific format. It is enclosed by square brackets ("[]"). Elements 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are separated by ', ' (comma and space). 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the string representation of this {@code Collection}. 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (isEmpty()) { 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "[]"; //$NON-NLS-1$ 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder buffer = new StringBuilder(size() * 16); 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer.append('['); 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Iterator<?> it = iterator(); 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (it.hasNext()) { 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object next = it.next(); 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (next != this) { 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer.append(next); 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer.append("(this Collection)"); //$NON-NLS-1$ 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 3883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson if (it.hasNext()) { 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer.append(", "); //$NON-NLS-1$ 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project buffer.append(']'); 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return buffer.toString(); 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 396