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