diff --git a/src/java/org/apache/commons/collections/FastArrayList.java b/src/java/org/apache/commons/collections/FastArrayList.java
new file mode 100644
index 000000000..82ed2abc6
--- /dev/null
+++ b/src/java/org/apache/commons/collections/FastArrayList.java
@@ -0,0 +1,749 @@
+/*
+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastArrayList.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $
+ * $Revision: 1.1 $
+ * $Date: 2001/04/16 22:42:04 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *
A customized implementation of java.util.ArrayList
designed
+ * to operate in a multithreaded environment where the large majority of
+ * method calls are read-only, instead of structural changes. When operating
+ * in "fast" mode, read calls are non-synchronized and write calls perform the
+ * following steps:
When first created, objects of this class default to "slow" mode, where
+ * all accesses of any type are synchronized but no cloning takes place. This
+ * is appropriate for initially populating the collection, followed by a switch
+ * to "fast" mode (by calling setFast(true)
) after initialization
+ * is complete.
NOTE: If you are creating and accessing an
+ * ArrayList
only within a single thread, you should use
+ * java.util.ArrayList
directly (with no synchronization), for
+ * maximum performance.
NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().
+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastArrayList implements List, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty list. + */ + public FastArrayList() { + + super(); + this.list = new ArrayList(); + + } + + + /** + * Construct an empty list with the specified capacity. + * + * @param capacity The initial capacity of the empty list + */ + public FastArrayList(int capacity) { + + super(); + this.list = new ArrayList(capacity); + + } + + + /** + * Construct a list containing the elements of the specified collection, + * in the order they are returned by the collection's iterator. + * + * @param collection The collection whose elements initialize the contents + * of this list + */ + public FastArrayList(Collection collection) { + + super(); + this.list = new ArrayList(collection); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying list we are managing. + */ + protected ArrayList list = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Appends the specified element to the end of this list. + * + * @param element The element to be appended + */ + public boolean add(Object element) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.add(element); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.add(element)); + } + } + + } + + + /** + * Insert the specified element at the specified position in this list, + * and shift all remaining elements up one position. + * + * @param index Index at which to insert this element + * @param element The element to be inserted + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public void add(int index, Object element) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + temp.add(index, element); + list = temp; + } + } else { + synchronized (list) { + list.add(index, element); + } + } + + } + + + /** + * Append all of the elements in the specified Collection to the end + * of this list, in the order that they are returned by the specified + * Collection's Iterator. + * + * @param collection The collection to be appended + */ + public boolean addAll(Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.addAll(collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.addAll(collection)); + } + } + + } + + + /** + * Insert all of the elements in the specified Collection at the specified + * position in this list, and shift any previous elements upwards as + * needed. + * + * @param index Index at which insertion takes place + * @param collection The collection to be added + * + * @exception IndexOutOfBoundsException if the index is out of range + */ + public boolean addAll(int index, Collection collection) { + + if (fast) { + synchronized (this) { + ArrayList temp = (ArrayList) list.clone(); + boolean result = temp.addAll(index, collection); + list = temp; + return (result); + } + } else { + synchronized (list) { + return (list.addAll(index, collection)); + } + } + + } + + + /** + * Remove all of the elements from this list. The list will be empty + * after this call returns. + * + * @exception UnsupportedOperationException ifclear()
+ * is not supported by this list
+ */
+ public void clear() {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ temp.clear();
+ list = temp;
+ }
+ } else {
+ synchronized (list) {
+ list.clear();
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this list contains the specified element.
+ *
+ * @param element The element to test for
+ */
+ public boolean contains(Object element) {
+
+ if (fast) {
+ return (list.contains(element));
+ } else {
+ synchronized (list) {
+ return (list.contains(element));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this list contains all of the elements
+ * in the specified Collection.
+ *
+ * @param collection Collection whose elements are to be checked
+ */
+ public boolean containsAll(Collection collection) {
+
+ if (fast) {
+ return (list.containsAll(collection));
+ } else {
+ synchronized (list) {
+ return (list.containsAll(collection));
+ }
+ }
+
+ }
+
+
+ /**
+ * Increase the capacity of this ArrayList
instance, if
+ * necessary, to ensure that it can hold at least the number of elements
+ * specified by the minimum capacity argument.
+ *
+ * @param capacity The new minimum capacity
+ */
+ public void ensureCapacity(int capacity) {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ temp.ensureCapacity(capacity);
+ list = temp;
+ }
+ } else {
+ synchronized (list) {
+ list.ensureCapacity(capacity);
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the element at the specified position in the list.
+ *
+ * @param index The index of the element to return
+ *
+ * @exception IndexOutOfBoundsException if the index is out of range
+ */
+ public Object get(int index) {
+
+ if (fast) {
+ return (list.get(index));
+ } else {
+ synchronized (list) {
+ return (list.get(index));
+ }
+ }
+
+ }
+
+
+ /**
+ * Search for the first occurrence of the given argument, testing
+ * for equality using the equals()
method, and return
+ * the corresponding index, or -1 if the object is not found.
+ *
+ * @param element The element to search for
+ */
+ public int indexOf(Object element) {
+
+ if (fast) {
+ return (list.indexOf(element));
+ } else {
+ synchronized (list) {
+ return (list.indexOf(element));
+ }
+ }
+
+ }
+
+
+ /**
+ * Test if this list has no elements.
+ */
+ public boolean isEmpty() {
+
+ if (fast) {
+ return (list.isEmpty());
+ } else {
+ synchronized (list) {
+ return (list.isEmpty());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return an iterator over the elements in this list in proper sequence.
+ * equals()
method, and return
+ * the corresponding index, or -1 if the object is not found.
+ *
+ * @param element The element to search for
+ */
+ public int lastIndexOf(Object element) {
+
+ if (fast) {
+ return (list.lastIndexOf(element));
+ } else {
+ synchronized (list) {
+ return (list.lastIndexOf(element));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return an iterator of the elements of this list, in proper sequence.
+ * See the implementation note on iterator()
.
+ */
+ public ListIterator listIterator() {
+
+ if (fast) {
+ return (list.listIterator());
+ } else {
+ synchronized (list) {
+ return (list.listIterator());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return an iterator of the elements of this list, in proper sequence,
+ * starting at the specified position.
+ * See the implementation note on iterator()
.
+ *
+ * @param index The starting position of the iterator to return
+ *
+ * @exception IndexOutOfBoundsException if the index is out of range
+ */
+ public ListIterator listIterator(int index) {
+
+ if (fast) {
+ return (list.listIterator(index));
+ } else {
+ synchronized (list) {
+ return (list.listIterator(index));
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove the element at the specified position in the list, and shift
+ * any subsequent elements down one position.
+ *
+ * @param index Index of the element to be removed
+ *
+ * @exception IndexOutOfBoundsException if the index is out of range
+ */
+ public Object remove(int index) {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ Object result = temp.remove(index);
+ list = temp;
+ return (result);
+ }
+ } else {
+ synchronized (list) {
+ return (list.remove(index));
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove the first occurrence of the specified element from the list,
+ * and shift any subsequent elements down one position.
+ *
+ * @param element Element to be removed
+ */
+ public boolean remove(Object element) {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ boolean result = temp.remove(element);
+ list = temp;
+ return (result);
+ }
+ } else {
+ synchronized (list) {
+ return (list.remove(element));
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove from this collection all of its elements that are contained
+ * in the specified collection.
+ *
+ * @param collection Collection containing elements to be removed
+ *
+ * @exception UnsupportedOperationException if this optional operation
+ * is not supported by this list
+ */
+ public boolean removeAll(Collection collection) {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ boolean result = temp.removeAll(collection);
+ list = temp;
+ return (result);
+ }
+ } else {
+ synchronized (list) {
+ return (list.removeAll(collection));
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove from this collection all of its elements except those that are
+ * contained in the specified collection.
+ *
+ * @param collection Collection containing elements to be retained
+ *
+ * @exception UnsupportedOperationException if this optional operation
+ * is not supported by this list
+ */
+ public boolean retainAll(Collection collection) {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ boolean result = temp.retainAll(collection);
+ list = temp;
+ return (result);
+ }
+ } else {
+ synchronized (list) {
+ return (list.retainAll(collection));
+ }
+ }
+
+ }
+
+
+ /**
+ * Replace the element at the specified position in this list with
+ * the specified element. Returns the previous object at that position.
+ * array
+ * is not a supertype of the runtime type of every element in this list
+ */
+ public Object[] toArray(Object array[]) {
+
+ if (fast) {
+ return (list.toArray(array));
+ } else {
+ synchronized (list) {
+ return (list.toArray(array));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a String representation of this object.
+ */
+ public String toString() {
+
+ StringBuffer sb = new StringBuffer("FastArrayList[");
+ sb.append(list.toString());
+ sb.append("]");
+ return (sb.toString());
+
+ }
+
+
+ /**
+ * Trim the capacity of this ArrayList
instance to be the
+ * list's current size. An application can use this operation to minimize
+ * the storage of an ArrayList
instance.
+ */
+ public void trimToSize() {
+
+ if (fast) {
+ synchronized (this) {
+ ArrayList temp = (ArrayList) list.clone();
+ temp.trimToSize();
+ list = temp;
+ }
+ } else {
+ synchronized (list) {
+ list.trimToSize();
+ }
+ }
+
+ }
+
+
+}
diff --git a/src/java/org/apache/commons/collections/FastHashMap.java b/src/java/org/apache/commons/collections/FastHashMap.java
new file mode 100644
index 000000000..222051e33
--- /dev/null
+++ b/src/java/org/apache/commons/collections/FastHashMap.java
@@ -0,0 +1,422 @@
+/*
+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastHashMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $
+ * $Revision: 1.1 $
+ * $Date: 2001/04/16 22:42:04 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * A customized implementation of java.util.HashMap
designed
+ * to operate in a multithreaded environment where the large majority of
+ * method calls are read-only, instead of structural changes. When operating
+ * in "fast" mode, read calls are non-synchronized and write calls perform the
+ * following steps:
When first created, objects of this class default to "slow" mode, where
+ * all accesses of any type are synchronized but no cloning takes place. This
+ * is appropriate for initially populating the collection, followed by a switch
+ * to "fast" mode (by calling setFast(true)
) after initialization
+ * is complete.
NOTE: If you are creating and accessing a
+ * HashMap
only within a single thread, you should use
+ * java.util.HashMap
directly (with no synchronization), for
+ * maximum performance.
NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().
+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastHashMap implements Map, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty map. + */ + public FastHashMap() { + + super(); + this.map = new HashMap(); + + } + + + /** + * Construct an empty map with the specified capacity. + * + * @param capacity The initial capacity of the empty map + */ + public FastHashMap(int capacity) { + + super(); + this.map = new HashMap(capacity); + + } + + + /** + * Construct an empty map with the specified capacity and load factor. + * + * @param capacity The initial capacity of the empty map + * @param factor The load factor of the new map + */ + public FastHashMap(int capacity, float factor) { + + super(); + this.map = new HashMap(capacity, factor); + + } + + + /** + * Construct a new map with the same mappings as the specified map. + * + * @param map The map whose mappings are to be copied + */ + public FastHashMap(Map map) { + + super(); + this.map = new HashMap(map); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying map we are managing. + */ + protected HashMap map = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Remove all mappings from this map. + */ + public void clear() { + + if (fast) { + synchronized (this) { + HashMap temp = (HashMap) map.clone(); + temp.clear(); + map = temp; + } + } else { + synchronized (map) { + map.clear(); + } + } + + } + + + /** + * Returntrue
if this map contains a mapping for the
+ * specified key.
+ *
+ * @param key Key to be searched for
+ */
+ public boolean containsKey(Object key) {
+
+ if (fast) {
+ return (map.containsKey(key));
+ } else {
+ synchronized (map) {
+ return (map.containsKey(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this map contains one or more keys mapping
+ * to the specified value.
+ *
+ * @param value Value to be searched for
+ */
+ public boolean containsValue(Object value) {
+
+ if (fast) {
+ return (map.containsValue(value));
+ } else {
+ synchronized (map) {
+ return (map.containsValue(value));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a collection view of the mappings contained in this map. Each
+ * element in the returned collection is a Map.Entry
.
+ */
+ public Set entrySet() {
+
+ if (fast) {
+ return (map.entrySet());
+ } else {
+ synchronized (map) {
+ return (map.entrySet());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the value to which this map maps the specified key. Returns
+ * null
if the map contains no mapping for this key, or if
+ * there is a mapping with a value of null
. Use the
+ * containsKey()
method to disambiguate these cases.
+ *
+ * @param key Key whose value is to be returned
+ */
+ public Object get(Object key) {
+
+ if (fast) {
+ return (map.get(key));
+ } else {
+ synchronized (map) {
+ return (map.get(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this map contains no mappings.
+ */
+ public boolean isEmpty() {
+
+ if (fast) {
+ return (map.isEmpty());
+ } else {
+ synchronized (map) {
+ return (map.isEmpty());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a set view of the keys contained in this map.
+ */
+ public Set keySet() {
+
+ if (fast) {
+ return (map.keySet());
+ } else {
+ synchronized (map) {
+ return (map.keySet());
+ }
+ }
+
+ }
+
+
+ /**
+ * Associate the specified value with the specified key in this map.
+ * If the map previously contained a mapping for this key, the old
+ * value is replaced and returned.
+ *
+ * @param key The key with which the value is to be associated
+ * @param value The value to be associated with this key
+ */
+ public Object put(Object key, Object value) {
+
+ if (fast) {
+ synchronized (this) {
+ HashMap temp = (HashMap) map.clone();
+ Object result = temp.put(key, value);
+ map = temp;
+ return (result);
+ }
+ } else {
+ synchronized (map) {
+ return (map.put(key, value));
+ }
+ }
+
+ }
+
+
+ /**
+ * Copy all of the mappings from the specified map to this one, replacing
+ * any mappings with the same keys.
+ *
+ * @param in Map whose mappings are to be copied
+ */
+ public void putAll(Map in) {
+
+ if (fast) {
+ synchronized (this) {
+ HashMap temp = (HashMap) map.clone();
+ temp.putAll(in);
+ map = temp;
+ }
+ } else {
+ synchronized (map) {
+ map.putAll(in);
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove any mapping for this key, and return any previously
+ * mapped value.
+ *
+ * @param key Key whose mapping is to be removed
+ */
+ public Object remove(Object key) {
+
+ if (fast) {
+ synchronized (this) {
+ HashMap temp = (HashMap) map.clone();
+ Object result = temp.remove(key);
+ map = temp;
+ return (result);
+ }
+ } else {
+ synchronized (map) {
+ return (map.remove(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the number of key-value mappings in this map.
+ */
+ public int size() {
+
+ if (fast) {
+ return (map.size());
+ } else {
+ synchronized (map) {
+ return (map.size());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a collection view of the values contained in this map.
+ */
+ public Collection values() {
+
+ if (fast) {
+ return (map.values());
+ } else {
+ synchronized (map) {
+ return (map.values());
+ }
+ }
+
+ }
+
+
+}
diff --git a/src/java/org/apache/commons/collections/FastTreeMap.java b/src/java/org/apache/commons/collections/FastTreeMap.java
new file mode 100644
index 000000000..986313989
--- /dev/null
+++ b/src/java/org/apache/commons/collections/FastTreeMap.java
@@ -0,0 +1,532 @@
+/*
+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/FastTreeMap.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $
+ * $Revision: 1.1 $
+ * $Date: 2001/04/16 22:42:04 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * A customized implementation of java.util.TreeMap
designed
+ * to operate in a multithreaded environment where the large majority of
+ * method calls are read-only, instead of structural changes. When operating
+ * in "fast" mode, read calls are non-synchronized and write calls perform the
+ * following steps:
When first created, objects of this class default to "slow" mode, where
+ * all accesses of any type are synchronized but no cloning takes place. This
+ * is appropriate for initially populating the collection, followed by a switch
+ * to "fast" mode (by calling setFast(true)
) after initialization
+ * is complete.
NOTE: If you are creating and accessing a
+ * TreeMap
only within a single thread, you should use
+ * java.util.TreeMap
directly (with no synchronization), for
+ * maximum performance.
NOTE: The following methods are NOT + * overridden: clone(), equals(Object), hashCode().
+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2001/04/16 22:42:04 $ + */ + +public class FastTreeMap implements Map, Cloneable, Serializable { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a an empty map. + */ + public FastTreeMap() { + + super(); + this.map = new TreeMap(); + + } + + + /** + * Construct an empty map with the specified comparator. + * + * @param comparator The comparator to use for ordering tree elements + */ + public FastTreeMap(Comparator comparator) { + + super(); + this.map = new TreeMap(comparator); + + } + + + /** + * Construct a new map with the same mappings as the specified map, + * sorted according to the keys's natural order + * + * @param map The map whose mappings are to be copied + */ + public FastTreeMap(Map map) { + + super(); + this.map = new TreeMap(map); + + } + + + /** + * Construct a new map with the same mappings as the specified map, + * sorted according to the same ordering + * + * @param map The map whose mappings are to be copied + */ + public FastTreeMap(SortedMap map) { + + super(); + this.map = new TreeMap(map); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The underlying map we are managing. + */ + protected TreeMap map = null; + + + // ------------------------------------------------------------- Properties + + + /** + * Are we operating in "fast" mode? + */ + protected boolean fast = false; + + public boolean getFast() { + return (this.fast); + } + + public void setFast(boolean fast) { + this.fast = fast; + } + + + // --------------------------------------------------------- Public Methods + + + /** + * Remove all mappings from this map. + */ + public void clear() { + + if (fast) { + synchronized (this) { + TreeMap temp = (TreeMap) map.clone(); + temp.clear(); + map = temp; + } + } else { + synchronized (map) { + map.clear(); + } + } + + } + + + /** + * Return the comparator used to order this map, ornull
+ * if this map uses its keys' natural order.
+ */
+ public Comparator comparator() {
+
+ if (fast) {
+ return (map.comparator());
+ } else {
+ synchronized (map) {
+ return (map.comparator());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this map contains a mapping for the
+ * specified key.
+ *
+ * @param key Key to be searched for
+ */
+ public boolean containsKey(Object key) {
+
+ if (fast) {
+ return (map.containsKey(key));
+ } else {
+ synchronized (map) {
+ return (map.containsKey(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return true
if this map contains one or more keys mapping
+ * to the specified value.
+ *
+ * @param value Value to be searched for
+ */
+ public boolean containsValue(Object value) {
+
+ if (fast) {
+ return (map.containsValue(value));
+ } else {
+ synchronized (map) {
+ return (map.containsValue(value));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a collection view of the mappings contained in this map. Each
+ * element in the returned collection is a Map.Entry
.
+ */
+ public Set entrySet() {
+
+ if (fast) {
+ return (map.entrySet());
+ } else {
+ synchronized (map) {
+ return (map.entrySet());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the first (lowest) key currently in this sorted map.
+ */
+ public Object firstKey() {
+
+ if (fast) {
+ return (map.firstKey());
+ } else {
+ synchronized (map) {
+ return (map.firstKey());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the value to which this map maps the specified key. Returns
+ * null
if the map contains no mapping for this key, or if
+ * there is a mapping with a value of null
. Use the
+ * containsKey()
method to disambiguate these cases.
+ *
+ * @param key Key whose value is to be returned
+ */
+ public Object get(Object key) {
+
+ if (fast) {
+ return (map.get(key));
+ } else {
+ synchronized (map) {
+ return (map.get(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a view of the portion of this map whose keys are strictly
+ * less than the specified key.
+ *
+ * @param key Key higher than any in the returned map
+ */
+ public SortedMap headMap(Object key) {
+
+ if (fast) {
+ return (map.headMap(key));
+ } else {
+ synchronized (map) {
+ return (map.headMap(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Test if this list has no elements.
+ */
+ public boolean isEmpty() {
+
+ if (fast) {
+ return (map.isEmpty());
+ } else {
+ synchronized (map) {
+ return (map.isEmpty());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a set view of the keys contained in this map.
+ */
+ public Set keySet() {
+
+ if (fast) {
+ return (map.keySet());
+ } else {
+ synchronized (map) {
+ return (map.keySet());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the last (highest) key currently in this sorted map.
+ */
+ public Object lastKey() {
+
+ if (fast) {
+ return (map.lastKey());
+ } else {
+ synchronized (map) {
+ return (map.lastKey());
+ }
+ }
+
+ }
+
+
+ /**
+ * Associate the specified value with the specified key in this map.
+ * If the map previously contained a mapping for this key, the old
+ * value is replaced and returned.
+ *
+ * @param key The key with which the value is to be associated
+ * @param value The value to be associated with this key
+ */
+ public Object put(Object key, Object value) {
+
+ if (fast) {
+ synchronized (this) {
+ TreeMap temp = (TreeMap) map.clone();
+ Object result = temp.put(key, value);
+ map = temp;
+ return (result);
+ }
+ } else {
+ synchronized (map) {
+ return (map.put(key, value));
+ }
+ }
+
+ }
+
+
+ /**
+ * Copy all of the mappings from the specified map to this one, replacing
+ * any mappings with the same keys.
+ *
+ * @param in Map whose mappings are to be copied
+ */
+ public void putAll(Map in) {
+
+ if (fast) {
+ synchronized (this) {
+ TreeMap temp = (TreeMap) map.clone();
+ temp.putAll(in);
+ map = temp;
+ }
+ } else {
+ synchronized (map) {
+ map.putAll(in);
+ }
+ }
+
+ }
+
+
+ /**
+ * Remove any mapping for this key, and return any previously
+ * mapped value.
+ *
+ * @param key Key whose mapping is to be removed
+ */
+ public Object remove(Object key) {
+
+ if (fast) {
+ synchronized (this) {
+ TreeMap temp = (TreeMap) map.clone();
+ Object result = temp.remove(key);
+ map = temp;
+ return (result);
+ }
+ } else {
+ synchronized (map) {
+ return (map.remove(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return the number of key-value mappings in this map.
+ */
+ public int size() {
+
+ if (fast) {
+ return (map.size());
+ } else {
+ synchronized (map) {
+ return (map.size());
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a view of the portion of this map whose keys are in the
+ * range fromKey (inclusive) to toKey (exclusive).
+ *
+ * @param fromKey Lower limit of keys for the returned map
+ * @param toKey Upper limit of keys for the returned map
+ */
+ public SortedMap subMap(Object fromKey, Object toKey) {
+
+ if (fast) {
+ return (map.subMap(fromKey, toKey));
+ } else {
+ synchronized (map) {
+ return (map.subMap(fromKey, toKey));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a view of the portion of this map whose keys are greater than
+ * or equal to the specified key.
+ *
+ * @param key Key less than or equal to any in the returned map
+ */
+ public SortedMap tailMap(Object key) {
+
+ if (fast) {
+ return (map.tailMap(key));
+ } else {
+ synchronized (map) {
+ return (map.tailMap(key));
+ }
+ }
+
+ }
+
+
+ /**
+ * Return a collection view of the values contained in this map.
+ */
+ public Collection values() {
+
+ if (fast) {
+ return (map.values());
+ } else {
+ synchronized (map) {
+ return (map.values());
+ }
+ }
+
+ }
+
+
+}
diff --git a/src/test/org/apache/commons/collections/TestAll.java b/src/test/org/apache/commons/collections/TestAll.java
index 6a6666fec..fab9e3948 100644
--- a/src/test/org/apache/commons/collections/TestAll.java
+++ b/src/test/org/apache/commons/collections/TestAll.java
@@ -1,7 +1,7 @@
/*
- * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestAll.java,v 1.2 2001/04/14 19:32:38 craigmcc Exp $
- * $Revision: 1.2 $
- * $Date: 2001/04/14 19:32:38 $
+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestAll.java,v 1.3 2001/04/16 22:42:04 jvanzyl Exp $
+ * $Revision: 1.3 $
+ * $Date: 2001/04/16 22:42:04 $
*
* ====================================================================
*
@@ -65,7 +65,7 @@ import junit.framework.*;
/**
* @author Rodney Waldhoff
- * @version $Id: TestAll.java,v 1.2 2001/04/14 19:32:38 craigmcc Exp $
+ * @version $Id: TestAll.java,v 1.3 2001/04/16 22:42:04 jvanzyl Exp $
*/
public class TestAll extends TestCase {
public TestAll(String testName) {
@@ -76,6 +76,9 @@ public class TestAll extends TestCase {
TestSuite suite = new TestSuite();
suite.addTest(TestArrayStack.suite());
suite.addTest(TestCursorableLinkedList.suite());
+ suite.addTest(TestFastArrayList.suite());
+ suite.addTest(TestFastHashMap.suite());
+ suite.addTest(TestFastTreeMap.suite());
return suite;
}
diff --git a/src/test/org/apache/commons/collections/TestFastArrayList.java b/src/test/org/apache/commons/collections/TestFastArrayList.java
new file mode 100644
index 000000000..ba9029488
--- /dev/null
+++ b/src/test/org/apache/commons/collections/TestFastArrayList.java
@@ -0,0 +1,120 @@
+/*
+ * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/TestFastArrayList.java,v 1.1 2001/04/16 22:42:04 jvanzyl Exp $
+ * $Revision: 1.1 $
+ * $Date: 2001/04/16 22:42:04 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *