public void GetChunks_DestructingEnum() { for (int j = 1; j < 5; j++) { var builder = new BlobBuilder(16); for (int i = 0; i < j; i++) { builder.WriteBytes((byte)i, 16); } int n = 0; foreach (var chunk in builder.GetChunks()) { n++; } Assert.Equal(j, n); var chunks = new HashSet <BlobBuilder>(); foreach (var chunk in builder.GetChunks()) { chunks.Add(chunk); chunk.ClearChunk(); } Assert.Equal(j, chunks.Count); } }
public void GetChunks_DestructingEnum() { for (int j = 1; j < 5; j++) { var builder = new BlobBuilder(16); for (int i = 0; i < j; i++) { builder.WriteBytes((byte)i, 16); } int n = 0; foreach (var chunk in builder.GetChunks()) { n++; } Assert.Equal(j, n); var chunks = new HashSet<BlobBuilder>(); foreach (var chunk in builder.GetChunks()) { chunks.Add(chunk); chunk.ClearChunk(); } Assert.Equal(j, chunks.Count); } }
/// <summary> /// Compares the current content of this writer with another one. /// </summary> /// <exception cref="InvalidOperationException">Content is not available, the builder has been linked with another one.</exception> public bool ContentEquals(BlobBuilder other) { if (!IsHead) { ThrowHeadRequired(); } if (ReferenceEquals(this, other)) { return true; } if (other == null) { return false; } if (!other.IsHead) { ThrowHeadRequired(); } if (Count != other.Count) { return false; } var leftEnumerator = GetChunks(); var rightEnumerator = other.GetChunks(); int leftStart = 0; int rightStart = 0; bool leftContinues = leftEnumerator.MoveNext(); bool rightContinues = rightEnumerator.MoveNext(); while (leftContinues && rightContinues) { Debug.Assert(leftStart == 0 || rightStart == 0); var left = leftEnumerator.Current; var right = rightEnumerator.Current; int minLength = Math.Min(left.Length - leftStart, right.Length - rightStart); if (!ByteSequenceComparer.Equals(left._buffer, leftStart, right._buffer, rightStart, minLength)) { return false; } leftStart += minLength; rightStart += minLength; // nothing remains in left chunk to compare: if (leftStart == left.Length) { leftContinues = leftEnumerator.MoveNext(); leftStart = 0; } // nothing remains in left chunk to compare: if (rightStart == right.Length) { rightContinues = rightEnumerator.MoveNext(); rightStart = 0; } } return leftContinues == rightContinues; }
/// <summary> /// Compares the current content of this writer with another one. /// </summary> /// <exception cref="InvalidOperationException">Content is not available, the builder has been linked with another one.</exception> public bool ContentEquals(BlobBuilder other) { if (!IsHead) { ThrowHeadRequired(); } if (ReferenceEquals(this, other)) { return(true); } if (other == null) { return(false); } if (!other.IsHead) { ThrowHeadRequired(); } if (Count != other.Count) { return(false); } var leftEnumerator = GetChunks(); var rightEnumerator = other.GetChunks(); int leftStart = 0; int rightStart = 0; bool leftContinues = leftEnumerator.MoveNext(); bool rightContinues = rightEnumerator.MoveNext(); while (leftContinues && rightContinues) { Debug.Assert(leftStart == 0 || rightStart == 0); var left = leftEnumerator.Current; var right = rightEnumerator.Current; int minLength = Math.Min(left.Length - leftStart, right.Length - rightStart); if (!ByteSequenceComparer.Equals(left._buffer, leftStart, right._buffer, rightStart, minLength)) { return(false); } leftStart += minLength; rightStart += minLength; // nothing remains in left chunk to compare: if (leftStart == left.Length) { leftContinues = leftEnumerator.MoveNext(); leftStart = 0; } // nothing remains in left chunk to compare: if (rightStart == right.Length) { rightContinues = rightEnumerator.MoveNext(); rightStart = 0; } } return(leftContinues == rightContinues); }