Client LuaCsForBarotrauma
LinkedPairSet.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 
5 namespace Barotrauma
6 {
7  public class LinkedPairSet<T1, T2> : IEnumerable<(T1, T2)>
8  {
9  private readonly Dictionary<T1, T2> t1ToT2 = new Dictionary<T1, T2>();
10  private readonly Dictionary<T2, T1> t2ToT1 = new Dictionary<T2, T1>();
11 
12  public bool Contains(T1 t1)
13  {
14  return t1ToT2.ContainsKey(t1);
15  }
16 
17  public bool Contains(T2 t2)
18  {
19  return t2ToT1.ContainsKey(t2);
20  }
21 
22  public T2 this[T1 t1]
23  {
24  get { return t1ToT2[t1]; }
25  set
26  {
27  T2 prevT2 = t1ToT2[t1];
28  t2ToT1.Remove(prevT2); t2ToT1.Add(value, t1);
29  t1ToT2[t1] = value;
30  }
31  }
32 
33  public T1 this[T2 t2]
34  {
35  get { return t2ToT1[t2]; }
36  set
37  {
38  T1 prevT1 = t2ToT1[t2];
39  t1ToT2.Remove(prevT1); t1ToT2.Add(value, t2);
40  t2ToT1[t2] = value;
41  }
42  }
43 
44  public void Add(T1 t1, T2 t2)
45  {
46  if (Contains(t1)) { throw new ArgumentException($"{GetType().Name} already contains {t1}"); }
47  if (Contains(t2)) { throw new ArgumentException($"{GetType().Name} already contains {t2}"); }
48  t1ToT2.Add(t1, t2);
49  t2ToT1.Add(t2, t1);
50  }
51 
52  public void Remove(T1 t1)
53  {
54  T2 t2 = t1ToT2[t1];
55  t1ToT2.Remove(t1);
56  t2ToT1.Remove(t2);
57  }
58 
59  public void Remove(T2 t2)
60  {
61  T1 t1 = t2ToT1[t2];
62  t1ToT2.Remove(t1);
63  t2ToT1.Remove(t2);
64  }
65 
66  public IEnumerator<(T1, T2)> GetEnumerator()
67  {
68  foreach (var t1 in t1ToT2.Keys)
69  {
70  yield return (t1, t1ToT2[t1]);
71  }
72  }
73 
74  IEnumerator IEnumerable.GetEnumerator()
75  {
76  return GetEnumerator();
77  }
78  }
79 }
void Add(T1 t1, T2 t2)
IEnumerator<(T1, T2)> GetEnumerator()