00001 package org.antlr.runtime.misc;
00002
00003 import java.util.*;
00004
00009 public class DoubleKeyMap<Key1, Key2, Value> {
00010 Map<Key1, Map<Key2, Value>> data = new LinkedHashMap<Key1, Map<Key2, Value>>();
00011
00012 public Value put(Key1 k1, Key2 k2, Value v) {
00013 Map<Key2, Value> data2 = data.get(k1);
00014 Value prev = null;
00015 if ( data2==null ) {
00016 data2 = new LinkedHashMap<Key2, Value>();
00017 data.put(k1, data2);
00018 }
00019 else {
00020 prev = data2.get(k2);
00021 }
00022 data2.put(k2, v);
00023 return prev;
00024 }
00025
00026 public Value get(Key1 k1, Key2 k2) {
00027 Map<Key2, Value> data2 = data.get(k1);
00028 if ( data2==null ) return null;
00029 return data2.get(k2);
00030 }
00031
00032 public Map<Key2, Value> get(Key1 k1) { return data.get(k1); }
00033
00035 public Collection<Value> values(Key1 k1) {
00036 Map<Key2, Value> data2 = data.get(k1);
00037 if ( data2==null ) return null;
00038 return data2.values();
00039 }
00040
00042 public Set<Key1> keySet() {
00043 return data.keySet();
00044 }
00045
00047 public Set<Key2> keySet(Key1 k1) {
00048 Map<Key2, Value> data2 = data.get(k1);
00049 if ( data2==null ) return null;
00050 return data2.keySet();
00051 }
00052
00053 public Collection<Value> values() {
00054 Set<Value> s = new HashSet<Value>();
00055 for (Map<Key2, Value> k2 : data.values()) {
00056 for (Value v : k2.values()) {
00057 s.add(v);
00058 }
00059 }
00060 return s;
00061 }
00062 }