// no null keys or null values
sclass BijectiveMap extends CompactAbstractMap {
new Map forward;
new Map backward;
@Override public void put(A a, B b) {
assertNotNull(a);
assertNotNull(b);
A oldKey = backward.get(b);
if (eq(oldKey, a))
ret; // nothing to do
if (oldKey != null)
forward.remove(oldKey); // remove old mapping
// add/overwrite new mapping
forward.put(a, b);
backward.put(b, a);
}
@Override public void remove(O a) {
B b = forward.get(a);
if (b == null)
ret; // nothing to do
forward.remove(a);
backward.remove(b);
}
@Override B get(O a) {
ret forward.get(a);
}
A inverseGet(B b) {
ret backward.get(b);
}
public Set keySet() { ret immutableSet(forward.keySet()); }
public Set valueSet() { ret immutableSet(backward.keySet()); }
public int size() { ret forward.size(); }
Map forwardMap() { ret immutableMap(forward); }
Map backwardMap() { ret immutableMap(backward); }
}