All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.collections.bidimap.DualBidiMap Maven / Gradle / Ivy

package net.sf.javagimmicks.collections.bidimap;

import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class DualBidiMap extends AbstractMap implements BidiMap
{
   protected final Map _forwardMap;
   protected final Map _reverseMap;
   
   DualBidiMap(Map forwardMap, Map reverseMap)
   {
      _forwardMap = forwardMap;
      _reverseMap = reverseMap;
   }

   @Override
   public Set> entrySet()
   {
      return new DualBidiEntrySet(getForwardMap().entrySet());
   }
   
   @Override
   public V put(K key, V value)
   {
      checkValue(value);

      V oldValue = getForwardMap().put(key, value);
      K oldKey = getReverseMap().put(value, key);
      
      getForwardMap().remove(oldKey);
      getReverseMap().remove(oldValue);
      
      return oldValue;
   }

   @Override
   public V remove(Object key)
   {
      V value = getForwardMap().remove(key);
      getReverseMap().remove(value);
      
      return value;
   }

   public BidiMap inverseBidiMap()
   {
      return new InverseDualBidiMap(getReverseMap(), getForwardMap());
   }
   
   @Override
   public V get(Object key)
   {
      return getForwardMap().get(key);
   }
   
   public K getKey(V value)
   {
      return getReverseMap().get(value);
   }

   protected Map getForwardMap()
   {
      return _forwardMap;
   }
   
   protected Map getReverseMap()
   {
      return _reverseMap;
   }
   
   protected static  void checkValue(V value)
   {
      if(value == null)
      {
         throw new IllegalArgumentException("Null values not allowed in BidiMaps!");
      }
   }

   protected class DualBidiEntry implements Entry
   {
      protected final Entry internalEntry;

      protected DualBidiEntry(Entry internalEntry)
      {
         this.internalEntry = internalEntry;
      }

      public K getKey()
      {
         return internalEntry.getKey();
      }

      public V getValue()
      {
         return internalEntry.getValue();
      }

      public V setValue(V value)
      {
         return put(getKey(), value);
      }
   }

   protected class DualBidiEntryIterator implements Iterator>
   {
      protected final Iterator> internalIterator;
      protected Entry _lastEntry;

      protected DualBidiEntryIterator(Iterator> internalIterator)
      {
         this.internalIterator = internalIterator;
      }

      public boolean hasNext()
      {
         return internalIterator.hasNext();
      }

      public Entry next()
      {
         _lastEntry = internalIterator.next();
         return new DualBidiEntry(_lastEntry);
      }

      public void remove()
      {
         internalIterator.remove();
         _reverseMap.remove(_lastEntry.getValue());
      }
   }

   protected class DualBidiEntrySet extends AbstractSet>
   {
      private final Set> internalEntrySet;

      protected DualBidiEntrySet(Set> internalEntrySet)
      {
         this.internalEntrySet = internalEntrySet;
      }

      @Override
      public Iterator> iterator()
      {
         return new DualBidiEntryIterator(internalEntrySet.iterator());
      }

      @Override
      public int size()
      {
         return internalEntrySet.size();
      }
   }

   protected class InverseDualBidiMap extends DualBidiMap
   {
      protected InverseDualBidiMap(Map reverseMap, Map forwardMap)
      {
         super(reverseMap, forwardMap);
      }

      @Override
      public BidiMap inverseBidiMap()
      {
         return DualBidiMap.this;
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy