package basics.collections;

import java.util.HashMap;
import java.util.Map;
import basics.testing.Units;

public class BiMap<K, V>
{
private Map<K, V> lrmap = new HashMap<K, V>();
private Map<V, K> rlmap = new HashMap<V, K>();

public void add(K key, V value)
{
   lrmap.put(key, value);
   rlmap.put(value, key);
}

public void removeByKey(K key)
{
   V v = lrmap.get(key);
   if(v != null)
   {
      lrmap.remove(key);
      rlmap.remove(v);
   }
}

public void removeByValue(V value)
{
   K k = rlmap.get(value);
   if(k != null)
   {
      rlmap.remove(value);
      lrmap.remove(k);
   }
}

public V getValue(K key)
{
   return lrmap.get(key);
}

public K getKey(V value)
{
   return rlmap.get(value);
}

public void clear()
{
   rlmap.clear();
   lrmap.clear();
}

public int size()
{
   return rlmap.size();
}

public static void unittest()
{
   BiMap<Object, String> m = new BiMap<Object, String>();
   m.add(new Double(1.0), "1-0");
   m.add(new Double(1.1), "1-1");
   m.add(new Double(1.2), "1-2");
   m.add(new Double(2.0), "2-0");
   m.add(new Double(2.1), "2-1");
   Units.assertTrue(m.size() == 5, "size must be 5");
   Units.assertTrue(m.getKey("1-0").equals(1.0D), "wrong key returned");
   Units.assertTrue(m.getKey("2-1").equals(2.1D), "wrong key returned");
   Units.assertTrue(m.getValue(1.0D).equals("1-0"), "wrong value returned");
   Units.assertTrue(m.getValue(2.1D).equals("2-1"), "wrong value returned");
   m.removeByValue("1-2");
   Units.assertNull(m.getKey("1-2"), "deleted value still there");
   m.removeByKey(2.0D);
   Units.assertNull(m.getValue(2.0D), "deleted key still there");
   Units.assertTrue(m.size() == 3, "size must be 3 after deletions");
   m.clear();
   Units.assertTrue(m.size() == 0, "size must be 0 after clear");
}
}
