DoubleKeyMap.cs revision 324c4644fee44b9898524c09511bd33c3f12e2df
1// Note to JL: Changed Hashset to List
2
3namespace 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
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
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
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 */
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 */
51        public virtual ICollection<TKey1> KeySet() {
52            return data.Keys;
53        }
54
55        /** get all secondary keys associated with a primary key */
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
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