commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Heuer <heue...@acm.org>
Subject Re: cvs commit: jakarta-commons/collections/src/test/org/apache/commons/collections/iterators TestUnmodifiableOrderedMapIterator.java TestUnmodifiableMapIterator.java
Date Mon, 01 Dec 2003 22:55:35 GMT

Might the name IterateableMap or IteratableMap (the proper spelling
alludes me) be more descriptive than AMap?

   michael


On 1 Dec 2003 scolebourne@apache.org wrote:

> scolebourne    2003/12/01 14:34:55
>
>   Modified:    collections/src/java/org/apache/commons/collections/map
>                         AbstractOrderedMapDecorator.java
>                         ListOrderedMap.java Flat3Map.java
>                         UnmodifiableMap.java UnmodifiableOrderedMap.java
>                collections/src/test/org/apache/commons/collections/bidimap
>                         AbstractTestSortedBidiMap.java
>                         TestDualTreeBidiMap.java TestDualHashBidiMap.java
>                         AbstractTestOrderedBidiMap.java
>                         TestTreeBidiMap.java AbstractTestBidiMap.java
>                collections/src/test/org/apache/commons/collections/map
>                         TestFlat3Map.java TestAll.java
>                         AbstractTestOrderedMap.java
>                         TestUnmodifiableMap.java
>                         TestUnmodifiableOrderedMap.java
>                collections/src/java/org/apache/commons/collections/bidimap
>                         AbstractDualBidiMap.java DualHashBidiMap.java
>                         DualTreeBidiMap.java TreeBidiMap.java
>                collections/src/test/org/apache/commons/collections/iterators
>                         TestUnmodifiableOrderedMapIterator.java
>                         TestUnmodifiableMapIterator.java
>   Added:       collections/src/java/org/apache/commons/collections/map
>                         HashedMap.java
>                collections/src/test/org/apache/commons/collections/map
>                         AbstractTestAMap.java TestHashedMap.java
>                collections/src/java/org/apache/commons/collections
>                         OrderedMap.java OrderedBidiMap.java
>                         SortedBidiMap.java BidiMap.java AMap.java
>   Removed:     collections/src/java/org/apache/commons/collections/map
>                         OrderedMap.java
>                collections/src/java/org/apache/commons/collections/bidimap
>                         OrderedBidiMap.java SortedBidiMap.java BidiMap.java
>   Log:
>   Move map interfaces to main package
>   Add AMap interface
>   Add HashedMap implementation
>
>   Revision  Changes    Path
>   1.2       +3 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java
>
>   Index: AbstractOrderedMapDecorator.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/AbstractOrderedMapDecorator.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- AbstractOrderedMapDecorator.java	20 Nov 2003 22:33:54 -0000	1.1
>   +++ AbstractOrderedMapDecorator.java	1 Dec 2003 22:34:53 -0000	1.2
>   @@ -57,6 +57,7 @@
>     */
>    package org.apache.commons.collections.map;
>
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.iterators.MapIterator;
>    import org.apache.commons.collections.iterators.OrderedMapIterator;
>
>
>
>
>   1.4       +3 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/map/ListOrderedMap.java
>
>   Index: ListOrderedMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/ListOrderedMap.java,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- ListOrderedMap.java	20 Nov 2003 21:46:41 -0000	1.3
>   +++ ListOrderedMap.java	1 Dec 2003 22:34:53 -0000	1.4
>   @@ -68,6 +68,7 @@
>    import java.util.NoSuchElementException;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
>    import org.apache.commons.collections.iterators.MapIterator;
>    import org.apache.commons.collections.iterators.OrderedMapIterator;
>
>
>
>   1.3       +4 -3      jakarta-commons/collections/src/java/org/apache/commons/collections/map/Flat3Map.java
>
>   Index: Flat3Map.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/Flat3Map.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- Flat3Map.java	18 Nov 2003 23:34:47 -0000	1.2
>   +++ Flat3Map.java	1 Dec 2003 22:34:53 -0000	1.3
>   @@ -66,6 +66,7 @@
>    import java.util.NoSuchElementException;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.AMap;
>    import org.apache.commons.collections.IteratorUtils;
>    import org.apache.commons.collections.iterators.EntrySetMapIterator;
>    import org.apache.commons.collections.iterators.MapIterator;
>   @@ -103,7 +104,7 @@
>     *
>     * @author Stephen Colebourne
>     */
>   -public class Flat3Map implements Map {
>   +public class Flat3Map implements AMap {
>
>        /** The size of the map, used while in flat mode */
>        private int iSize;
>
>
>
>   1.3       +17 -3     jakarta-commons/collections/src/java/org/apache/commons/collections/map/UnmodifiableMap.java
>
>   Index: UnmodifiableMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/UnmodifiableMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- UnmodifiableMap.java	20 Nov 2003 22:35:50 -0000	1.2
>   +++ UnmodifiableMap.java	1 Dec 2003 22:34:53 -0000	1.3
>   @@ -63,9 +63,13 @@
>    import java.util.Map;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.AMap;
>    import org.apache.commons.collections.Unmodifiable;
>    import org.apache.commons.collections.collection.UnmodifiableCollection;
>    import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
>   +import org.apache.commons.collections.iterators.EntrySetMapIterator;
>   +import org.apache.commons.collections.iterators.MapIterator;
>   +import org.apache.commons.collections.iterators.UnmodifiableMapIterator;
>    import org.apache.commons.collections.pairs.AbstractMapEntryDecorator;
>    import org.apache.commons.collections.set.UnmodifiableSet;
>
>   @@ -77,7 +81,7 @@
>     *
>     * @author Stephen Colebourne
>     */
>   -public final class UnmodifiableMap extends AbstractMapDecorator implements Unmodifiable {
>   +public final class UnmodifiableMap extends AbstractMapDecorator implements AMap, Unmodifiable {
>
>        /**
>         * Factory method to create an unmodifiable map.
>   @@ -118,6 +122,16 @@
>
>        public Object remove(Object key) {
>            throw new UnsupportedOperationException();
>   +    }
>   +
>   +    public MapIterator mapIterator() {
>   +        if (map instanceof AMap) {
>   +            MapIterator it = ((AMap) map).mapIterator();
>   +            return UnmodifiableMapIterator.decorate(it);
>   +        } else {
>   +            MapIterator it = new EntrySetMapIterator(map);
>   +            return UnmodifiableMapIterator.decorate(it);
>   +        }
>        }
>
>        public Set entrySet() {
>
>
>
>   1.2       +3 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/map/UnmodifiableOrderedMap.java
>
>   Index: UnmodifiableOrderedMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/UnmodifiableOrderedMap.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- UnmodifiableOrderedMap.java	20 Nov 2003 22:35:50 -0000	1.1
>   +++ UnmodifiableOrderedMap.java	1 Dec 2003 22:34:53 -0000	1.2
>   @@ -61,6 +61,7 @@
>    import java.util.Map;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.Unmodifiable;
>    import org.apache.commons.collections.collection.UnmodifiableCollection;
>    import org.apache.commons.collections.iterators.MapIterator;
>
>
>
>   1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/map/HashedMap.java
>
>   Index: HashedMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/map/HashedMap.java,v 1.1 2003/12/01 22:34:53 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections.map;
>
>   import java.io.IOException;
>   import java.io.ObjectInputStream;
>   import java.io.ObjectOutputStream;
>   import java.io.Serializable;
>   import java.util.AbstractCollection;
>   import java.util.AbstractSet;
>   import java.util.Collection;
>   import java.util.ConcurrentModificationException;
>   import java.util.Iterator;
>   import java.util.Map;
>   import java.util.NoSuchElementException;
>   import java.util.Set;
>
>   import org.apache.commons.collections.AMap;
>   import org.apache.commons.collections.IteratorUtils;
>   import org.apache.commons.collections.iterators.MapIterator;
>
>   /**
>    * A <code>Map</code> implementation that is a general purpose replacement
>    * for <code>HashMap</code>.
>    * <p>
>    * This implementation improves on the JDK1.4 HahMap by adding the
>    * {@link org.apache.commons.collections.iterators.MapIterator MapIterator}
>    * functionality and improving performance of <code>putAll</code>.
>    * <p>
>    * The implementation is also designed to be subclassed, with lots of useful
>    * methods exposed.
>    *
>    * @since Commons Collections 3.0
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:53 $
>    *
>    * @author java util HashMap
>    * @author Stephen Colebourne
>    */
>   public class HashedMap implements AMap, Serializable, Cloneable {
>
>       /** Serialisation version */
>       static final long serialVersionUID = -1593250834999590599L;
>       /** The default capacity to use */
>       protected static final int DEFAULT_CAPACITY = 16;
>       /** The default load factor to use */
>       protected static final float DEFAULT_LOAD_FACTOR = 0.75f;
>       /** The maximum capacity allowed */
>       protected static final int MAXIMUM_CAPACITY = 1 << 30;
>       /** An object for masking null */
>       protected static final Object NULL = new Object();
>
>       /** Load factor, normally 0.75 */
>       private final float loadFactor;
>       /** The size of the map */
>       private transient int size;
>       /** Map entries */
>       private transient HashEntry[] data;
>       /** Size at which to rehash */
>       private transient int threshold;
>       /** Modification count for iterators */
>       private transient int modCount;
>       /** Entry set */
>       private transient EntrySet entrySet;
>       /** Key set */
>       private transient KeySet keySet;
>       /** Values */
>       private transient Values values;
>
>       /**
>        * Constructs a new empty map with default size and load factor.
>        */
>       public HashedMap() {
>           super();
>           this.loadFactor = DEFAULT_LOAD_FACTOR;
>           this.threshold = calculateThreshold(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR);
>           this.data = new HashEntry[DEFAULT_CAPACITY];
>       }
>
>       /**
>        * Constructs a new, empty map with the specified initial capacity.
>        *
>        * @param initialCapacity  the initial capacity
>        * @throws IllegalArgumentException if the initial capacity is less than one
>        */
>       public HashedMap(int initialCapacity) {
>           this(initialCapacity, DEFAULT_LOAD_FACTOR);
>       }
>
>       /**
>        * Constructs a new, empty map with the specified initial capacity and
>        * load factor.
>        *
>        * @param initialCapacity  the initial capacity
>        * @param loadFactor  the load factor
>        * @throws IllegalArgumentException if the initial capacity is less than one
>        * @throws IllegalArgumentException if the load factor is less than one
>        */
>       public HashedMap(int initialCapacity, float loadFactor) {
>           super();
>           if (initialCapacity < 1) {
>               throw new IllegalArgumentException("Initial capacity must be greater than 0");
>           }
>           if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
>               throw new IllegalArgumentException("Load factor must be greater than 0");
>           }
>           this.loadFactor = loadFactor;
>           this.threshold = calculateThreshold(initialCapacity, loadFactor);
>           initialCapacity = calculateNewCapacity(initialCapacity);
>           this.data = new HashEntry[initialCapacity];
>       }
>
>       /**
>        * Constructor copying elements from another map.
>        *
>        * @param map  the map to copy
>        * @throws NullPointerException if the map is null
>        */
>       public HashedMap(Map map) {
>           this(Math.max(2 * map.size(), DEFAULT_CAPACITY), DEFAULT_LOAD_FACTOR);
>           putAll(map);
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Gets the value mapped to the key specified.
>        *
>        * @param key  the key
>        * @return the mapped value, null if no match
>        */
>       public Object get(Object key) {
>           key = convertKey(key);
>           int hashCode = hash(key);
>           HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index
>           while (entry != null) {
>               if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) {
>                   return entry.getValue();
>               }
>               entry = entry.next;
>           }
>           return null;
>       }
>
>       /**
>        * Gets the size of the map.
>        *
>        * @return the size
>        */
>       public int size() {
>           return size;
>       }
>
>       /**
>        * Checks whether the map is currently empty.
>        *
>        * @return true if the map is currently size zero
>        */
>       public boolean isEmpty() {
>           return (size == 0);
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Checks whether the map contains the specified key.
>        *
>        * @param key  the key to search for
>        * @return true if the map contains the key
>        */
>       public boolean containsKey(Object key) {
>           key = convertKey(key);
>           int hashCode = hash(key);
>           HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index
>           while (entry != null) {
>               if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) {
>                   return true;
>               }
>               entry = entry.next;
>           }
>           return false;
>       }
>
>       /**
>        * Checks whether the map contains the specified value.
>        *
>        * @param value  the value to search for
>        * @return true if the map contains the value
>        */
>       public boolean containsValue(Object value) {
>           if (value == null) {
>               for (int i = 0, isize = data.length; i < isize; i++) {
>                   HashEntry entry = data[i];
>                   while (entry != null) {
>                       if (entry.getValue() == null) {
>                           return true;
>                       }
>                       entry = entry.next;
>                   }
>               }
>           } else {
>               for (int i = 0, isize = data.length; i < isize; i++) {
>                   HashEntry entry = data[i];
>                   while (entry != null) {
>                       if (isEqualValue(value, entry.getValue())) {
>                           return true;
>                       }
>                       entry = entry.next;
>                   }
>               }
>           }
>           return false;
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Puts a key-value mapping into this map.
>        *
>        * @param key  the key to add
>        * @param value  the value to add
>        * @return the value previously mapped to this key, null if none
>        */
>       public Object put(Object key, Object value) {
>           key = convertKey(key);
>           int hashCode = hash(key);
>           int index = hashIndex(hashCode, data.length);
>           HashEntry entry = data[index];
>           while (entry != null) {
>               if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) {
>                   Object oldValue = entry.getValue();
>                   entry.setValue(value);
>                   return oldValue;
>               }
>               entry = entry.next;
>           }
>
>           modCount++;
>           add(hashCode, index, key, value);
>           return null;
>       }
>
>       /**
>        * Puts all the values from the specified map into this map.
>        *
>        * @param map  the map to add
>        * @throws NullPointerException if the map is null
>        */
>       public void putAll(Map map) {
>           int mapSize = map.size();
>           if (mapSize == 0) {
>               return;
>           }
>           ensureCapacity(calculateNewCapacity(size + mapSize));
>           for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
>               Map.Entry entry = (Map.Entry) it.next();
>               put(entry.getKey(), entry.getValue());
>           }
>       }
>
>       /**
>        * Removes the specified mapping from this map.
>        *
>        * @param key  the mapping to remove
>        * @return the value mapped to the removed key, null if key not in map
>        */
>       public Object remove(Object key) {
>           key = convertKey(key);
>           int hashCode = hash(key);
>           int index = hashIndex(hashCode, data.length);
>           HashEntry entry = data[index];
>           HashEntry previous = null;
>           while (entry != null) {
>               if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) {
>                   modCount++;
>                   if (previous == null) {
>                       data[index] = entry.next;
>                   } else {
>                       previous.next = entry.next;
>                   }
>                   size--;
>                   return destroyEntry(entry);
>               }
>               previous = entry;
>               entry = entry.next;
>           }
>           return null;
>       }
>
>       /**
>        * Clears the map, resetting the size to zero and nullifying references
>        * to avoid garbage collection issues.
>        */
>       public void clear() {
>           modCount++;
>           HashEntry[] data = this.data;
>           for (int i = data.length - 1; i >= 0; i--) {
>               data[i] = null;
>           }
>           size = 0;
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Converts input keys to another object for storage in the map.
>        * This implementation masks nulls.
>        * Subclasses can override this to perform alternate key conversions.
>        * <p>
>        * The reverse conversion can be changed, if required, by overriding the
>        * getKey() method in the hash entry.
>        *
>        * @param key  the key to get a hash code for
>        * @return the hash code
>        */
>       protected Object convertKey(Object key) {
>           return (key == null ? NULL : key);
>       }
>
>       /**
>        * Gets the hash code for the key specified.
>        * This implementation uses the additional hashing routine from JDK1.4.
>        * Subclasses can override this to return alternate hash codes.
>        *
>        * @param key  the key to get a hash code for
>        * @return the hash code
>        */
>       protected int hash(Object key) {
>           // same as JDK 1.4
>           int h = key.hashCode();
>           h += ~(h << 9);
>           h ^=  (h >>> 14);
>           h +=  (h << 4);
>           h ^=  (h >>> 10);
>           return h;
>       }
>
>       /**
>        * Compares two keys for equals.
>        * This implementation uses the equals method.
>        * Subclasses can override this to match differently.
>        *
>        * @param key1  the first key to compare
>        * @param key2  the second key to compare
>        * @return true if equal
>        */
>       protected boolean isEqualKey(Object key1, Object key2) {
>           return (key1 == key2 || key1.equals(key2));
>       }
>
>       /**
>        * Compares two values for equals.
>        * This implementation uses the equals method.
>        * Subclasses can override this to match differently.
>        *
>        * @param value1  the first value to compare
>        * @param value2  the second value to compare
>        * @return true if equal
>        */
>       protected boolean isEqualValue(Object value1, Object value2) {
>           return (value1 == value2 || value1.equals(value2));
>       }
>
>       /**
>        * Gets the index into the data storage for the hashCode specified.
>        * This implementation uses the least significant bits of the hashCode.
>        * Subclasses can override this to return alternate bucketing.
>        *
>        * @param hashCode  the hash code to use
>        * @param dataSize  the size of the data to pick a bucket from
>        * @return the bucket index
>        */
>       protected int hashIndex(int hashCode, int dataSize) {
>           return hashCode & (dataSize - 1);
>       }
>
>       /**
>        * Creates an entry to store the data.
>        * This implementation creates a HashEntry instance.
>        * Subclasses can override this to return a different storage class,
>        * or implement caching.
>        *
>        * @param next  the next entry in sequence
>        * @param hashCode  the hash code to use
>        * @param key  the key to store
>        * @param value  the value to store
>        * @return the newly created entry
>        */
>       protected HashEntry createEntry(HashEntry next, int hashCode, Object key, Object value) {
>           return new HashEntry(next, hashCode, key, value);
>       }
>
>       /**
>        * Kills an entry ready for the garbage collector.
>        * This implementation prepares the HashEntry for garbage collection.
>        * Subclasses can override this to implement caching (override clear as well).
>        *
>        * @param entry  the entry to destroy
>        * @return the value from the entry
>        */
>       protected Object destroyEntry(HashEntry entry) {
>           entry.next = null;
>           return entry.value;
>       }
>
>       /**
>        * Adds a new key-value mapping into this map.
>        * Subclasses could override to fix the size of the map.
>        *
>        * @param key  the key to add
>        * @param value  the value to add
>        * @return the value previously mapped to this key, null if none
>        */
>       protected void add(int hashCode, int hashIndex, Object key, Object value) {
>           data[hashIndex] = createEntry(data[hashIndex], hashCode, key, value);
>           if (size++ >= threshold) {
>               ensureCapacity(data.length * 2);
>           }
>       }
>
>       /**
>        * Changes the size of the data structure to the capacity proposed.
>        *
>        * @param newCapacity  the new capacity of the array
>        */
>       protected void ensureCapacity(int newCapacity) {
>           int oldCapacity = data.length;
>           if (newCapacity <= oldCapacity) {
>               return;
>           }
>           HashEntry oldEntries[] = data;
>           HashEntry newEntries[] = new HashEntry[newCapacity];
>
>           modCount++;
>           for (int i = oldCapacity - 1; i >= 0; i--) {
>               HashEntry entry = oldEntries[i];
>               if (entry != null) {
>                   oldEntries[i] = null;  // gc
>                   do {
>                       HashEntry next = entry.next;
>                       int index = hashIndex(entry.hashCode, newCapacity);
>                       entry.next = newEntries[index];
>                       newEntries[index] = entry;
>                       entry = next;
>                   } while (entry != null);
>               }
>           }
>           threshold = calculateThreshold(newCapacity, loadFactor);
>           data = newEntries;
>       }
>
>       /**
>        * Calculates the new capacity of the map.
>        * This implementation normalizes the capacity to a power of two.
>        *
>        * @param proposedCapacity  the proposed capacity
>        * @return the normalized new capacity
>        */
>       protected int calculateNewCapacity(int proposedCapacity) {
>           int newCapacity = 1;
>           if (proposedCapacity > MAXIMUM_CAPACITY) {
>               newCapacity = MAXIMUM_CAPACITY;
>           } else {
>               while (newCapacity < proposedCapacity) {
>                   newCapacity <<= 1;  // multiply by two
>               }
>               if (proposedCapacity > MAXIMUM_CAPACITY) {
>                   newCapacity = MAXIMUM_CAPACITY;
>               }
>           }
>           return newCapacity;
>       }
>
>       /**
>        * Calculates the new threshold of the map, where it will be resized.
>        * This implementation uses the load factor.
>        *
>        * @param newCapacity  the new capacity
>        * @param factor  the load factor
>        * @return the new resize threshold
>        */
>       protected int calculateThreshold(int newCapacity, float factor) {
>           return (int) (newCapacity * factor);
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Gets an iterator over the map.
>        * Changes made to the iterator affect this map.
>        * <p>
>        * A MapIterator returns the keys in the map. It also provides convenient
>        * methods to get the key and value, and set the value.
>        * It avoids the need to create an entrySet/keySet/values object.
>        * It also avoids creating the Mep Entry object.
>        *
>        * @return the map iterator
>        */
>       public MapIterator mapIterator() {
>           if (size == 0) {
>               return IteratorUtils.EMPTY_MAP_ITERATOR;
>           }
>           return new HashMapIterator(this);
>       }
>
>       /**
>        * MapIterator
>        */
>       static class HashMapIterator extends HashIterator implements MapIterator {
>
>           HashMapIterator(HashedMap map) {
>               super(map);
>           }
>
>           public Object next() {
>               return super.nextEntry().getKey();
>           }
>
>           public Object getKey() {
>               HashEntry current = currentEntry();
>               if (current == null) {
>                   throw new IllegalStateException("Iterator remove() can only be called once after next()");
>               }
>               return current.getKey();
>           }
>
>           public Object getValue() {
>               HashEntry current = currentEntry();
>               if (current == null) {
>                   throw new IllegalStateException("Iterator remove() can only be called once after next()");
>               }
>               return current.getValue();
>           }
>
>           public Object setValue(Object value) {
>               HashEntry current = currentEntry();
>               if (current == null) {
>                   throw new IllegalStateException("Iterator remove() can only be called once after next()");
>               }
>               Object old = current.getValue();
>               current.setValue(value);
>               return old;
>           }
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Gets the entrySet view of the map.
>        * Changes made to the view affect this map.
>        * The Map Entry is not an independent object and changes as the
>        * iterator progresses.
>        * To simply iterate through the entries, use {@link #mapIterator()}.
>        *
>        * @return the entrySet view
>        */
>       public Set entrySet() {
>           if (entrySet == null) {
>               entrySet = new EntrySet(this);
>           }
>           return entrySet;
>       }
>
>       /**
>        * Creates an entry set iterator.
>        * Subclasses can override this to return iterators with different properties.
>        *
>        * @return the entrySet iterator
>        */
>       protected Iterator createEntrySetIterator() {
>           if (size() == 0) {
>               return IteratorUtils.EMPTY_ITERATOR;
>           }
>           return new EntrySetIterator(this);
>       }
>
>       /**
>        * EntrySet
>        */
>       static class EntrySet extends AbstractSet {
>           private final HashedMap map;
>
>           EntrySet(HashedMap map) {
>               super();
>               this.map = map;
>           }
>
>           public int size() {
>               return map.size();
>           }
>
>           public void clear() {
>               map.clear();
>           }
>
>           public boolean contains(Object entry) {
>               if (entry instanceof Map.Entry) {
>                   return map.containsKey(((Map.Entry) entry).getKey());
>               }
>               return false;
>           }
>
>           public boolean remove(Object obj) {
>               if (obj instanceof Map.Entry == false) {
>                   return false;
>               }
>               Map.Entry entry = (Map.Entry) obj;
>               Object key = entry.getKey();
>               boolean result = map.containsKey(key);
>               map.remove(key);
>               return result;
>           }
>
>           public Iterator iterator() {
>               return map.createEntrySetIterator();
>           }
>       }
>
>       /**
>        * EntrySetIterator and MapEntry
>        */
>       static class EntrySetIterator extends HashIterator {
>
>           EntrySetIterator(HashedMap map) {
>               super(map);
>           }
>
>           public Object next() {
>               return super.nextEntry();
>           }
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Gets the keySet view of the map.
>        * Changes made to the view affect this map.
>        * To simply iterate through the keys, use {@link #mapIterator()}.
>        *
>        * @return the keySet view
>        */
>       public Set keySet() {
>           if (keySet == null) {
>               keySet = new KeySet(this);
>           }
>           return keySet;
>       }
>
>       /**
>        * Creates a key set iterator.
>        * Subclasses can override this to return iterators with different properties.
>        *
>        * @return the keySet iterator
>        */
>       protected Iterator createKeySetIterator() {
>           if (size() == 0) {
>               return IteratorUtils.EMPTY_ITERATOR;
>           }
>           return new KeySetIterator(this);
>       }
>
>       /**
>        * KeySet
>        */
>       static class KeySet extends AbstractSet {
>           private final HashedMap map;
>
>           KeySet(HashedMap map) {
>               super();
>               this.map = map;
>           }
>
>           public int size() {
>               return map.size();
>           }
>
>           public void clear() {
>               map.clear();
>           }
>
>           public boolean contains(Object key) {
>               return map.containsKey(key);
>           }
>
>           public boolean remove(Object key) {
>               boolean result = map.containsKey(key);
>               map.remove(key);
>               return result;
>           }
>
>           public Iterator iterator() {
>               return map.createKeySetIterator();
>           }
>       }
>
>       /**
>        * KeySetIterator
>        */
>       static class KeySetIterator extends EntrySetIterator {
>
>           KeySetIterator(HashedMap map) {
>               super(map);
>           }
>
>           public Object next() {
>               return super.nextEntry().getKey();
>           }
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Gets the values view of the map.
>        * Changes made to the view affect this map.
>        * To simply iterate through the values, use {@link #mapIterator()}.
>        *
>        * @return the values view
>        */
>       public Collection values() {
>           if (values == null) {
>               values = new Values(this);
>           }
>           return values;
>       }
>
>       /**
>        * Creates a values iterator.
>        * Subclasses can override this to return iterators with different properties.
>        *
>        * @return the values iterator
>        */
>       protected Iterator createValuesIterator() {
>           if (size() == 0) {
>               return IteratorUtils.EMPTY_ITERATOR;
>           }
>           return new ValuesIterator(this);
>       }
>
>       /**
>        * Values
>        */
>       static class Values extends AbstractCollection {
>           private final HashedMap map;
>
>           Values(HashedMap map) {
>               super();
>               this.map = map;
>           }
>
>           public int size() {
>               return map.size();
>           }
>
>           public void clear() {
>               map.clear();
>           }
>
>           public boolean contains(Object value) {
>               return map.containsValue(value);
>           }
>
>           public Iterator iterator() {
>               return map.createValuesIterator();
>           }
>       }
>
>       /**
>        * ValuesIterator
>        */
>       static class ValuesIterator extends HashIterator {
>
>           ValuesIterator(HashedMap map) {
>               super(map);
>           }
>
>           public Object next() {
>               return super.nextEntry().getValue();
>           }
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * HashEntry
>        */
>       protected static class HashEntry implements Map.Entry {
>           protected HashEntry next;
>           protected int hashCode;
>           protected Object key;
>           protected Object value;
>
>           HashEntry(HashEntry next, int hashCode, Object key, Object value) {
>               super();
>               this.next = next;
>               this.hashCode = hashCode;
>               this.key = key;
>               this.value = value;
>           }
>           public Object getKey() {
>               return (key == NULL ? null : key);
>           }
>           public Object getValue() {
>               return value;
>           }
>           public Object setValue(Object value) {
>               Object old = value;
>               this.value = value;
>               return old;
>           }
>           public boolean equals(Object obj) {
>               if (obj == this) {
>                   return true;
>               }
>               if (obj instanceof Map.Entry == false) {
>                   return false;
>               }
>               Map.Entry other = (Map.Entry) obj;
>               return
>                   (getKey() == null ? other.getKey() == null : getKey().equals(other.getKey())) &&
>                   (getValue() == null ? other.getValue() == null : getValue().equals(other.getValue()));
>           }
>           public int hashCode() {
>               return (getKey() == null ? 0 : getKey().hashCode()) ^
>                      (getValue() == null ? 0 : getValue().hashCode());
>           }
>           public String toString() {
>               return new StringBuffer().append(getKey()).append('=').append(getValue()).toString();
>           }
>       }
>
>       /**
>        * Base Iterator
>        */
>       protected static abstract class HashIterator implements Iterator {
>           private final HashedMap map;
>           private int hashIndex;
>           private HashEntry current;
>           private HashEntry next;
>           private int expectedModCount;
>
>           HashIterator(HashedMap map) {
>               super();
>               this.map = map;
>               HashEntry[] data = map.data;
>               int i = data.length;
>               HashEntry next = null;
>               while (i > 0 && next == null) {
>                   next = data[--i];
>               }
>               this.next = next;
>               this.hashIndex = i;
>               this.expectedModCount = map.modCount;
>           }
>
>           public boolean hasNext() {
>               return (next != null);
>           }
>
>           HashEntry nextEntry() {
>               if (map.modCount != expectedModCount) {
>                   throw new ConcurrentModificationException();
>               }
>               HashEntry newCurrent = next;
>               if (newCurrent == null)  {
>                   throw new NoSuchElementException("No more elements in the iteration");
>               }
>               HashEntry[] data = map.data;
>               int i = hashIndex;
>               HashEntry n = newCurrent.next;
>               while (n == null && i > 0) {
>                   n = data[--i];
>               }
>               next = n;
>               hashIndex = i;
>               current = newCurrent;
>               return newCurrent;
>           }
>
>           public HashEntry currentEntry() {
>               return current;
>           }
>
>           public void remove() {
>               if (current == null) {
>                   throw new IllegalStateException("Iterator remove() can only be called once after next()");
>               }
>               if (map.modCount != expectedModCount) {
>                   throw new ConcurrentModificationException();
>               }
>               map.remove(current.getKey());
>               current = null;
>               expectedModCount = map.modCount;
>           }
>
>           public String toString() {
>               if (current != null) {
>                   return "Iterator[" + current.getKey() + "=" + current.getValue() + "]";
>               } else {
>                   return "Iterator[]";
>               }
>           }
>       }
>
>       //-----------------------------------------------------------------------
>       /**
>        * Write the map out using a custom routine.
>        */
>       private void writeObject(ObjectOutputStream out) throws IOException {
>           out.defaultWriteObject();
>           out.writeInt(data.length);
>           out.writeInt(size);
>           for (MapIterator it = mapIterator(); it.hasNext();) {
>               out.writeObject(it.next());
>               out.writeObject(it.getValue());
>           }
>       }
>
>       /**
>        * Read the map in using a custom routine.
>        */
>       private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
>           in.defaultReadObject();
>           int capacity = in.readInt();
>           int size = in.readInt();
>           data = new HashEntry[capacity];
>           for (int i = 0; i < size; i++) {
>               Object key = in.readObject();
>               Object value = in.readObject();
>               put(key, value);
>           }
>       }
>       //-----------------------------------------------------------------------
>       /**
>        * Clones the map without cloning the keys or values.
>        *
>        * @return a shallow clone
>        */
>       public Object clone() {
>           try {
>               HashedMap cloned = (HashedMap) super.clone();
>               cloned.data = new HashEntry[data.length];
>               cloned.entrySet = null;
>               cloned.keySet = null;
>               cloned.values = null;
>               cloned.modCount = 0;
>               cloned.size = 0;
>               cloned.putAll(this);
>               return cloned;
>
>           } catch (CloneNotSupportedException ex) {
>               return null;  // should never happen
>           }
>       }
>
>       /**
>        * Compares this map with another.
>        *
>        * @param obj  the object to compare to
>        * @return true if equal
>        */
>       public boolean equals(Object obj) {
>           if (obj == this) {
>               return true;
>           }
>           if (obj instanceof Map == false) {
>               return false;
>           }
>           Map map = (Map) obj;
>           if (map.size() != size()) {
>               return false;
>           }
>           MapIterator it = mapIterator();
>           try {
>               while (it.hasNext()) {
>                   Object key = it.next();
>                   Object value = it.getValue();
>                   if (value == null) {
>                       if (map.get(key) != null || map.containsKey(key) == false) {
>                           return false;
>                       }
>                   } else {
>                       if (value.equals(map.get(key)) == false) {
>                           return false;
>                       }
>                   }
>               }
>           } catch (ClassCastException ignored)   {
>               return false;
>           } catch (NullPointerException ignored) {
>               return false;
>           }
>           return true;
>       }
>
>       /**
>        * Gets the standard Map hashCode.
>        *
>        * @return the hashcode defined in the Map interface
>        */
>       public int hashCode() {
>           int total = 0;
>           Iterator it = createEntrySetIterator();
>           while (it.hasNext()) {
>               total += it.next().hashCode();
>           }
>           return total;
>       }
>
>       /**
>        * Gets the map as a String.
>        *
>        * @return a string version of the map
>        */
>       public String toString() {
>           if (size() == 0) {
>               return "{}";
>           }
>           StringBuffer buf = new StringBuffer(32 * size());
>           buf.append('{');
>
>           MapIterator it = mapIterator();
>           boolean hasNext = it.hasNext();
>           while (hasNext) {
>               Object key = it.next();
>               Object value = it.getValue();
>               buf.append(key == this ? "(this Map)" : key)
>                  .append('=')
>                  .append(value == this ? "(this Map)" : value);
>
>               hasNext = it.hasNext();
>               if (hasNext) {
>                   buf.append(',').append(' ');
>               }
>           }
>
>           buf.append('}');
>           return buf.toString();
>       }
>   }
>
>
>
>   1.5       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestSortedBidiMap.java
>
>   Index: AbstractTestSortedBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestSortedBidiMap.java,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   --- AbstractTestSortedBidiMap.java	18 Nov 2003 22:37:16 -0000	1.4
>   +++ AbstractTestSortedBidiMap.java	1 Dec 2003 22:34:54 -0000	1.5
>   @@ -70,6 +70,7 @@
>    import java.util.TreeSet;
>
>    import org.apache.commons.collections.BulkTest;
>   +import org.apache.commons.collections.SortedBidiMap;
>    import org.apache.commons.collections.map.AbstractTestSortedMap;
>
>    /**
>
>
>
>   1.3       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestDualTreeBidiMap.java
>
>   Index: TestDualTreeBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestDualTreeBidiMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- TestDualTreeBidiMap.java	18 Nov 2003 22:37:16 -0000	1.2
>   +++ TestDualTreeBidiMap.java	1 Dec 2003 22:34:54 -0000	1.3
>   @@ -60,6 +60,7 @@
>    import junit.framework.Test;
>    import junit.textui.TestRunner;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.BulkTest;
>
>    /**
>
>
>
>   1.3       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestDualHashBidiMap.java
>
>   Index: TestDualHashBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestDualHashBidiMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- TestDualHashBidiMap.java	18 Nov 2003 22:37:16 -0000	1.2
>   +++ TestDualHashBidiMap.java	1 Dec 2003 22:34:54 -0000	1.3
>   @@ -60,6 +60,7 @@
>    import junit.framework.Test;
>    import junit.textui.TestRunner;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.BulkTest;
>
>    /**
>
>
>
>   1.3       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestOrderedBidiMap.java
>
>   Index: AbstractTestOrderedBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestOrderedBidiMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- AbstractTestOrderedBidiMap.java	20 Nov 2003 00:31:42 -0000	1.2
>   +++ AbstractTestOrderedBidiMap.java	1 Dec 2003 22:34:54 -0000	1.3
>   @@ -65,6 +65,7 @@
>    import java.util.NoSuchElementException;
>
>    import org.apache.commons.collections.BulkTest;
>   +import org.apache.commons.collections.OrderedBidiMap;
>    import org.apache.commons.collections.iterators.AbstractTestMapIterator;
>    import org.apache.commons.collections.iterators.MapIterator;
>
>
>
>
>   1.3       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestTreeBidiMap.java
>
>   Index: TestTreeBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/TestTreeBidiMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- TestTreeBidiMap.java	18 Nov 2003 22:37:16 -0000	1.2
>   +++ TestTreeBidiMap.java	1 Dec 2003 22:34:54 -0000	1.3
>   @@ -63,6 +63,7 @@
>    import junit.framework.Test;
>    import junit.textui.TestRunner;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.BulkTest;
>
>    /**
>
>
>
>   1.4       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestBidiMap.java
>
>   Index: AbstractTestBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/bidimap/AbstractTestBidiMap.java,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- AbstractTestBidiMap.java	18 Nov 2003 22:37:16 -0000	1.3
>   +++ AbstractTestBidiMap.java	1 Dec 2003 22:34:54 -0000	1.4
>   @@ -63,6 +63,7 @@
>    import java.util.Map;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.BulkTest;
>    import org.apache.commons.collections.iterators.AbstractTestMapIterator;
>    import org.apache.commons.collections.iterators.MapIterator;
>
>
>
>   1.2       +3 -3      jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestFlat3Map.java
>
>   Index: TestFlat3Map.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestFlat3Map.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- TestFlat3Map.java	18 Nov 2003 23:23:05 -0000	1.1
>   +++ TestFlat3Map.java	1 Dec 2003 22:34:54 -0000	1.2
>   @@ -73,7 +73,7 @@
>     *
>     * @author Stephen Colebourne
>     */
>   -public class TestFlat3Map extends AbstractTestMap {
>   +public class TestFlat3Map extends AbstractTestAMap {
>
>        public TestFlat3Map(String testName) {
>            super(testName);
>
>
>
>   1.4       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestAll.java
>
>   Index: TestAll.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestAll.java,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- TestAll.java	20 Nov 2003 22:35:50 -0000	1.3
>   +++ TestAll.java	1 Dec 2003 22:34:54 -0000	1.4
>   @@ -86,6 +86,7 @@
>            suite.addTest(TestFixedSizeMap.suite());
>            suite.addTest(TestFixedSizeSortedMap.suite());
>            suite.addTest(TestFlat3Map.suite());
>   +        suite.addTest(TestHashedMap.suite());
>            suite.addTest(TestLazyMap.suite());
>            suite.addTest(TestLazySortedMap.suite());
>            suite.addTest(TestListOrderedMap.suite());
>
>
>
>   1.2       +4 -50     jakarta-commons/collections/src/test/org/apache/commons/collections/map/AbstractTestOrderedMap.java
>
>   Index: AbstractTestOrderedMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/AbstractTestOrderedMap.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- AbstractTestOrderedMap.java	20 Nov 2003 22:34:49 -0000	1.1
>   +++ AbstractTestOrderedMap.java	1 Dec 2003 22:34:54 -0000	1.2
>   @@ -67,8 +67,8 @@
>    import java.util.TreeMap;
>
>    import org.apache.commons.collections.BulkTest;
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.comparators.NullComparator;
>   -import org.apache.commons.collections.iterators.AbstractTestMapIterator;
>    import org.apache.commons.collections.iterators.AbstractTestOrderedMapIterator;
>    import org.apache.commons.collections.iterators.MapIterator;
>
>   @@ -79,7 +79,7 @@
>     *
>     * @author Stephen Colebourne
>     */
>   -public abstract class AbstractTestOrderedMap extends AbstractTestMap {
>   +public abstract class AbstractTestOrderedMap extends AbstractTestAMap {
>
>        /**
>         * JUnit constructor.
>   @@ -214,56 +214,10 @@
>        }
>
>        //-----------------------------------------------------------------------
>   -    public BulkTest bulkTestMapIterator() {
>   -        return new InnerTestOrderedMapIterator();
>   -    }
>   -
>   -    // TODO: Test mapIterator() and orderedMapIterator() separately
>   -    public class InnerTestMapIterator extends AbstractTestMapIterator {
>   -        public InnerTestMapIterator() {
>   -            super("InnerTestMapIterator");
>   -        }
>   -
>   -        public boolean supportsRemove() {
>   -            return AbstractTestOrderedMap.this.isRemoveSupported();
>   -        }
>   -
>   -        public boolean supportsSetValue() {
>   -            return AbstractTestOrderedMap.this.isSetValueSupported();
>   -        }
>   -
>   -        public MapIterator makeEmptyMapIterator() {
>   -            resetEmpty();
>   -            return ((OrderedMap) AbstractTestOrderedMap.this.map).mapIterator();
>   -        }
>   -
>   -        public MapIterator makeFullMapIterator() {
>   -            resetFull();
>   -            return ((OrderedMap) AbstractTestOrderedMap.this.map).mapIterator();
>   -        }
>   -
>   -        public Map getMap() {
>   -            // assumes makeFullMapIterator() called first
>   -            return AbstractTestOrderedMap.this.map;
>   -        }
>   -
>   -        public Map getConfirmedMap() {
>   -            // assumes makeFullMapIterator() called first
>   -            return AbstractTestOrderedMap.this.confirmed;
>   -        }
>   -
>   -        public void verify() {
>   -            super.verify();
>   -            AbstractTestOrderedMap.this.verify();
>   -        }
>   -    }
>   -
>   -    //-----------------------------------------------------------------------
>        public BulkTest bulkTestOrderedMapIterator() {
>            return new InnerTestOrderedMapIterator();
>        }
>
>   -    // TODO: Test mapIterator() and orderedMapIterator() separately
>        public class InnerTestOrderedMapIterator extends AbstractTestOrderedMapIterator {
>            public InnerTestOrderedMapIterator() {
>                super("InnerTestOrderedMapIterator");
>
>
>
>   1.5       +3 -3      jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestUnmodifiableMap.java
>
>   Index: TestUnmodifiableMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestUnmodifiableMap.java,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   --- TestUnmodifiableMap.java	20 Nov 2003 22:35:50 -0000	1.4
>   +++ TestUnmodifiableMap.java	1 Dec 2003 22:34:54 -0000	1.5
>   @@ -74,7 +74,7 @@
>     *
>     * @author Phil Steitz
>     */
>   -public class TestUnmodifiableMap extends AbstractTestMap{
>   +public class TestUnmodifiableMap extends AbstractTestAMap{
>
>        public TestUnmodifiableMap(String testName) {
>            super(testName);
>
>
>
>   1.2       +3 -2      jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestUnmodifiableOrderedMap.java
>
>   Index: TestUnmodifiableOrderedMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestUnmodifiableOrderedMap.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- TestUnmodifiableOrderedMap.java	20 Nov 2003 22:35:50 -0000	1.1
>   +++ TestUnmodifiableOrderedMap.java	1 Dec 2003 22:34:54 -0000	1.2
>   @@ -63,6 +63,7 @@
>    import junit.framework.Test;
>    import junit.framework.TestSuite;
>
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.Unmodifiable;
>
>    /**
>
>
>
>   1.1                  jakarta-commons/collections/src/test/org/apache/commons/collections/map/AbstractTestAMap.java
>
>   Index: AbstractTestAMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/AbstractTestAMap.java,v 1.1 2003/12/01 22:34:54 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections.map;
>
>   import java.util.ConcurrentModificationException;
>   import java.util.Iterator;
>   import java.util.Map;
>
>   import org.apache.commons.collections.AMap;
>   import org.apache.commons.collections.BulkTest;
>   import org.apache.commons.collections.iterators.AbstractTestMapIterator;
>   import org.apache.commons.collections.iterators.MapIterator;
>
>   /**
>    * Abstract test class for {@link AMap} methods and contracts.
>    *
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:54 $
>    *
>    * @author Stephen Colebourne
>    */
>   public abstract class AbstractTestAMap extends AbstractTestMap {
>
>       /**
>        * JUnit constructor.
>        *
>        * @param testName  the test name
>        */
>       public AbstractTestAMap(String testName) {
>           super(testName);
>       }
>
>       //-----------------------------------------------------------------------
>       public void testFailFastEntrySet() {
>           if (isRemoveSupported() == false) return;
>           resetFull();
>           Iterator it = map.entrySet().iterator();
>           Map.Entry val = (Map.Entry) it.next();
>           map.remove(val.getKey());
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>
>           resetFull();
>           it = map.entrySet().iterator();
>           it.next();
>           map.clear();
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>       }
>
>       public void testFailFastKeySet() {
>           if (isRemoveSupported() == false) return;
>           resetFull();
>           Iterator it = map.keySet().iterator();
>           Object val = it.next();
>           map.remove(val);
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>
>           resetFull();
>           it = map.keySet().iterator();
>           it.next();
>           map.clear();
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>       }
>
>       public void testFailFastValues() {
>           if (isRemoveSupported() == false) return;
>           resetFull();
>           Iterator it = map.values().iterator();
>           it.next();
>           map.remove(map.keySet().iterator().next());
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>
>           resetFull();
>           it = map.values().iterator();
>           it.next();
>           map.clear();
>           try {
>               it.next();
>               fail();
>           } catch (ConcurrentModificationException ex) {}
>       }
>
>       //-----------------------------------------------------------------------
>       public BulkTest bulkTestMapIterator() {
>           return new InnerTestMapIterator();
>       }
>
>       public class InnerTestMapIterator extends AbstractTestMapIterator {
>           public InnerTestMapIterator() {
>               super("InnerTestMapIterator");
>           }
>
>           public Object[] addSetValues() {
>               return AbstractTestAMap.this.getNewSampleValues();
>           }
>
>           public boolean supportsRemove() {
>               return AbstractTestAMap.this.isRemoveSupported();
>           }
>
>           public boolean supportsSetValue() {
>               return AbstractTestAMap.this.isSetValueSupported();
>           }
>
>           public MapIterator makeEmptyMapIterator() {
>               resetEmpty();
>               return ((AMap) AbstractTestAMap.this.map).mapIterator();
>           }
>
>           public MapIterator makeFullMapIterator() {
>               resetFull();
>               return ((AMap) AbstractTestAMap.this.map).mapIterator();
>           }
>
>           public Map getMap() {
>               // assumes makeFullMapIterator() called first
>               return AbstractTestAMap.this.map;
>           }
>
>           public Map getConfirmedMap() {
>               // assumes makeFullMapIterator() called first
>               return AbstractTestAMap.this.confirmed;
>           }
>
>           public void verify() {
>               super.verify();
>               AbstractTestAMap.this.verify();
>           }
>       }
>
>   //  public void testCreate() throws Exception {
>   //      resetEmpty();
>   //      writeExternalFormToDisk((Serializable) map, "D:/dev/collections/data/test/HashedMap.emptyCollection.version3.obj");
>   //      resetFull();
>   //      writeExternalFormToDisk((Serializable) map, "D:/dev/collections/data/test/HashedMap.fullCollection.version3.obj");
>   //  }
>   }
>
>
>
>   1.1                  jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestHashedMap.java
>
>   Index: TestHashedMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/map/TestHashedMap.java,v 1.1 2003/12/01 22:34:54 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections.map;
>
>   import java.util.Map;
>
>   import junit.framework.Test;
>   import junit.textui.TestRunner;
>
>   import org.apache.commons.collections.BulkTest;
>
>   /**
>    * JUnit tests.
>    *
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:54 $
>    *
>    * @author Stephen Colebourne
>    */
>   public class TestHashedMap extends AbstractTestAMap {
>
>       public TestHashedMap(String testName) {
>           super(testName);
>       }
>
>       public static void main(String[] args) {
>           TestRunner.run(suite());
>       }
>
>       public static Test suite() {
>           return BulkTest.makeSuite(TestHashedMap.class);
>       }
>
>       public Map makeEmptyMap() {
>           return new HashedMap();
>       }
>
>       public String getCompatibilityVersion() {
>           return "3";
>       }
>
>   }
>
>
>
>   1.2       +3 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java
>
>   Index: AbstractDualBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/AbstractDualBidiMap.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- AbstractDualBidiMap.java	16 Nov 2003 20:35:46 -0000	1.1
>   +++ AbstractDualBidiMap.java	1 Dec 2003 22:34:54 -0000	1.2
>   @@ -62,6 +62,7 @@
>    import java.util.Map;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.collection.AbstractCollectionDecorator;
>    import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
>    import org.apache.commons.collections.iterators.MapIterator;
>
>
>
>   1.2       +4 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/DualHashBidiMap.java
>
>   Index: DualHashBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/DualHashBidiMap.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- DualHashBidiMap.java	16 Nov 2003 20:35:46 -0000	1.1
>   +++ DualHashBidiMap.java	1 Dec 2003 22:34:54 -0000	1.2
>   @@ -64,6 +64,8 @@
>    import java.util.HashMap;
>    import java.util.Map;
>
>   +import org.apache.commons.collections.BidiMap;
>   +
>    /**
>     * Implementation of <code>BidiMap</code> that uses two <code>HashMap</code> instances.
>     *
>
>
>
>   1.4       +6 -3      jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/DualTreeBidiMap.java
>
>   Index: DualTreeBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/DualTreeBidiMap.java,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- DualTreeBidiMap.java	20 Nov 2003 00:31:42 -0000	1.3
>   +++ DualTreeBidiMap.java	1 Dec 2003 22:34:54 -0000	1.4
>   @@ -69,10 +69,13 @@
>    import java.util.SortedMap;
>    import java.util.TreeMap;
>
>   +import org.apache.commons.collections.BidiMap;
>   +import org.apache.commons.collections.OrderedBidiMap;
>   +import org.apache.commons.collections.OrderedMap;
>   +import org.apache.commons.collections.SortedBidiMap;
>    import org.apache.commons.collections.iterators.OrderedMapIterator;
>    import org.apache.commons.collections.iterators.ResettableIterator;
>    import org.apache.commons.collections.map.AbstractSortedMapDecorator;
>   -import org.apache.commons.collections.map.OrderedMap;
>
>    /**
>     * Implementation of <code>BidiMap</code> that uses two <code>TreeMap</code> instances.
>
>
>
>   1.3       +4 -2      jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/TreeBidiMap.java
>
>   Index: TreeBidiMap.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/bidimap/TreeBidiMap.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- TreeBidiMap.java	20 Nov 2003 00:31:42 -0000	1.2
>   +++ TreeBidiMap.java	1 Dec 2003 22:34:54 -0000	1.3
>   @@ -65,7 +65,9 @@
>    import java.util.NoSuchElementException;
>    import java.util.Set;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.IteratorUtils;
>   +import org.apache.commons.collections.OrderedBidiMap;
>    import org.apache.commons.collections.iterators.MapIterator;
>    import org.apache.commons.collections.iterators.OrderedIterator;
>    import org.apache.commons.collections.iterators.OrderedMapIterator;
>
>
>
>   1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/OrderedMap.java
>
>   Index: OrderedMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/OrderedMap.java,v 1.1 2003/12/01 22:34:55 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections;
>
>   import org.apache.commons.collections.iterators.OrderedMapIterator;
>
>   /**
>    * Defines a map that maintains order and allows both forward and backward
>    * iteration through that order.
>    *
>    * @since Commons Collections 3.0
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:55 $
>    *
>    * @author Stephen Colebourne
>    */
>   public interface OrderedMap extends AMap {
>
>       /**
>        * Obtains an <code>OrderedMapIterator</code> over the map.
>        * <p>
>        * A ordered map iterator is an efficient way of iterating over maps
>        * in both directions.
>        * <pre>
>        * BidiMap map = new TreeBidiMap();
>        * MapIterator it = map.mapIterator();
>        * while (it.hasNext()) {
>        *   Object key = it.next();
>        *   Object value = it.getValue();
>        *   it.setValue("newValue");
>        *   Object previousKey = it.previous();
>        * }
>        * </pre>
>        *
>        * @return a map iterator
>        */
>       OrderedMapIterator orderedMapIterator();
>
>       /**
>        * Gets the first key currently in this map.
>        *
>        * @return the first key currently in this map
>        * @throws NoSuchElementException if this map is empty
>        */
>       public Object firstKey();
>
>       /**
>        * Gets the last key currently in this map.
>        *
>        * @return the last key currently in this map
>        * @throws NoSuchElementException if this map is empty
>        */
>       public Object lastKey();
>
>       /**
>        * Gets the next key after the one specified.
>        *
>        * @param key  the key to search for next from
>        * @return the next key, null if no match or at end
>        */
>       public Object nextKey(Object key);
>
>       /**
>        * Gets the previous key before the one specified.
>        *
>        * @param key  the key to search for previous from
>        * @return the previous key, null if no match or at start
>        */
>       public Object previousKey(Object key);
>
>   }
>
>
>
>   1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/OrderedBidiMap.java
>
>   Index: OrderedBidiMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/OrderedBidiMap.java,v 1.1 2003/12/01 22:34:55 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections;
>
>   /**
>    * Defines a map that allows bidirectional lookup between key and values
>    * and retains and provides access to an ordering.
>    * <p>
>    * Implementations should allow a value to be looked up from a key and
>    * a key to be looked up from a value with equal performance.
>    *
>    * @since Commons Collections 3.0
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:55 $
>    *
>    * @author Stephen Colebourne
>    */
>   public interface OrderedBidiMap extends BidiMap, OrderedMap {
>
>       /**
>        * Gets a view of this map where the keys and values are reversed.
>        * <p>
>        * Changes to one map will be visible in the other and vice versa.
>        * This enables both directions of the map to be accessed equally.
>        * <p>
>        * Implementations should seek to avoid creating a new object every time this
>        * method is called. See <code>AbstractMap.values()</code> etc. Calling this
>        * method on the inverse map should return the original.
>        * <p>
>        * Implementations must return an <code>OrderedBidiMap</code> instance,
>        * usually by forwarding to <code>inverseOrderedBidiMap()</code>.
>        *
>        * @return an inverted bidirectional map
>        */
>       public BidiMap inverseBidiMap();
>
>       /**
>        * Gets a view of this map where the keys and values are reversed.
>        * <p>
>        * Changes to one map will be visible in the other and vice versa.
>        * This enables both directions of the map to be accessed equally.
>        * <p>
>        * Implementations should seek to avoid creating a new object every time this
>        * method is called. See <code>AbstractMap.values()</code> etc. Calling this
>        * method on the inverse map should return the original.
>        *
>        * @return an inverted bidirectional map
>        */
>       public OrderedBidiMap inverseOrderedBidiMap();
>
>   }
>
>
>
>   1.3       +23 -3     jakarta-commons/collections/src/java/org/apache/commons/collections/SortedBidiMap.java
>
>
>
>
>   1.8       +2 -3      jakarta-commons/collections/src/java/org/apache/commons/collections/BidiMap.java
>
>
>
>
>   1.1                  jakarta-commons/collections/src/java/org/apache/commons/collections/AMap.java
>
>   Index: AMap.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/AMap.java,v 1.1 2003/12/01 22:34:55 scolebourne Exp $
>    * ====================================================================
>    *
>    * The Apache Software License, Version 1.1
>    *
>    * Copyright (c) 2001-2003 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 acknowledgement:
>    *       "This product includes software developed by the
>    *        Apache Software Foundation (http://www.apache.org/)."
>    *    Alternately, this acknowledgement may appear in the software itself,
>    *    if and wherever such third-party acknowledgements 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 Software Foundation.
>    *
>    * 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
>    * <http://www.apache.org/>.
>    *
>    */
>   package org.apache.commons.collections;
>
>   import java.util.Map;
>
>   import org.apache.commons.collections.iterators.MapIterator;
>
>   /**
>    * Defines a map that can be iterated directly without needing to create an entry set.
>    * <p>
>    * A map iterator is an efficient way of iterating over maps.
>    * There is no need to access the entry set or cast to Map Entry objects.
>    * <pre>
>    * AMap map = new HashedMap();
>    * MapIterator it = map.mapIterator();
>    * while (it.hasNext()) {
>    *   Object key = it.next();
>    *   Object value = it.getValue();
>    *   it.setValue("newValue");
>    * }
>    * </pre>
>    *
>    * @since Commons Collections 3.0
>    * @version $Revision: 1.1 $ $Date: 2003/12/01 22:34:55 $
>    *
>    * @author Stephen Colebourne
>    */
>   public interface AMap extends Map {
>
>       /**
>        * Obtains a <code>MapIterator</code> over the map.
>        * <p>
>        * A map iterator is an efficient way of iterating over maps.
>        * There is no need to access the entry set or cast to Map Entry objects.
>        * <pre>
>        * AMap map = new HashedMap();
>        * MapIterator it = map.mapIterator();
>        * while (it.hasNext()) {
>        *   Object key = it.next();
>        *   Object value = it.getValue();
>        *   it.setValue("newValue");
>        * }
>        * </pre>
>        *
>        * @return a map iterator
>        */
>       MapIterator mapIterator();
>
>   }
>
>
>
>   1.2       +3 -3      jakarta-commons/collections/src/test/org/apache/commons/collections/iterators/TestUnmodifiableOrderedMapIterator.java
>
>   Index: TestUnmodifiableOrderedMapIterator.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/iterators/TestUnmodifiableOrderedMapIterator.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- TestUnmodifiableOrderedMapIterator.java	20 Nov 2003 21:45:35 -0000	1.1
>   +++ TestUnmodifiableOrderedMapIterator.java	1 Dec 2003 22:34:55 -0000	1.2
>   @@ -64,9 +64,9 @@
>    import junit.framework.Test;
>    import junit.framework.TestSuite;
>
>   +import org.apache.commons.collections.OrderedMap;
>    import org.apache.commons.collections.Unmodifiable;
>    import org.apache.commons.collections.map.ListOrderedMap;
>   -import org.apache.commons.collections.map.OrderedMap;
>
>    /**
>     * Tests the UnmodifiableOrderedMapIterator.
>
>
>
>   1.5       +3 -3      jakarta-commons/collections/src/test/org/apache/commons/collections/iterators/TestUnmodifiableMapIterator.java
>
>   Index: TestUnmodifiableMapIterator.java
>   ===================================================================
>   RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/iterators/TestUnmodifiableMapIterator.java,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   --- TestUnmodifiableMapIterator.java	18 Nov 2003 22:37:13 -0000	1.4
>   +++ TestUnmodifiableMapIterator.java	1 Dec 2003 22:34:55 -0000	1.5
>   @@ -63,8 +63,8 @@
>    import junit.framework.Test;
>    import junit.framework.TestSuite;
>
>   +import org.apache.commons.collections.BidiMap;
>    import org.apache.commons.collections.Unmodifiable;
>   -import org.apache.commons.collections.bidimap.BidiMap;
>    import org.apache.commons.collections.bidimap.DualHashBidiMap;
>
>    /**
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-dev-help@jakarta.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message