13447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinpackage org.antlr.runtime.misc; 23447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 33447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.util.*; 43447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 53447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein/** Sometimes we need to map a key to a value but key is two pieces of data. 63447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * This nested hash table saves creating a single key each time we access 73447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * map; avoids mem creation. 83447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 93447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinpublic class DoubleKeyMap<Key1, Key2, Value> { 103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Map<Key1, Map<Key2, Value>> data = new LinkedHashMap<Key1, Map<Key2, Value>>(); 113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Value put(Key1 k1, Key2 k2, Value v) { 133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Map<Key2, Value> data2 = data.get(k1); 143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Value prev = null; 153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( data2==null ) { 163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein data2 = new LinkedHashMap<Key2, Value>(); 173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein data.put(k1, data2); 183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein else { 203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein prev = data2.get(k2); 213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein data2.put(k2, v); 233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return prev; 243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Value get(Key1 k1, Key2 k2) { 273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Map<Key2, Value> data2 = data.get(k1); 283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( data2==null ) return null; 293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return data2.get(k2); 303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 323447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Map<Key2, Value> get(Key1 k1) { return data.get(k1); } 333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 343447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Get all values associated with primary key */ 353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Collection<Value> values(Key1 k1) { 363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Map<Key2, Value> data2 = data.get(k1); 373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( data2==null ) return null; 383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return data2.values(); 393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** get all primary keys */ 423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Set<Key1> keySet() { 433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return data.keySet(); 443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** get all secondary keys associated with a primary key */ 473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Set<Key2> keySet(Key1 k1) { 483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Map<Key2, Value> data2 = data.get(k1); 493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( data2==null ) return null; 503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return data2.keySet(); 513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Collection<Value> values() { 543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Set<Value> s = new HashSet<Value>(); 553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein for (Map<Key2, Value> k2 : data.values()) { 563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein for (Value v : k2.values()) { 573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein s.add(v); 583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return s; 613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein} 63