/// <summary> /// </summary> /// <returns></returns> public SparseStateArray Clone() { SparseStateArray Result = new SparseStateArray(); Result.Size = Size; Result.Ranges = null; if (Ranges != null) { Result.Ranges = new List <Range>(); foreach (Range range in Ranges) { Result.Ranges.Add(new Range { Start = range.Start, End = range.End, State = range.State }); } } return(Result); }
/// <summary> /// </summary> /// <param name="Other"></param> public void Union(SparseStateArray Other) { // Expand to new size. if (Size < Other.Size) { Resize(Other.Size); } // This is shit, do it in-place. lock (TempUnionArray) { int Array1Length = 0; int Array2Length = 0; ToArray(ref TempUnionArray, ref Array1Length); Other.ToArray(ref TempUnionOtherArray, ref Array2Length); int ArrayLength = Math.Max(Array1Length, Array2Length); if (TempUnionResultArray.Length < ArrayLength) { Array.Resize(ref TempUnionResultArray, ArrayLength); } for (int i = 0; i < ArrayLength; i++) { bool Val1 = i < Array1Length ? TempUnionArray[i] : false; bool Val2 = i < Array2Length ? TempUnionOtherArray[i] : false; TempUnionResultArray[i] = Val1 | Val2; } FromArray(TempUnionResultArray, ArrayLength); } #if DO_VALIDATION Validate(); #endif }