mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			767 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			767 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Java
		
	
	
	
/* Vector.java -- Class that provides growable arrays.
 | 
						|
   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath is distributed in the hope that it will be useful, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | 
						|
02111-1307 USA.
 | 
						|
 | 
						|
As a special exception, if you link this library with other files to
 | 
						|
produce an executable, this library does not by itself cause the
 | 
						|
resulting executable to be covered by the GNU General Public License.
 | 
						|
This exception does not however invalidate any other reasons why the
 | 
						|
executable file might be covered by the GNU General Public License. */
 | 
						|
 | 
						|
 | 
						|
package java.util;
 | 
						|
import java.lang.reflect.Array;
 | 
						|
import java.io.Serializable;
 | 
						|
 | 
						|
/**
 | 
						|
 * the <b>Vector</b> classes implements growable arrays of Objects.
 | 
						|
 * You can access elements in a Vector with an index, just as you
 | 
						|
 * can in a built in array, but Vectors can grow and shrink to accomodate
 | 
						|
 * more or fewer objects.  
 | 
						|
 *
 | 
						|
 * Vectors try to mantain efficiency in growing by having a
 | 
						|
 * <b>capacityIncrement</b> that can be specified at instantiation.
 | 
						|
 * When a Vector can no longer hold a new Object, it grows by the amount
 | 
						|
 * in <b>capacityIncrement</b>.  
 | 
						|
 *
 | 
						|
 * Vector implements the JDK 1.2 List interface, and is therefor a fully
 | 
						|
 * compliant Collection object.
 | 
						|
 *
 | 
						|
 * @specnote The JCL claims that various methods in this class throw
 | 
						|
 * IndexOutOfBoundsException, which would be consistent with other collections
 | 
						|
 * classes. ArrayIndexOutOfBoundsException is actually thrown, per the online 
 | 
						|
 * docs, even for List method implementations.
 | 
						|
 * 
 | 
						|
 * @author Scott G. Miller
 | 
						|
 */
 | 
						|
public class Vector extends AbstractList 
 | 
						|
  implements List, Cloneable, Serializable
 | 
						|
{
 | 
						|
  /**
 | 
						|
   * The amount the Vector's internal array should be increased in size when
 | 
						|
   * a new element is added that exceeds the current size of the array,
 | 
						|
   * or when {@link #ensureCapacity} is called.
 | 
						|
   * @serial
 | 
						|
   */
 | 
						|
  protected int capacityIncrement = 0;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The number of elements currently in the vector, also returned by
 | 
						|
   * {@link #size}.
 | 
						|
   * @serial
 | 
						|
   */
 | 
						|
  protected int elementCount = 0;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The internal array used to hold members of a Vector
 | 
						|
   * @serial
 | 
						|
   */
 | 
						|
  protected Object[] elementData;
 | 
						|
 | 
						|
  private static final long serialVersionUID = -2767605614048989439L;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs an empty vector with an initial size of 10, and
 | 
						|
   * a capacity increment of 0
 | 
						|
   */
 | 
						|
  public Vector()
 | 
						|
  {
 | 
						|
    this(10);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs a vector containing the contents of Collection, in the
 | 
						|
   * order given by the collection
 | 
						|
   *
 | 
						|
   * @param c A collection of elements to be added to the newly constructed
 | 
						|
   * vector
 | 
						|
   */
 | 
						|
  public Vector(Collection c)
 | 
						|
  {
 | 
						|
    int csize = c.size();
 | 
						|
    elementData = new Object[csize];
 | 
						|
    elementCount = csize;
 | 
						|
    Iterator itr = c.iterator();
 | 
						|
    for (int i = 0; i < csize; i++)
 | 
						|
      {
 | 
						|
	elementData[i] = itr.next();
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs a Vector with the initial capacity and capacity 
 | 
						|
   * increment specified
 | 
						|
   *
 | 
						|
   * @param initialCapacity The initial size of the Vector's internal
 | 
						|
   * array
 | 
						|
   * @param capacityIncrement The amount the internal array should be
 | 
						|
   * increased if necessary
 | 
						|
   */
 | 
						|
  public Vector(int initialCapacity, int capacityIncrement)
 | 
						|
  {
 | 
						|
    if (initialCapacity < 0)
 | 
						|
      throw new IllegalArgumentException();
 | 
						|
    elementData = new Object[initialCapacity];
 | 
						|
    this.capacityIncrement = capacityIncrement;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs a Vector with the initial capacity specified
 | 
						|
   *
 | 
						|
   * @param initialCapacity The initial size of the Vector's internal array
 | 
						|
   */
 | 
						|
  public Vector(int initialCapacity)
 | 
						|
  {
 | 
						|
    if (initialCapacity < 0)
 | 
						|
      throw new IllegalArgumentException();
 | 
						|
    elementData = new Object[initialCapacity];
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Copies the contents of a provided array into the Vector.  If the 
 | 
						|
   * array is too large to fit in the Vector, an ArrayIndexOutOfBoundsException
 | 
						|
   * is thrown.  Old elements in the Vector are overwritten by the new
 | 
						|
   * elements
 | 
						|
   *
 | 
						|
   * @param anArray An array from which elements will be copied into the Vector
 | 
						|
   * 
 | 
						|
   * @throws ArrayIndexOutOfBoundsException the array being copied
 | 
						|
   * is larger than the Vectors internal data array
 | 
						|
   */
 | 
						|
  public synchronized void copyInto(Object[] anArray)
 | 
						|
  {
 | 
						|
    System.arraycopy(elementData, 0, anArray, 0, elementCount);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Trims the Vector down to size.  If the internal data array is larger
 | 
						|
   * than the number of Objects its holding, a new array is constructed
 | 
						|
   * that precisely holds the elements.  
 | 
						|
   */
 | 
						|
  public synchronized void trimToSize()
 | 
						|
  {
 | 
						|
    // Don't bother checking for the case where size() == the capacity of the
 | 
						|
    // vector since that is a much less likely case; it's more efficient to
 | 
						|
    // not do the check and lose a bit of performance in that infrequent case
 | 
						|
 | 
						|
    Object[] newArray = new Object[elementCount];
 | 
						|
    System.arraycopy(elementData, 0, newArray, 0, elementCount);
 | 
						|
    elementData = newArray;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Ensures that <b>minCapacity</b> elements can fit within this Vector.
 | 
						|
   * If it cannot hold this many elements, the internal data array is expanded
 | 
						|
   * in the following manner.  If the current size plus the capacityIncrement
 | 
						|
   * is sufficient, the internal array is expanded by capacityIncrement.  
 | 
						|
   * If capacityIncrement is non-positive, the size is doubled.  If 
 | 
						|
   * neither is sufficient, the internal array is expanded to size minCapacity
 | 
						|
   *
 | 
						|
   * @param minCapacity The minimum capacity the internal array should be
 | 
						|
   * able to handle after executing this method
 | 
						|
   */
 | 
						|
  public synchronized void ensureCapacity(int minCapacity)
 | 
						|
  {
 | 
						|
    if (elementData.length >= minCapacity)
 | 
						|
      return;
 | 
						|
 | 
						|
    int newCapacity; 
 | 
						|
    if (capacityIncrement <= 0)
 | 
						|
      newCapacity = elementData.length * 2;
 | 
						|
    else
 | 
						|
      newCapacity = elementData.length + capacityIncrement;
 | 
						|
      
 | 
						|
    Object[] newArray = new Object[Math.max(newCapacity, minCapacity)];
 | 
						|
 | 
						|
    System.arraycopy(elementData, 0, newArray, 0, elementData.length);
 | 
						|
    elementData = newArray;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Explicitly sets the size of the internal data array, copying the 
 | 
						|
   * old values to the new internal array.  If the new array is smaller
 | 
						|
   * than the old one, old values that don't fit are lost. If the new size
 | 
						|
   * is larger than the old one, the vector is padded with null entries.
 | 
						|
   *
 | 
						|
   * @param newSize The new size of the internal array
 | 
						|
   */
 | 
						|
  public synchronized void setSize(int newSize)
 | 
						|
  {
 | 
						|
    modCount++;
 | 
						|
    Object[] newArray = new Object[newSize];
 | 
						|
    System.arraycopy(elementData, 0, newArray, 0, 
 | 
						|
                     Math.min(newSize, elementCount));
 | 
						|
    elementCount = newSize;
 | 
						|
    elementData = newArray;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the size of the internal data array (not the amount of elements
 | 
						|
   * contained in the Vector)
 | 
						|
   *
 | 
						|
   * @returns capacity of the internal data array
 | 
						|
   */
 | 
						|
  public int capacity()
 | 
						|
  {
 | 
						|
    return elementData.length;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the number of elements stored in this Vector
 | 
						|
   *
 | 
						|
   * @returns the number of elements in this Vector
 | 
						|
   */
 | 
						|
  public int size()
 | 
						|
  {
 | 
						|
    return elementCount;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns true if this Vector is empty, false otherwise
 | 
						|
   *
 | 
						|
   * @returns true if the Vector is empty, false otherwise
 | 
						|
   */
 | 
						|
  public boolean isEmpty()
 | 
						|
  {
 | 
						|
    return elementCount == 0;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Searches the vector starting at <b>index</b> for object <b>elem</b>
 | 
						|
   * and returns the index of the first occurence of this Object.  If
 | 
						|
   * the object is not found, -1 is returned
 | 
						|
   *
 | 
						|
   * @param e The Object to search for
 | 
						|
   * @param index Start searching at this index
 | 
						|
   * @returns The index of the first occurence of <b>elem</b>, or -1
 | 
						|
   * if it is not found
 | 
						|
   */
 | 
						|
  public synchronized int indexOf(Object e, int index)
 | 
						|
  {
 | 
						|
    for (int i = index; i < elementCount; i++)
 | 
						|
      {
 | 
						|
	if (e == null ? elementData[i] == null : e.equals(elementData[i]))
 | 
						|
	  return i;
 | 
						|
      }
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the first occurence of <b>elem</b> in the Vector, or -1 if
 | 
						|
   * <b>elem</b> is not found.
 | 
						|
   *
 | 
						|
   * @param elem The object to search for
 | 
						|
   * @returns The index of the first occurence of <b>elem</b> or -1 if 
 | 
						|
   * not found
 | 
						|
   */
 | 
						|
  public int indexOf(Object elem)
 | 
						|
  {
 | 
						|
    return indexOf(elem, 0);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns true if <b>elem</b> is contained in this Vector, false otherwise.
 | 
						|
   *
 | 
						|
   * @param elem The element to check
 | 
						|
   * @returns true if the object is contained in this Vector, false otherwise
 | 
						|
   */
 | 
						|
  public boolean contains(Object elem)
 | 
						|
  {
 | 
						|
    return indexOf(elem, 0) != -1;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the index of the first occurence of <b>elem</b>, when searching
 | 
						|
   * backwards from <b>index</b>.  If the object does not occur in this Vector,
 | 
						|
   * -1 is returned.
 | 
						|
   *
 | 
						|
   * @param eThe object to search for
 | 
						|
   * @param index The index to start searching in reverse from
 | 
						|
   * @returns The index of the Object if found, -1 otherwise
 | 
						|
   */
 | 
						|
  public synchronized int lastIndexOf(Object e, int index)
 | 
						|
  {
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
 | 
						|
    for (int i = index; i >= 0; i--)
 | 
						|
      {
 | 
						|
	if (e == null ? elementData[i] == null : e.equals(elementData[i]))
 | 
						|
	  return i;
 | 
						|
      }
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the last index of <b>elem</b> within this Vector, or -1
 | 
						|
   * if the object is not within the Vector
 | 
						|
   *
 | 
						|
   * @param elem The object to search for
 | 
						|
   * @returns the last index of the object, or -1 if not found
 | 
						|
   */
 | 
						|
  public int lastIndexOf(Object elem)
 | 
						|
  {
 | 
						|
    return lastIndexOf(elem, elementCount - 1);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the Object stored at <b>index</b>.  If index is out of range
 | 
						|
   * an ArrayIndexOutOfBoundsException is thrown.
 | 
						|
   *
 | 
						|
   * @param index the index of the Object to retrieve
 | 
						|
   * @returns The object at <b>index</b>
 | 
						|
   * @throws ArrayIndexOutOfBoundsException <b>index</b> is
 | 
						|
   * larger than the Vector
 | 
						|
   */
 | 
						|
  public synchronized Object elementAt(int index)
 | 
						|
  {
 | 
						|
    //Within the bounds of this Vector does not necessarily mean within 
 | 
						|
    //the bounds of the internal array
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
 | 
						|
    return elementData[index];
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the first element in the Vector.  If there is no first Object 
 | 
						|
   * (The vector is empty), a NoSuchElementException is thrown.
 | 
						|
   *
 | 
						|
   * @returns The first Object in the Vector
 | 
						|
   * @throws NoSuchElementException the Vector is empty
 | 
						|
   */
 | 
						|
  public synchronized Object firstElement()
 | 
						|
  {
 | 
						|
    if (elementCount == 0)
 | 
						|
      throw new NoSuchElementException();
 | 
						|
 | 
						|
    return elementAt(0);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the last element in the Vector.  If the Vector has no last element
 | 
						|
   * (The vector is empty), a NoSuchElementException is thrown.
 | 
						|
   *
 | 
						|
   * @returns The last Object in the Vector
 | 
						|
   * @throws NoSuchElementException the Vector is empty
 | 
						|
   */
 | 
						|
  public synchronized Object lastElement()
 | 
						|
  {
 | 
						|
    if (elementCount == 0)
 | 
						|
      throw new NoSuchElementException();
 | 
						|
 | 
						|
    return elementAt(elementCount - 1);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Places <b>obj</b> at <b>index</b> within the Vector.  If <b>index</b>
 | 
						|
   * refers to an index outside the Vector, an ArrayIndexOutOfBoundsException
 | 
						|
   * is thrown.  
 | 
						|
   * 
 | 
						|
   * @param obj The object to store
 | 
						|
   * @param index The position in the Vector to store the object
 | 
						|
   * @throws ArrayIndexOutOfBoundsException the index is out of range
 | 
						|
   */
 | 
						|
  public synchronized void setElementAt(Object obj, int index)
 | 
						|
  {
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
 | 
						|
    elementData[index] = obj;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Puts <b>element</b> into the Vector at position <b>index</b> and returns
 | 
						|
   * the Object that previously occupied that position.
 | 
						|
   *
 | 
						|
   * @param index The index within the Vector to place the Object
 | 
						|
   * @param element The Object to store in the Vector
 | 
						|
   * @returns The previous object at the specified index
 | 
						|
   * @throws ArrayIndexOutOfBoundsException the index is out of range
 | 
						|
   *
 | 
						|
   */
 | 
						|
  public synchronized Object set(int index, Object element)
 | 
						|
  {
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
 | 
						|
    Object temp = elementData[index];
 | 
						|
    elementData[index] = element;
 | 
						|
    return temp;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Removes the element at <b>index</b>, and shifts all elements at
 | 
						|
   * positions greater than index to their index - 1.  
 | 
						|
   *
 | 
						|
   * @param index The index of the element to remove
 | 
						|
   */
 | 
						|
  public synchronized void removeElementAt(int index)
 | 
						|
  {
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
 | 
						|
    modCount++;
 | 
						|
    elementCount--;
 | 
						|
    if (index < elementCount)
 | 
						|
      System.arraycopy(elementData, index + 1, elementData, index,
 | 
						|
		       elementCount - index);
 | 
						|
    //Delete the last element (which has been copied back one index)
 | 
						|
    //so it can be garbage collected;
 | 
						|
    elementData[elementCount] = null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Inserts a new element into the Vector at <b>index</b>.  Any elements
 | 
						|
   * at or greater than index are shifted up one position.
 | 
						|
   *
 | 
						|
   * @param obj The object to insert
 | 
						|
   * @param index The index at which the object is inserted
 | 
						|
   */
 | 
						|
  public void insertElementAt(Object obj, int index)
 | 
						|
  {
 | 
						|
    if (index > elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount);
 | 
						|
 | 
						|
    if (elementCount == elementData.length)
 | 
						|
      ensureCapacity(elementCount + 1);
 | 
						|
    ++modCount;
 | 
						|
    ++elementCount;
 | 
						|
    System.arraycopy(elementData, index, elementData, index + 1,
 | 
						|
		     elementCount - 1 - index);
 | 
						|
    elementData[index] = obj;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Adds an element to the Vector at the end of the Vector.  If the vector
 | 
						|
   * cannot hold the element with its present capacity, its size is increased
 | 
						|
   * based on the same rules followed if ensureCapacity was called with the
 | 
						|
   * argument currentSize+1.
 | 
						|
   *
 | 
						|
   * @param obj The object to add to the Vector
 | 
						|
   */
 | 
						|
  public synchronized void addElement(Object obj)
 | 
						|
  {
 | 
						|
    if (elementCount == elementData.length)
 | 
						|
      ensureCapacity(elementCount + 1);
 | 
						|
    modCount++;
 | 
						|
    elementData[elementCount++] = obj;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Removes the first occurence of the given object from the Vector.
 | 
						|
   * If such a remove was performed (the object was found), true is returned.
 | 
						|
   * If there was no such object, false is returned.
 | 
						|
   *
 | 
						|
   * @param obj The object to remove from the Vector
 | 
						|
   * @returns true if the Object was in the Vector, false otherwise
 | 
						|
   */
 | 
						|
  public synchronized boolean removeElement(Object obj)
 | 
						|
  {
 | 
						|
    int idx = indexOf(obj);
 | 
						|
    if (idx != -1)
 | 
						|
      {
 | 
						|
	removeElementAt(idx);
 | 
						|
	return true;
 | 
						|
      }
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Removes all elements from the Vector.  Note that this does not
 | 
						|
   * resize the internal data array.
 | 
						|
   */
 | 
						|
  public synchronized void removeAllElements()
 | 
						|
  {
 | 
						|
    modCount++;
 | 
						|
    if (elementCount == 0)
 | 
						|
      return;
 | 
						|
 | 
						|
    for (int i = elementCount - 1; i >= 0; --i)
 | 
						|
      {
 | 
						|
	elementData[i] = null;
 | 
						|
      }
 | 
						|
    elementCount = 0;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a new Vector with the same contents as this one.
 | 
						|
   */
 | 
						|
  public synchronized Object clone()
 | 
						|
  {
 | 
						|
    try
 | 
						|
      {
 | 
						|
	Vector clone = (Vector) super.clone();
 | 
						|
	clone.elementData = (Object[]) elementData.clone();
 | 
						|
	return clone;
 | 
						|
      }
 | 
						|
    catch (CloneNotSupportedException ex)
 | 
						|
      {
 | 
						|
	throw new InternalError(ex.toString());
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns an Object array with the contents of this Vector, in the order
 | 
						|
   * they are stored within this Vector.  Note that the Object array returned 
 | 
						|
   * is not the internal data array, and that it holds only the elements 
 | 
						|
   * within the Vector.  This is similar to creating a new Object[] with the 
 | 
						|
   * size of this Vector, then calling Vector.copyInto(yourArray).
 | 
						|
   *
 | 
						|
   * @returns An Object[] containing the contents of this Vector in order
 | 
						|
   *
 | 
						|
   */
 | 
						|
  public synchronized Object[] toArray()
 | 
						|
  {
 | 
						|
    Object[] newArray = new Object[elementCount];
 | 
						|
    copyInto(newArray);
 | 
						|
    return newArray;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns an array containing the contents of this Vector.  
 | 
						|
   * If the provided array is large enough, the contents are copied
 | 
						|
   * into that array, and a null is placed in the position size(). 
 | 
						|
   * In this manner, you can obtain the size of a Vector by the position
 | 
						|
   * of the null element.  If the type of the provided array cannot 
 | 
						|
   * hold the elements, an ArrayStoreException is thrown.
 | 
						|
   * 
 | 
						|
   * If the provided array is not large enough,
 | 
						|
   * a new one is created with the contents of the Vector, and no null 
 | 
						|
   * element.  The new array is of the same runtime type as the provided
 | 
						|
   * array.
 | 
						|
   *
 | 
						|
   *
 | 
						|
   * @param array An array to copy the Vector into if large enough
 | 
						|
   * @returns An array with the contents of this Vector in order
 | 
						|
   * @throws ArrayStoreException the runtime type of the provided array
 | 
						|
   * cannot hold the elements of the Vector
 | 
						|
   */
 | 
						|
  public synchronized Object[] toArray(Object[] array)
 | 
						|
  {
 | 
						|
    if (array.length < elementCount)
 | 
						|
      array = (Object[]) Array.newInstance(array.getClass().getComponentType(), 
 | 
						|
        				   elementCount);
 | 
						|
    else if (array.length > elementCount)
 | 
						|
      array[elementCount] = null;
 | 
						|
    System.arraycopy(elementData, 0, array, 0, elementCount);
 | 
						|
    return array;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the element at position <b>index</b>
 | 
						|
   *
 | 
						|
   * @param index the position from which an element will be retrieved
 | 
						|
   * @throws ArrayIndexOutOfBoundsException the index is not within the 
 | 
						|
   * range of the Vector
 | 
						|
   */
 | 
						|
  public synchronized Object get(int index)
 | 
						|
  {
 | 
						|
    return elementAt(index);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Removes the given Object from the Vector.  If it exists, true
 | 
						|
   * is returned, if not, false is returned.
 | 
						|
   *
 | 
						|
   * @param o The object to remove from the Vector
 | 
						|
   * @returns true if the Object existed in the Vector, false otherwise
 | 
						|
   */
 | 
						|
  public boolean remove(Object o)
 | 
						|
  {
 | 
						|
    return removeElement(o);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Adds an object to the Vector.
 | 
						|
   *
 | 
						|
   * @param o The element to add to the Vector
 | 
						|
   */
 | 
						|
  public synchronized boolean add(Object o)
 | 
						|
  {
 | 
						|
    addElement(o);
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Adds an object at the specified index.  Elements at or above
 | 
						|
   * index are shifted up one position.
 | 
						|
   *
 | 
						|
   * @param index The index at which to add the element
 | 
						|
   * @param element The element to add to the Vector
 | 
						|
   */
 | 
						|
  public void add(int index, Object element)
 | 
						|
  {
 | 
						|
    insertElementAt(element, index);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Removes the element at the specified index, and returns it.
 | 
						|
   *
 | 
						|
   * @param index The position from which to remove the element
 | 
						|
   * @returns The object removed
 | 
						|
   * @throws ArrayIndexOutOfBoundsException the index was out of the range
 | 
						|
   * of the Vector
 | 
						|
   */
 | 
						|
  public synchronized Object remove(int index)
 | 
						|
  {
 | 
						|
    if (index >= elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
 | 
						|
  
 | 
						|
    Object temp = elementData[index];
 | 
						|
    removeElementAt(index);
 | 
						|
    return temp;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Clears all elements in the Vector and sets its size to 0
 | 
						|
   */
 | 
						|
  public void clear()
 | 
						|
  {
 | 
						|
    removeAllElements();
 | 
						|
  }
 | 
						|
 | 
						|
  public synchronized boolean containsAll(Collection c)
 | 
						|
  {
 | 
						|
    Iterator itr = c.iterator();
 | 
						|
    int size = c.size();
 | 
						|
    for (int pos = 0; pos < size; pos++)
 | 
						|
      {
 | 
						|
	if (!contains(itr.next()))
 | 
						|
	  return false;
 | 
						|
      }
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  public synchronized boolean addAll(Collection c)
 | 
						|
  {
 | 
						|
    return addAll(elementCount, c);
 | 
						|
  }
 | 
						|
  
 | 
						|
  public synchronized boolean removeAll(Collection c)
 | 
						|
  {
 | 
						|
    return super.removeAll(c);
 | 
						|
  }
 | 
						|
  
 | 
						|
  public synchronized boolean retainAll(Collection c)
 | 
						|
  {
 | 
						|
    return super.retainAll(c);
 | 
						|
  }
 | 
						|
 | 
						|
  public synchronized boolean addAll(int index, Collection c)
 | 
						|
  {
 | 
						|
    if (index < 0 || index > elementCount)
 | 
						|
      throw new ArrayIndexOutOfBoundsException(index);
 | 
						|
    modCount++;
 | 
						|
    Iterator itr = c.iterator();
 | 
						|
    int csize = c.size();
 | 
						|
 | 
						|
    ensureCapacity(elementCount + csize);
 | 
						|
    int end = index + csize;
 | 
						|
    if (elementCount > 0 && index != elementCount)
 | 
						|
      System.arraycopy(elementData, index, elementData, end, csize);
 | 
						|
    elementCount += csize;
 | 
						|
    for (; index < end; index++)
 | 
						|
      {
 | 
						|
        elementData[index] = itr.next();
 | 
						|
      }
 | 
						|
    return (csize > 0);  
 | 
						|
  }
 | 
						|
 | 
						|
  public synchronized boolean equals(Object c)
 | 
						|
  {
 | 
						|
    return super.equals(c);
 | 
						|
  }
 | 
						|
 | 
						|
  public synchronized int hashCode()
 | 
						|
  {
 | 
						|
    return super.hashCode();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns a string representation of this Vector in the form 
 | 
						|
   * [element0, element1, ... elementN]
 | 
						|
   *
 | 
						|
   * @returns the String representation of this Vector
 | 
						|
   */
 | 
						|
  public synchronized String toString()
 | 
						|
  {
 | 
						|
    String r = "[";
 | 
						|
    for (int i = 0; i < elementCount; i++)
 | 
						|
      {
 | 
						|
	r += elementData[i];
 | 
						|
	if (i < elementCount - 1)
 | 
						|
	  r += ", ";
 | 
						|
      }
 | 
						|
    r += "]";
 | 
						|
    return r;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns an Enumeration of the elements of this List.
 | 
						|
   * The Enumeration returned is compatible behavior-wise with
 | 
						|
   * the 1.1 elements() method, in that it does not check for
 | 
						|
   * concurrent modification.
 | 
						|
   *
 | 
						|
   * @returns an Enumeration
 | 
						|
   */
 | 
						|
  public synchronized Enumeration elements()
 | 
						|
  {
 | 
						|
    return new Enumeration()
 | 
						|
    {
 | 
						|
      int i = 0;
 | 
						|
      public boolean hasMoreElements()
 | 
						|
      {
 | 
						|
	return (i < elementCount);
 | 
						|
      }
 | 
						|
      public Object nextElement()
 | 
						|
      {
 | 
						|
	if (i >= elementCount)
 | 
						|
	  throw new NoSuchElementException();
 | 
						|
	return (elementAt(i++));
 | 
						|
      }
 | 
						|
    };
 | 
						|
  }
 | 
						|
  
 | 
						|
  public List subList(int fromIndex, int toIndex)
 | 
						|
  {
 | 
						|
    List sub = super.subList(fromIndex, toIndex);
 | 
						|
    return Collections.synchronizedList(sub);
 | 
						|
  }
 | 
						|
  
 | 
						|
  /** @specnote This is not specified as synchronized in the JCL, but it seems
 | 
						|
    * to me that is should be. If it isn't, a clear() operation on a sublist
 | 
						|
    * will not be synchronized w.r.t. the Vector object.
 | 
						|
    */
 | 
						|
  protected synchronized void removeRange(int fromIndex, int toIndex)
 | 
						|
  {
 | 
						|
    modCount++;
 | 
						|
    if (fromIndex != toIndex)
 | 
						|
      {
 | 
						|
	System.arraycopy(elementData, toIndex, elementData, fromIndex, 
 | 
						|
	                 elementCount - toIndex);
 | 
						|
	// Clear unused elements so objects can be collected.
 | 
						|
	int save = elementCount;
 | 
						|
	elementCount -= (toIndex - fromIndex);
 | 
						|
	for (int i = elementCount; i < save; ++i)
 | 
						|
	  elementData[i] = null;
 | 
						|
      }
 | 
						|
  }
 | 
						|
}
 |