Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HashLookup.cs
Go to the documentation of this file.
3
5
6internal sealed class HashLookup<TKey, TValue>
7{
8 internal struct Slot
9 {
10 internal int hashCode;
11
12 internal int next;
13
14 internal TKey key;
15
16 internal TValue value;
17 }
18
19 private int[] buckets;
20
21 private Slot[] slots;
22
23 private int count;
24
25 private int freeList;
26
28
29 internal TValue this[TKey key]
30 {
31 set
32 {
33 TValue value2 = value;
34 Find(key, add: false, set: true, ref value2);
35 }
36 }
37
38 internal int Count => count;
39
41
43 {
44 this.comparer = comparer;
45 buckets = new int[7];
46 slots = new Slot[7];
47 freeList = -1;
48 }
49
50 internal bool Add(TKey key, TValue value)
51 {
52 return !Find(key, add: true, set: false, ref value);
53 }
54
55 internal bool TryGetValue(TKey key, [MaybeNullWhen(false)][AllowNull] ref TValue value)
56 {
57 return Find(key, add: false, set: false, ref value);
58 }
59
60 private int GetKeyHashCode(TKey key)
61 {
62 return 0x7FFFFFFF & ((key != null) ? (comparer?.GetHashCode(key) ?? key.GetHashCode()) : 0);
63 }
64
65 private bool AreKeysEqual(TKey key1, TKey key2)
66 {
67 if (comparer != null)
68 {
69 return comparer.Equals(key1, key2);
70 }
71 if (key1 != null || key2 != null)
72 {
73 return key1?.Equals(key2) ?? false;
74 }
75 return true;
76 }
77
78 private bool Find(TKey key, bool add, bool set, [MaybeNullWhen(false)] ref TValue value)
79 {
81 for (int num = buckets[keyHashCode % buckets.Length] - 1; num >= 0; num = slots[num].next)
82 {
83 if (slots[num].hashCode == keyHashCode && AreKeysEqual(slots[num].key, key))
84 {
85 if (set)
86 {
87 slots[num].value = value;
88 return true;
89 }
90 value = slots[num].value;
91 return true;
92 }
93 }
94 if (add)
95 {
96 int num2;
97 if (freeList >= 0)
98 {
99 num2 = freeList;
101 }
102 else
103 {
104 if (count == slots.Length)
105 {
106 Resize();
107 }
108 num2 = count;
109 count++;
110 }
111 int num3 = keyHashCode % buckets.Length;
113 slots[num2].key = key;
115 slots[num2].next = buckets[num3] - 1;
116 buckets[num3] = num2 + 1;
117 }
118 return false;
119 }
120
121 private void Resize()
122 {
123 int num = checked(count * 2 + 1);
124 int[] array = new int[num];
125 Slot[] array2 = new Slot[num];
127 for (int i = 0; i < count; i++)
128 {
129 int num2 = array2[i].hashCode % num;
130 array2[i].next = array[num2] - 1;
131 array[num2] = i + 1;
132 }
133 buckets = array;
134 slots = array2;
135 }
136}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
bool Find(TKey key, bool add, bool set, [MaybeNullWhen(false)] ref TValue value)
Definition HashLookup.cs:78
bool AreKeysEqual(TKey key1, TKey key2)
Definition HashLookup.cs:65
bool TryGetValue(TKey key, [MaybeNullWhen(false)][AllowNull] ref TValue value)
Definition HashLookup.cs:55
readonly IEqualityComparer< TKey > comparer
Definition HashLookup.cs:27
bool Add(TKey key, TValue value)
Definition HashLookup.cs:50
HashLookup(IEqualityComparer< TKey > comparer)
Definition HashLookup.cs:42