1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug.Misc
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using System.Collections.Generic;
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class DoubleKeyMap<TKey1, TKey2, TValue>
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
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        {
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IDictionary<TKey2, TValue> data2;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data.TryGetValue(k1, out data2);
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TValue prev = default(TValue);
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (data2 == null)
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                data2 = new Dictionary<TKey2, TValue>();
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                data[k1]=data2;
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                data2.TryGetValue(k2, out prev);
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data2[k2]= v;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return prev;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual TValue Get(TKey1 k1, TKey2 k2)
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IDictionary<TKey2, TValue> data2;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data.TryGetValue(k1, out data2);
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (data2 == null)
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return default(TValue);
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TValue value;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data2.TryGetValue(k2, out value);
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return value;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual IDictionary<TKey2, TValue> Get(TKey1 k1)
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IDictionary<TKey2, TValue> value;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data.TryGetValue(k1, out value);
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return value;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** Get all values associated with primary key */
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ICollection<TValue> Values(TKey1 k1)
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IDictionary<TKey2, TValue> data2;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data.TryGetValue(k1, out data2);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (data2 == null)
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return data2.Values;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** get all primary keys */
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ICollection<TKey1> KeySet()
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return data.Keys;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** get all secondary keys associated with a primary key */
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ICollection<TKey2> KeySet(TKey1 k1)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            IDictionary<TKey2, TValue> data2;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data.TryGetValue(k1, out data2);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (data2 == null)
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return null;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return data2.Keys;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ICollection<TValue> Values()
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Dictionary<TValue, bool> s = new Dictionary<TValue, bool>();
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            foreach (IDictionary<TKey2, TValue> k2 in data.Values)
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                foreach (TValue v in k2.Values)
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    s[v] = true;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return s.Keys;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
87