A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections;
3using System.Collections.Generic;
4
5namespace UnityEditor.ShaderGraph.Drawing
6{
7 sealed class IndexSet : ICollection<int>
8 {
9 List<uint> m_Masks = new List<uint>();
10
11 public IndexSet() { }
12
13 public IndexSet(IEnumerable<int> indices)
14 {
15 foreach (var index in indices)
16 Add(index);
17 }
18
19 public IEnumerator<int> GetEnumerator()
20 {
21 for (var i = 0; i < m_Masks.Count; i++)
22 {
23 var mask = m_Masks[i];
24 if (mask == 0)
25 continue;
26 for (var j = 0; j < 32; j++)
27 {
28 if ((mask & (1 << j)) > 0)
29 yield return i * 32 + j;
30 }
31 }
32 }
33
34 IEnumerator IEnumerable.GetEnumerator()
35 {
36 return GetEnumerator();
37 }
38
39 public void UnionWith(IEnumerable<int> other)
40 {
41 var otherSet = other as IndexSet;
42 if (otherSet != null)
43 {
44 UnionWith(otherSet);
45 }
46 else
47 {
48 foreach (var index in other)
49 Add(index);
50 }
51 }
52
53 public void UnionWith(IndexSet other)
54 {
55 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
56 m_Masks[i] |= other.m_Masks[i];
57 for (var i = m_Masks.Count; i < other.m_Masks.Count; i++)
58 m_Masks.Add(other.m_Masks[i]);
59 }
60
61 public void IntersectWith(IEnumerable<int> other)
62 {
63 IntersectWith(other as IndexSet ?? new IndexSet(other));
64 }
65
66 public void IntersectWith(IndexSet other)
67 {
68 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
69 m_Masks[i] &= other.m_Masks[i];
70 }
71
72 public void ExceptWith(IEnumerable<int> other)
73 {
74 var otherSet = other as IndexSet;
75 if (otherSet != null)
76 {
77 ExceptWith(otherSet);
78 }
79 else
80 {
81 foreach (var index in other)
82 Remove(index);
83 }
84 }
85
86 public void ExceptWith(IndexSet other)
87 {
88 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
89 m_Masks[i] &= ~other.m_Masks[i];
90 }
91
92 public void SymmetricExceptWith(IEnumerable<int> other)
93 {
94 SymmetricExceptWith(other as IndexSet ?? new IndexSet(other));
95 }
96
97 public void SymmetricExceptWith(IndexSet other)
98 {
99 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
100 m_Masks[i] ^= other.m_Masks[i];
101 }
102
103 public bool IsSubsetOf(IEnumerable<int> other)
104 {
105 return IsSubsetOf(other as IndexSet ?? new IndexSet(other));
106 }
107
108 public bool IsSubsetOf(IndexSet other)
109 {
110 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
111 {
112 var mask = m_Masks[i];
113 var otherMask = other.m_Masks[i];
114 if ((mask & otherMask) != mask)
115 return false;
116 }
117
118 for (var i = other.m_Masks.Count; i < m_Masks.Count; i++)
119 {
120 if (m_Masks[i] > 0)
121 return false;
122 }
123
124 return true;
125 }
126
127 public bool IsSupersetOf(IEnumerable<int> other)
128 {
129 return IsSupersetOf(other as IndexSet ?? new IndexSet(other));
130 }
131
132 public bool IsSupersetOf(IndexSet other)
133 {
134 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
135 {
136 var otherMask = other.m_Masks[i];
137 var mask = m_Masks[i];
138 if ((otherMask & mask) != otherMask)
139 return false;
140 }
141
142 for (var i = m_Masks.Count; i < other.m_Masks.Count; i++)
143 {
144 if (other.m_Masks[i] > 0)
145 return false;
146 }
147
148 return true;
149 }
150
151 public bool IsProperSupersetOf(IEnumerable<int> other)
152 {
153 return IsProperSupersetOf(other as IndexSet ?? new IndexSet(other));
154 }
155
156 public bool IsProperSupersetOf(IndexSet other)
157 {
158 var isProper = false;
159
160 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
161 {
162 var mask = m_Masks[i];
163 var otherMask = other.m_Masks[i];
164 if ((otherMask & mask) != otherMask)
165 return false;
166 if ((~otherMask & mask) > 0)
167 isProper = true;
168 }
169
170 for (var i = m_Masks.Count; i < other.m_Masks.Count; i++)
171 {
172 if (other.m_Masks[i] > 0)
173 return false;
174 }
175
176 if (!isProper)
177 {
178 for (var i = other.m_Masks.Count; i < m_Masks.Count; i++)
179 {
180 if (m_Masks[i] > 0)
181 return true;
182 }
183 }
184
185 return isProper;
186 }
187
188 public bool IsProperSubsetOf(IEnumerable<int> other)
189 {
190 return IsProperSubsetOf(other as IndexSet ?? new IndexSet(other));
191 }
192
193 public bool IsProperSubsetOf(IndexSet other)
194 {
195 var isProper = false;
196
197 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
198 {
199 var mask = m_Masks[i];
200 var otherMask = other.m_Masks[i];
201 if ((mask & otherMask) != mask)
202 return false;
203 if ((~mask & otherMask) > 0)
204 isProper = true;
205 }
206
207 for (var i = other.m_Masks.Count; i < m_Masks.Count; i++)
208 {
209 if (m_Masks[i] > 0)
210 return false;
211 }
212
213 if (!isProper)
214 {
215 for (var i = m_Masks.Count; i < other.m_Masks.Count; i++)
216 {
217 if (other.m_Masks[i] > 0)
218 return true;
219 }
220 }
221
222 return isProper;
223 }
224
225 public bool Overlaps(IEnumerable<int> other)
226 {
227 var otherSet = other as IndexSet;
228 if (otherSet != null)
229 return Overlaps(otherSet);
230
231 foreach (var index in other)
232 {
233 if (Contains(index))
234 return true;
235 }
236
237 return false;
238 }
239
240 public bool Overlaps(IndexSet other)
241 {
242 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
243 {
244 if ((m_Masks[i] & other.m_Masks[i]) > 0)
245 return true;
246 }
247 return false;
248 }
249
250 public bool SetEquals(IEnumerable<int> other)
251 {
252 var otherSet = other as IndexSet;
253 if (otherSet != null)
254 return SetEquals(otherSet);
255
256 foreach (var index in other)
257 {
258 if (!Contains(index))
259 return false;
260 }
261 return true;
262 }
263
264 public bool SetEquals(IndexSet other)
265 {
266 for (var i = 0; i < Math.Min(m_Masks.Count, other.m_Masks.Count); i++)
267 {
268 if (m_Masks[i] != other.m_Masks[i])
269 return false;
270 }
271
272 for (var i = other.m_Masks.Count; i < m_Masks.Count; i++)
273 {
274 if (m_Masks[i] > 0)
275 return false;
276 }
277
278 for (var i = m_Masks.Count; i < other.m_Masks.Count; i++)
279 {
280 if (other.m_Masks[i] > 0)
281 return false;
282 }
283 return true;
284 }
285
286 public bool Add(int index)
287 {
288 var maskIndex = index >> 5;
289 var bitIndex = index & 31;
290
291 for (var i = m_Masks.Count; i <= maskIndex; i++)
292 m_Masks.Add(0);
293
294 var mask = (uint)1 << bitIndex;
295 var isNew = (m_Masks[maskIndex] & mask) == 0;
296 m_Masks[maskIndex] |= mask;
297 return isNew;
298 }
299
300 void ICollection<int>.Add(int index)
301 {
302 Add(index);
303 }
304
305 public void Clear()
306 {
307 m_Masks.Clear();
308 }
309
310 public bool Contains(int index)
311 {
312 var maskIndex = index >> 5;
313 var bitIndex = index & 31;
314 return maskIndex < m_Masks.Count && (m_Masks[maskIndex] & ((uint)1 << bitIndex)) > 0;
315 }
316
317 public void CopyTo(int[] array, int arrayIndex)
318 {
319 throw new NotImplementedException();
320 }
321
322 public bool Remove(int index)
323 {
324 var maskIndex = index >> 5;
325 var bitIndex = index & 31;
326 if (maskIndex >= m_Masks.Count)
327 return false;
328 var mask = (uint)1 << bitIndex;
329 var exists = (m_Masks[maskIndex] & mask) > 0;
330 m_Masks[maskIndex] &= ~mask;
331 return exists;
332 }
333
334 public int Count
335 {
336 get
337 {
338 var count = 0;
339 foreach (var mask in m_Masks)
340 {
341 for (var j = 0; j < 32; j++)
342 {
343 if ((mask & (1 << j)) > 0)
344 count++;
345 }
346 }
347 return count;
348 }
349 }
350
351 public bool IsReadOnly
352 {
353 get { return false; }
354 }
355 }
356}