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}