diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
commit | ee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch) | |
tree | d96801a16fdf03a5682ef98730fe333a46eef944 /libjava/java/util/Vector.java | |
parent | 140fa895c6b859f827fc4437b91775a82cd105fb (diff) | |
download | gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.zip gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.gz gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.bz2 |
Initial revision
From-SVN: r26263
Diffstat (limited to 'libjava/java/util/Vector.java')
-rw-r--r-- | libjava/java/util/Vector.java | 450 |
1 files changed, 450 insertions, 0 deletions
diff --git a/libjava/java/util/Vector.java b/libjava/java/util/Vector.java new file mode 100644 index 0000000..aaa9ea2 --- /dev/null +++ b/libjava/java/util/Vector.java @@ -0,0 +1,450 @@ +/* Copyright (C) 1998, 1999 Cygnus Solutions + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package java.util; + +import java.io.Serializable; + +/** + * @author Warren Levy <warrenl@cygnus.com> + * @date August 17, 1998. + */ +/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 + * "The Java Language Specification", ISBN 0-201-63451-1 + * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. + * Status: Believed complete and correct + */ + +class VectorEnumeration implements Enumeration +{ + private int enumIndex; + private Vector enumVec; + + public VectorEnumeration(Vector vec) + { + enumVec = vec; + enumIndex = 0; + } + + public boolean hasMoreElements() + { + return enumIndex < enumVec.size(); + } + + public Object nextElement() + { + if (!hasMoreElements()) + throw new NoSuchElementException(); + + return enumVec.elementData[enumIndex++]; + } +} + +// TODO12: +// public class Vector extends AbstractList +// implements List, Cloneable, Serializable + +public class Vector implements Cloneable, Serializable +{ + /* The size of the increment to use when growing this vector. + The default of 0 means to double the capacity when growing. */ + protected int capacityIncrement; + + /* The number of elements currently in elementData */ + protected int elementCount; + + /* The buffer in which elements of this vector are stored */ + protected Object[] elementData; + + public Vector() + { + this(10, 0); + } + + public Vector(int initCap) + { + this(initCap, 0); + } + + public Vector(int initCap, int capIncrement) + { + if (initCap < 0) + throw new IllegalArgumentException (); + elementData = new Object[initCap]; + capacityIncrement = capIncrement; + elementCount = 0; + } + + public final synchronized void addElement(Object obj) + { + // Make sure there's room for a new element + if (elementCount == elementData.length) + ensureCapacity(elementCount+1); + + elementData[elementCount++] = obj; + } + + public final int capacity() + { + return elementData.length; + } + + public synchronized Object clone() + { + // New vector needs to have same size, capacity and capacityIncrement + Vector newVec = new Vector(elementData.length, capacityIncrement); + + System.arraycopy(elementData, 0, newVec.elementData, 0, elementCount); + newVec.elementCount = elementCount; + return newVec; + } + + public final boolean contains(Object obj) + { + for (int i = 0; i < elementCount; i++) + { + if (obj == null + ? elementData[i] == null + : obj.equals(elementData[i])) + return true; + } + + return false; + } + + public final synchronized void copyInto(Object[] objArray) + { + System.arraycopy(elementData, 0, objArray, 0, elementCount); + } + + public final synchronized Object elementAt(int idx) + { + if (idx < 0 || idx >= size()) + throw new ArrayIndexOutOfBoundsException(); + + return elementData[idx]; + } + + public final synchronized Enumeration elements() + { + return new VectorEnumeration(this); + } + + public final synchronized void ensureCapacity(int minCap) + { + // Increasing the vector could make it much larger than minCap; + // e.g. if minCap is just larger than the vector, size may double. + // If someone cares about this possibility they should set capacityIncrement + if (minCap > elementData.length) + { + // Increase the vector; double it if capacityIncrement is zero + int newSize = elementData.length; + newSize += + (capacityIncrement > 0) ? capacityIncrement : elementData.length; + + // Make sure newSize is at least minCap + if (newSize < minCap) + newSize = minCap; + + Object[] newArray = new Object[newSize]; + System.arraycopy(elementData, 0, newArray, 0, elementCount); + elementData = newArray; + } + } + + public final synchronized Object firstElement() + { + if (elementCount == 0) + throw new NoSuchElementException(); + + return elementData[0]; + } + + public final int indexOf(Object obj) + { + return indexOf(obj, 0); + } + + public final synchronized int indexOf(Object obj, int idx) + { + if (idx < 0) + throw new IllegalArgumentException (); + for (int i = idx; i < elementCount; i++) + { + if (obj == null + ? elementData[i] == null + : obj.equals(elementData[i])) + return i; + } + + return -1; + } + + public final synchronized void insertElementAt(Object obj, int idx) + { + if (idx < 0 || idx > size()) + throw new ArrayIndexOutOfBoundsException(); + else if (idx == size()) // Spec says just use addElement() + addElement(obj); + else + { + // Make sure there's room for a new element + if (elementCount == elementData.length) + ensureCapacity(elementCount+1); + + // Shift the existing elements up and increment elementCount + for (int i = elementCount++; i > idx; --i) + elementData[i] = elementData[i-1]; + + elementData[idx] = obj; + } + } + + public final boolean isEmpty() + { + return elementCount == 0; + } + + public final synchronized Object lastElement() + { + if (elementCount == 0) + throw new NoSuchElementException(); + + return elementData[elementCount - 1]; + } + + public final int lastIndexOf(Object obj) + { + return lastIndexOf(obj, size()-1); + } + + public final synchronized int lastIndexOf(Object obj, int idx) + { + if (idx < 0) + throw new IllegalArgumentException (); + for (int i = idx; i >= 0; --i) + { + if (obj == null + ? elementData[i] == null + : obj.equals(elementData[i])) + return i; + } + + return -1; + } + + public final synchronized void removeAllElements() + { + // Remove elements now to assist the gc in early cleanup + for (int i = elementCount-1; i >= 0; --i) + elementData[i] = null; + elementCount = 0; + } + + public final synchronized boolean removeElement(Object obj) + { + for (int i = 0; i < elementCount; i++) + { + if (obj == null + ? elementData[i] == null + : obj.equals(elementData[i])) + { + int j; + + // Decrement count first to ensure we don't walk off end of array + --elementCount; + + for (j = i; j < elementCount; j++) + elementData[j] = elementData[j+1]; + + // At this point, j was incrememented and points to old last element + // Remove element now to assist the gc in early cleanup + elementData[j] = null; + return true; + } + } + + return false; + } + + public final synchronized void removeElementAt(int idx) + { + int i; + + if (idx < 0 || idx >= size()) + throw new ArrayIndexOutOfBoundsException(); + + // Decrement count first to ensure we don't walk off the end of the array + --elementCount; + + for (i = idx; i < elementCount; i++) + elementData[i] = elementData[i+1]; + + // At this point, i was incrememented and now points to the old last element + // Remove element now to assist the gc in early cleanup + elementData[i] = null; + } + + public final synchronized void setElementAt(Object obj, int idx) + { + if (idx < 0 || idx >= size()) + throw new ArrayIndexOutOfBoundsException(); + + elementData[idx] = obj; + } + + public final synchronized void setSize(int newSize) + { + if (newSize < 0) + throw new ArrayIndexOutOfBoundsException(); + + // Java Lang Spec p. 658 says to remove the excess elements and discard + // when new size is smaller than old size. + // When truncating, we could alternatively just reset elementCount instead + // of freeing up the memory if the spec hadn't specified. The spec makes + // sense though; if someone cares enough to call a setSize() function + // they probably are doing so to free memory. + if (newSize < elementCount) + { + elementCount = newSize; + trimToSize(); + } + else if (newSize > elementCount) // Skip == case + { + // TBD: ensureCapacity() may create a vector much larger than newSize; + // do we want to make the vector exactly newSize? Spec is unclear. + ensureCapacity(newSize); + + // Make sure to null out new elements of grown vector + for (int i = elementCount; i < newSize; i++) + elementData[i] = null; + elementCount = newSize; + } + } + + public final int size() + { + return elementCount; + } + + public final synchronized String toString() + { + // Following the Java Lang Spec p. 656 + + // Prepend first element with open bracket + StringBuffer result = new StringBuffer("["); + + if (elementCount > 0) // add first element if one exists + result.append(elementData[0].toString()); + + // Prepend subsequent elements with ", " + for (int i = 1; i < elementCount; i++) + result.append(", ").append(elementData[i].toString()); + + // Append last element with closing bracket + result.append("]"); + return result.toString(); + } + + public final synchronized void trimToSize() + { + // Give up excess storage capacity to save memory + // + // 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; + } + + // TODO12: + // public Vector(Collection c) + // { + // } + + // TODO12: + // public public boolean add(Object o) + // { + // } + + // TODO12: + // public void add(int index, Object element) + // { + // } + + // TODO12: + // public boolean addAll(Collection c) + // { + // } + + // TODO12: + // public boolean addAll(int index, Collection c) + // { + // } + + // TODO12: + // public void clear() + // { + // } + + // TODO12: + // public boolean containsAll(Collection c) + // { + // } + + // TODO12: + // public boolean equals(Object o) + // { + // } + + // TODO12: + // public int hashCode() + // { + // } + + // TODO12: + // public Object get(int index) + // { + // } + + // TODO12: + // public boolean remove(Object o) + // { + // } + + // TODO12: + // public Object remove(int index) + // { + // } + + // TODO12: + // public boolean removeAll(Collection c) + // { + // } + + // TODO12: + // public boolean retainAll(Collection c) + // { + // } + + // TODO12: + // public Object set(int index, Object element) + // { + // } + + // TODO12: + // public Object[] toArray() + // { + // } + + // TODO12: + // public Object[] toArray(Object[] a) + // { + // } +} |