- public void put(IntegerMappable k1, IntegerMappable k2, V v) { hm.put(key(k1, k2), v); }
- public V get(IntegerMappable k1, IntegerMappable k2) { return hm.get(key(k1, k2)); }
- public void remove(IntegerMappable k1, IntegerMappable k2) { hm.remove(key(k1, k2)); }
- public Iterable<V> values() { return hm.values(); }
- public int size() { return hm.size(); }
- public void toArray(V[] v) { hm.values().toArray(v); }
- public Iterator<V> iterator() { return hm.values().iterator(); }
+ public V get(int k1, int k2) {
+ int hash = k1 ^ k2;
+ int dest = Math.abs(hash) % vals.length;
+ int odest = dest;
+ int tries = 1;
+ boolean plus = true;
+ while (vals[dest]!=null) {
+ int hk1 = keys1[dest];
+ int hk2 = keys2[dest];
+ if (k1 == hk1 && k2 == hk2 && vals[dest]!=placeholder) return vals[dest];
+ dest = Math.abs((odest + (plus ? 1 : -1 ) * tries * tries) % vals.length);
+ if (plus) tries++;
+ plus = !plus;
+ }
+ return null;
+ }
+
+ public void put(int k1, int k2, Object v) { put_(k1, k2, v); }
+ private void put_(int k1, int k2, Object v) {
+ if (usedslots * loadFactor > vals.length) rehash();
+ int hash = k1 ^ k2;
+ int dest = Math.abs(hash) % vals.length;
+ int odest = dest;
+ boolean plus = true;
+ int tries = 1;
+ while (true) {
+ int hk1 = keys1[dest];
+ int hk2 = keys2[dest];
+ if (vals[dest]==null || (k1==hk1 && k2==hk2 && vals[dest]!=placeholder)) {
+ if (v == null) {
+ if (vals[dest]==null) return;
+ v = placeholder;
+ size--;
+ } else {
+ size++;
+ usedslots++;
+ }
+ break;
+ }
+
+ dest = Math.abs((odest + (plus ? 1 : -1 ) * tries * tries) % vals.length);
+ if (plus) tries++;
+ plus = !plus;
+ }
+
+ keys1[dest] = k1;
+ keys2[dest] = k2;
+ ((Object[])vals)[dest] = v;
+ }
+
+ private class IntPairMapIterator implements Iterator<V> {
+ private int iterator = -1;
+ private int found = 0;
+
+ public void remove() { throw new Error(); }
+ public boolean hasNext() { return found < size; }
+
+ public V next() {
+ if (!hasNext()) return null;
+ V o = null;
+ while (o==null || o==placeholder) o = vals[++iterator];
+ found++;
+ return o;
+ }
+ }
+ public Iterator<V> iterator() { return new IntPairMapIterator(); }
+
+ public void put(IntegerMappable k1, IntegerMappable k2, V v) {
+ put((k1==null?0:k1.toInt()), (k2==null?0:k2.toInt()), v);
+ }
+ public V get(IntegerMappable k1, IntegerMappable k2) {
+ return get((k1==null?0:k1.toInt()), (k2==null?0:k2.toInt()));
+ }
+ public void remove(IntegerMappable k1, IntegerMappable k2) {
+ remove((k1==null?0:k1.toInt()), (k2==null?0:k2.toInt()));
+ }
+ //public Iterable<V> values() { return this; }
+ //public void toArray(V[] v) { hm.values().toArray(v); }
+ //public Iterator<V> iterator() { return hm.values().iterator(); }