1 // Note to JL: Changed Hashset to List 2 3 namespace Antlr.Runtime.Debug.Misc { 4 using System.Collections.Generic; 5 6 public class DoubleKeyMap<TKey1, TKey2, TValue> { 7 internal IDictionary<TKey1, IDictionary<TKey2, TValue>> data = new Dictionary<TKey1, IDictionary<TKey2, TValue>>(); 8 Put(TKey1 k1, TKey2 k2, TValue v)9 public virtual TValue Put(TKey1 k1, TKey2 k2, TValue v) { 10 IDictionary<TKey2, TValue> data2; 11 data.TryGetValue(k1, out data2); 12 TValue prev = default(TValue); 13 if (data2 == null) { 14 data2 = new Dictionary<TKey2, TValue>(); 15 data[k1] = data2; 16 } else { 17 data2.TryGetValue(k2, out prev); 18 } 19 data2[k2] = v; 20 return prev; 21 } 22 Get(TKey1 k1, TKey2 k2)23 public virtual TValue Get(TKey1 k1, TKey2 k2) { 24 IDictionary<TKey2, TValue> data2; 25 data.TryGetValue(k1, out data2); 26 if (data2 == null) 27 return default(TValue); 28 29 TValue value; 30 data2.TryGetValue(k2, out value); 31 return value; 32 } 33 Get(TKey1 k1)34 public virtual IDictionary<TKey2, TValue> Get(TKey1 k1) { 35 IDictionary<TKey2, TValue> value; 36 data.TryGetValue(k1, out value); 37 return value; 38 } 39 40 /** Get all values associated with primary key */ Values(TKey1 k1)41 public virtual ICollection<TValue> Values(TKey1 k1) { 42 IDictionary<TKey2, TValue> data2; 43 data.TryGetValue(k1, out data2); 44 if (data2 == null) 45 return null; 46 47 return data2.Values; 48 } 49 50 /** get all primary keys */ KeySet()51 public virtual ICollection<TKey1> KeySet() { 52 return data.Keys; 53 } 54 55 /** get all secondary keys associated with a primary key */ KeySet(TKey1 k1)56 public virtual ICollection<TKey2> KeySet(TKey1 k1) { 57 IDictionary<TKey2, TValue> data2; 58 data.TryGetValue(k1, out data2); 59 if (data2 == null) 60 return null; 61 62 return data2.Keys; 63 } 64 Values()65 public virtual ICollection<TValue> Values() { 66 List<TValue> s = new List<TValue>(); 67 foreach (IDictionary<TKey2, TValue> k2 in data.Values) { 68 foreach (TValue v in k2.Values) { 69 s.Add(v); 70 } 71 } 72 return s; 73 } 74 } 75 } 76