commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From scolebou...@apache.org
Subject cvs commit: jakarta-commons/collections/src/test/org/apache/commons/collections/iterators TestUnmodifiableOrderedMapIterator.java TestUnmodifiableMapIterator.java
Date Mon, 01 Dec 2003 22:34:55 GMT
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


Mime
View raw message