1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Note to JL: Changed Hashset to List 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug.Misc { 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using System.Collections.Generic; 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class DoubleKeyMap<TKey1, TKey2, TValue> { 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internal IDictionary<TKey1, IDictionary<TKey2, TValue>> data = new Dictionary<TKey1, IDictionary<TKey2, TValue>>(); 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual TValue Put(TKey1 k1, TKey2 k2, TValue v) { 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey2, TValue> data2; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data.TryGetValue(k1, out data2); 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TValue prev = default(TValue); 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data2 == null) { 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data2 = new Dictionary<TKey2, TValue>(); 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data[k1] = data2; 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data2.TryGetValue(k2, out prev); 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data2[k2] = v; 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return prev; 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual TValue Get(TKey1 k1, TKey2 k2) { 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey2, TValue> data2; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data.TryGetValue(k1, out data2); 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data2 == null) 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return default(TValue); 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TValue value; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data2.TryGetValue(k2, out value); 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return value; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual IDictionary<TKey2, TValue> Get(TKey1 k1) { 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey2, TValue> value; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data.TryGetValue(k1, out value); 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return value; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Get all values associated with primary key */ 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ICollection<TValue> Values(TKey1 k1) { 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey2, TValue> data2; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data.TryGetValue(k1, out data2); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data2 == null) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return data2.Values; 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** get all primary keys */ 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ICollection<TKey1> KeySet() { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return data.Keys; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** get all secondary keys associated with a primary key */ 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ICollection<TKey2> KeySet(TKey1 k1) { 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey2, TValue> data2; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data.TryGetValue(k1, out data2); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data2 == null) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return data2.Keys; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual ICollection<TValue> Values() { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List<TValue> s = new List<TValue>(); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach (IDictionary<TKey2, TValue> k2 in data.Values) { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach (TValue v in k2.Values) { 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s.Add(v); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return s; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 76