Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
NameTable.cs
Go to the documentation of this file.
1namespace System.Xml;
2
3public class NameTable : XmlNameTable
4{
5 private sealed class Entry
6 {
7 internal string str;
8
9 internal int hashCode;
10
11 internal Entry next;
12
13 internal Entry(string str, int hashCode, Entry next)
14 {
15 this.str = str;
18 }
19 }
20
21 private Entry[] _entries;
22
23 private int _count;
24
25 private int _mask;
26
27 public NameTable()
28 {
29 _mask = 31;
30 _entries = new Entry[_mask + 1];
31 }
32
33 public override string Add(string key)
34 {
35 if (key == null)
36 {
37 throw new ArgumentNullException("key");
38 }
39 if (key.Length == 0)
40 {
41 return string.Empty;
42 }
43 int num = ComputeHash32(key);
44 for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.next)
45 {
46 if (entry.hashCode == num && entry.str.Equals(key))
47 {
48 return entry.str;
49 }
50 }
51 return AddEntry(key, num);
52 }
53
54 public override string Add(char[] key, int start, int len)
55 {
56 if (len == 0)
57 {
58 return string.Empty;
59 }
60 if (start >= key.Length || start < 0 || (long)start + (long)len > key.Length)
61 {
62 throw new IndexOutOfRangeException();
63 }
64 if (len < 0)
65 {
66 throw new ArgumentOutOfRangeException("len");
67 }
68 int hashCode = string.GetHashCode(key.AsSpan(start, len));
69 for (Entry entry = _entries[hashCode & _mask]; entry != null; entry = entry.next)
70 {
71 if (entry.hashCode == hashCode && entry.str.AsSpan().SequenceEqual(key.AsSpan(start, len)))
72 {
73 return entry.str;
74 }
75 }
76 return AddEntry(new string(key, start, len), hashCode);
77 }
78
79 public override string? Get(string value)
80 {
81 if (value == null)
82 {
83 throw new ArgumentNullException("value");
84 }
85 if (value.Length == 0)
86 {
87 return string.Empty;
88 }
89 int num = ComputeHash32(value);
90 for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.next)
91 {
92 if (entry.hashCode == num && entry.str.Equals(value))
93 {
94 return entry.str;
95 }
96 }
97 return null;
98 }
99
100 public override string? Get(char[] key, int start, int len)
101 {
102 if (len == 0)
103 {
104 return string.Empty;
105 }
106 if (start >= key.Length || start < 0 || (long)start + (long)len > key.Length)
107 {
108 throw new IndexOutOfRangeException();
109 }
110 if (len < 0)
111 {
112 return null;
113 }
114 int hashCode = string.GetHashCode(key.AsSpan(start, len));
115 for (Entry entry = _entries[hashCode & _mask]; entry != null; entry = entry.next)
116 {
117 if (entry.hashCode == hashCode && entry.str.AsSpan().SequenceEqual(key.AsSpan(start, len)))
118 {
119 return entry.str;
120 }
121 }
122 return null;
123 }
124
125 internal string GetOrAddEntry(string str, int hashCode)
126 {
127 for (Entry entry = _entries[hashCode & _mask]; entry != null; entry = entry.next)
128 {
129 if (entry.hashCode == hashCode && entry.str.Equals(str))
130 {
131 return entry.str;
132 }
133 }
134 return AddEntry(str, hashCode);
135 }
136
137 internal static int ComputeHash32(string key)
138 {
139 return string.GetHashCode(key.AsSpan());
140 }
141
142 private string AddEntry(string str, int hashCode)
143 {
144 int num = hashCode & _mask;
145 Entry entry = new Entry(str, hashCode, _entries[num]);
146 _entries[num] = entry;
147 if (_count++ == _mask)
148 {
149 Grow();
150 }
151 return entry.str;
152 }
153
154 private void Grow()
155 {
156 int num = _mask * 2 + 1;
158 Entry[] array = new Entry[num + 1];
159 for (int i = 0; i < entries.Length; i++)
160 {
161 Entry entry = entries[i];
162 while (entry != null)
163 {
164 int num2 = entry.hashCode & num;
165 Entry next = entry.next;
167 array[num2] = entry;
168 entry = next;
169 }
170 }
171 _entries = array;
172 _mask = num;
173 }
174}
Entry(string str, int hashCode, Entry next)
Definition NameTable.cs:13
string GetOrAddEntry(string str, int hashCode)
Definition NameTable.cs:125
static int ComputeHash32(string key)
Definition NameTable.cs:137
override? string Get(string value)
Definition NameTable.cs:79
override string Add(string key)
Definition NameTable.cs:33
override string Add(char[] key, int start, int len)
Definition NameTable.cs:54
override? string Get(char[] key, int start, int len)
Definition NameTable.cs:100
string AddEntry(string str, int hashCode)
Definition NameTable.cs:142