Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BitSet.cs
Go to the documentation of this file.
2
3namespace System.Xml.Schema;
4
5internal sealed class BitSet
6{
7 private readonly int _count;
8
9 private uint[] _bits;
10
11 public int Count => _count;
12
13 public bool this[int index] => Get(index);
14
15 public bool IsEmpty
16 {
17 get
18 {
19 uint num = 0u;
20 for (int i = 0; i < _bits.Length; i++)
21 {
22 num |= _bits[i];
23 }
24 return num == 0;
25 }
26 }
27
28 private BitSet(int count, uint[] bits)
29 {
30 _count = count;
31 _bits = bits;
32 }
33
34 public BitSet(int count)
35 {
36 _count = count;
37 _bits = new uint[Subscript(count + 31)];
38 }
39
40 public void Clear()
41 {
42 int num = _bits.Length;
43 int num2 = num;
44 while (num2-- > 0)
45 {
46 _bits[num2] = 0u;
47 }
48 }
49
50 public void Set(int index)
51 {
52 int num = Subscript(index);
53 EnsureLength(num + 1);
54 _bits[num] |= (uint)(1 << index);
55 }
56
57 public bool Get(int index)
58 {
59 bool result = false;
60 if (index < _count)
61 {
62 int num = Subscript(index);
63 result = (_bits[num] & (1 << index)) != 0;
64 }
65 return result;
66 }
67
68 public int NextSet(int startFrom)
69 {
70 int num = startFrom + 1;
71 if (num == _count)
72 {
73 return -1;
74 }
75 int num2 = Subscript(num);
76 num &= 0x1F;
77 uint num3;
78 for (num3 = _bits[num2] >> num; num3 == 0; num3 = _bits[num2])
79 {
80 if (++num2 == _bits.Length)
81 {
82 return -1;
83 }
84 num = 0;
85 }
86 while ((num3 & 1) == 0)
87 {
88 num3 >>= 1;
89 num++;
90 }
91 return (num2 << 5) + num;
92 }
93
94 public void And(BitSet other)
95 {
96 if (this != other)
97 {
98 int num = _bits.Length;
99 int num2 = other._bits.Length;
100 int i = ((num > num2) ? num2 : num);
101 int num3 = i;
102 while (num3-- > 0)
103 {
104 _bits[num3] &= other._bits[num3];
105 }
106 for (; i < num; i++)
107 {
108 _bits[i] = 0u;
109 }
110 }
111 }
112
113 public void Or(BitSet other)
114 {
115 if (this != other)
116 {
117 int num = other._bits.Length;
118 EnsureLength(num);
119 int num2 = num;
120 while (num2-- > 0)
121 {
122 _bits[num2] |= other._bits[num2];
123 }
124 }
125 }
126
127 public override int GetHashCode()
128 {
129 int num = 1234;
130 int num2 = _bits.Length;
131 while (--num2 >= 0)
132 {
133 num ^= (int)_bits[num2] * (num2 + 1);
134 }
135 return num ^ num;
136 }
137
138 public override bool Equals([NotNullWhen(true)] object obj)
139 {
140 if (obj != null)
141 {
142 if (this == obj)
143 {
144 return true;
145 }
147 int num = _bits.Length;
148 int num2 = bitSet._bits.Length;
149 int num3 = ((num > num2) ? num2 : num);
150 int num4 = num3;
151 while (num4-- > 0)
152 {
153 if (_bits[num4] != bitSet._bits[num4])
154 {
155 return false;
156 }
157 }
158 if (num > num3)
159 {
160 int num5 = num;
161 while (num5-- > num3)
162 {
163 if (_bits[num5] != 0)
164 {
165 return false;
166 }
167 }
168 }
169 else
170 {
171 int num6 = num2;
172 while (num6-- > num3)
173 {
174 if (bitSet._bits[num6] != 0)
175 {
176 return false;
177 }
178 }
179 }
180 return true;
181 }
182 return false;
183 }
184
185 public BitSet Clone()
186 {
187 return new BitSet(_count, (uint[])_bits.Clone());
188 }
189
191 {
192 int num = Math.Min(_bits.Length, other._bits.Length);
193 while (--num >= 0)
194 {
195 if ((_bits[num] & other._bits[num]) != 0)
196 {
197 return true;
198 }
199 }
200 return false;
201 }
202
203 private int Subscript(int bitIndex)
204 {
205 return bitIndex >> 5;
206 }
207
209 {
210 if (nRequiredLength > _bits.Length)
211 {
212 int num = 2 * _bits.Length;
213 if (num < nRequiredLength)
214 {
215 num = nRequiredLength;
216 }
217 uint[] array = new uint[num];
218 Array.Copy(_bits, array, _bits.Length);
219 _bits = array;
220 }
221 }
222}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
static byte Min(byte val1, byte val2)
Definition Math.cs:912
int NextSet(int startFrom)
Definition BitSet.cs:68
readonly int _count
Definition BitSet.cs:7
void Or(BitSet other)
Definition BitSet.cs:113
bool Intersects(BitSet other)
Definition BitSet.cs:190
void EnsureLength(int nRequiredLength)
Definition BitSet.cs:208
int Subscript(int bitIndex)
Definition BitSet.cs:203
override bool Equals([NotNullWhen(true)] object obj)
Definition BitSet.cs:138
bool Get(int index)
Definition BitSet.cs:57
override int GetHashCode()
Definition BitSet.cs:127
void Set(int index)
Definition BitSet.cs:50
void And(BitSet other)
Definition BitSet.cs:94
BitSet(int count, uint[] bits)
Definition BitSet.cs:28