Author: tn Date: Thu Feb 28 20:58:51 2013 New Revision: 1451337 URL: http://svn.apache.org/r1451337 Log: [COLLECTIONS-258] Added new DualLinkedHashBidiMap implementation. Thanks to Nathan Blomquist for the patch.
Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java (with props) commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java (with props) commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.emptyCollection.version4.obj (with props) commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.fullCollection.version4.obj (with props) Modified: commons/proper/collections/trunk/src/changes/changes.xml Modified: commons/proper/collections/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/changes/changes.xml?rev=1451337&r1=1451336&r2=1451337&view=diff ============================================================================== --- commons/proper/collections/trunk/src/changes/changes.xml (original) +++ commons/proper/collections/trunk/src/changes/changes.xml Thu Feb 28 20:58:51 2013 @@ -22,6 +22,9 @@ <body> <release version="4.0" date="TBA" description="Next release"> + <action issue="COLLECTIONS-258" dev="tn" type="add" due-to="Nathan Blomquist"> + Added "DualLinkedHashBidiMap" bidi map implementation. + </action> <action issue="COLLECTIONS-396" dev="tn" type="add" due-to="Jeff Rodriguez"> Added "LazyIteratorChain" iterator. </action> Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java?rev=1451337&view=auto ============================================================================== --- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java (added) +++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java Thu Feb 28 20:58:51 2013 @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.collections.bidimap; + +import org.apache.commons.collections.BidiMap; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Implementation of <code>BidiMap</code> that uses two <code>LinkedHashMap</code> instances. + * <p> + * Two <code>LinkedHashMap</code> instances are used in this class. + * This provides fast lookups at the expense of storing two sets of map entries and two linked lists. + * + * @version $Id $ + * @since 4.0 + */ +public class DualLinkedHashBidiMap<K, V> extends AbstractDualBidiMap<K, V> implements Serializable { + + /** Ensure serialization compatibility */ + private static final long serialVersionUID = 721969328361810L; + + /** + * Creates an empty <code>HashBidiMap</code>. + */ + public DualLinkedHashBidiMap() { + super(new LinkedHashMap<K, V>(), new LinkedHashMap<V, K>()); + } + + /** + * Constructs a <code>LinkedHashBidiMap</code> and copies the mappings from + * specified <code>Map</code>. + * + * @param map the map whose mappings are to be placed in this map + */ + public DualLinkedHashBidiMap(Map<K, V> map) { + super(new LinkedHashMap<K, V>(), new LinkedHashMap<V, K>()); + putAll(map); + } + + /** + * Constructs a <code>LinkedHashBidiMap</code> that decorates the specified maps. + * + * @param normalMap the normal direction map + * @param reverseMap the reverse direction map + * @param inverseBidiMap the inverse BidiMap + */ + protected DualLinkedHashBidiMap(Map<K, V> normalMap, Map<V, K> reverseMap, BidiMap<V, K> inverseBidiMap) { + super(normalMap, reverseMap, inverseBidiMap); + } + + /** + * Creates a new instance of this object. + * + * @param normalMap the normal direction map + * @param reverseMap the reverse direction map + * @param inverseBidiMap the inverse BidiMap + * @return new bidi map + */ + protected BidiMap<V, K> createBidiMap(final Map<V, K> normalMap, final Map<K, V> reverseMap, + final BidiMap<K, V> inverseBidiMap) { + return new DualLinkedHashBidiMap<V, K>(normalMap, reverseMap, inverseBidiMap); + } + + // Serialization + //----------------------------------------------------------------------- + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + out.writeObject(normalMap); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + normalMap = new LinkedHashMap<K, V>(); + reverseMap = new LinkedHashMap<V, K>(); + @SuppressWarnings("unchecked") // will fail at runtime if stream is incorrect + Map<K, V> map = (Map<K, V>) in.readObject(); + putAll(map); + } +} Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java ------------------------------------------------------------------------------ svn:keywords = Id Revision HeadURL Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMap.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java?rev=1451337&view=auto ============================================================================== --- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java (added) +++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java Thu Feb 28 20:58:51 2013 @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.collections.bidimap; + +import junit.framework.Test; +import org.apache.commons.collections.BulkTest; + +/** + * JUnit tests. + * + * @version $Id $ + */ +public class DualLinkedHashBidiMapTest<K, V> extends AbstractBidiMapTest<K, V> { + + public static Test suite() { + return BulkTest.makeSuite(DualLinkedHashBidiMapTest.class); + } + + public DualLinkedHashBidiMapTest(final String testName) { + super(testName); + } + + /** + * {@inheritDoc} + */ + @Override + public DualLinkedHashBidiMap<K, V> makeObject() { + return new DualLinkedHashBidiMap<K, V>(); + } + + @Override + public String getCompatibilityVersion() { + return "4"; + } + + /** + * Override to prevent infinite recursion of tests. + */ + @Override + public String[] ignoredTests() { + return new String[] { "DualLinkedHashBidiMapTest.bulkTestInverseMap.bulkTestInverseMap" }; + } + +// public void testCreate() throws Exception { +// resetEmpty(); +// writeExternalFormToDisk((Serializable) map, "src/test/resources/data/test/DualLinkedHashBidiMap.emptyCollection.version4.obj"); +// resetFull(); +// writeExternalFormToDisk((Serializable) map, "src/test/resources/data/test/DualLinkedHashBidiMap.fullCollection.version4.obj"); +// } +} Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java ------------------------------------------------------------------------------ svn:keywords = Id Revision HeadURL Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/bidimap/DualLinkedHashBidiMapTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.emptyCollection.version4.obj URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.emptyCollection.version4.obj?rev=1451337&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.emptyCollection.version4.obj ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.fullCollection.version4.obj URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.fullCollection.version4.obj?rev=1451337&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/proper/collections/trunk/src/test/resources/data/test/DualLinkedHashBidiMap.fullCollection.version4.obj ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream