public override void Flush() { if (IsChanged) { // Write the buffered data to the out stream. FOutStream.AssignFrom(this); FOutStream.Flush(); } base.Flush(); }
public override void Flush(bool force = false) { if (force || IsChanged) { // Write the buffered data to the out stream. FOutStream.AssignFrom(this); FOutStream.Flush(force); } base.Flush(force); }
public override void Flush(bool force = false) { var buffer = MemoryPool <T> .GetArray(); var binSizeBuffer = MemoryPool <int> .GetArray(); try { FBinSizeStream.Length = Length; int dataStreamLength = 0; using (var binSizeWriter = FBinSizeStream.GetWriter()) { var numSlicesBuffered = 0; for (int i = 0; i < Length; i++) { var length = Buffer[i]?.Length ?? 0; binSizeBuffer[numSlicesBuffered++] = length; dataStreamLength += length; if (numSlicesBuffered == binSizeBuffer.Length) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); numSlicesBuffered = 0; } } if (numSlicesBuffered > 0) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); } } FDataStream.Length = dataStreamLength; using (var dataWriter = FDataStream.GetWriter()) { bool anyChanged = force || IsChanged; var numSlicesBuffered = 0; for (int i = 0; i < Length; i++) { var stream = Buffer[i]; if (stream != null) { anyChanged |= stream.IsChanged; if (anyChanged) { using (var reader = stream.GetReader()) { switch (reader.Length) { case 0: break; case 1: buffer[numSlicesBuffered++] = reader.Read(); WriteIfBufferIsFull(dataWriter, buffer, ref numSlicesBuffered); break; default: while (!reader.Eos) { numSlicesBuffered += reader.Read(buffer, numSlicesBuffered, buffer.Length - numSlicesBuffered); WriteIfBufferIsFull(dataWriter, buffer, ref numSlicesBuffered); } break; } } // Reset the changed flags var flushable = stream as IFlushable; if (flushable != null) { flushable.Flush(force); } } else { dataWriter.Position += stream.Length; } } } if (numSlicesBuffered > 0) { dataWriter.Write(buffer, 0, numSlicesBuffered); } } } finally { MemoryPool <int> .PutArray(binSizeBuffer); MemoryPool <T> .PutArray(buffer); } FBinSizeStream.Flush(force); FDataStream.Flush(force); base.Flush(force); }
public override void Flush(bool force = false) { var buffer = MemoryPool <T> .GetArray(); var binSizeBuffer = MemoryPool <int> .GetArray(); try { FBinSizeStream.Length = Length; int dataStreamLength = 0; using (var binSizeWriter = FBinSizeStream.GetWriter()) { var numSlicesBuffered = 0; for (int i = 0; i < Length; i++) { var stream = Buffer[i].Stream; binSizeBuffer[numSlicesBuffered++] = stream.Length; dataStreamLength += stream.Length; if (numSlicesBuffered == binSizeBuffer.Length) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); numSlicesBuffered = 0; } } if (numSlicesBuffered > 0) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); } } FDataStream.Length = dataStreamLength; using (var dataWriter = FDataStream.GetWriter()) { bool anyChanged = force || IsChanged; for (int i = 0; i < Length; i++) { var spread = Buffer[i]; anyChanged |= spread.IsChanged; if (anyChanged) { var stream = spread.Stream; switch (stream.Length) { case 0: break; case 1: dataWriter.Write(stream.Buffer[0]); break; default: dataWriter.Write(stream.Buffer, 0, stream.Length); break; } // Reset the changed flags stream.Flush(force); } else { dataWriter.Position += spread.SliceCount; } } } } finally { MemoryPool <int> .PutArray(binSizeBuffer); MemoryPool <T> .PutArray(buffer); } FDataStream.Flush(); FBinSizeStream.Flush(); base.Flush(); }
public override void Flush(bool force = false) { var buffer = MemoryPool <T> .GetArray(); var binSizeBuffer = MemoryPool <int> .GetArray(); try { FBinSizeStream.Length = Length; int dataStreamLength = 0; using (var binSizeWriter = FBinSizeStream.GetWriter()) { var numSlicesBuffered = 0; for (int i = 0; i < Length; i++) { var array = Buffer[i]; if (array != null) { binSizeBuffer[numSlicesBuffered++] = array.Count; dataStreamLength += array.Count; } else { binSizeBuffer[numSlicesBuffered++] = 0; } if (numSlicesBuffered == binSizeBuffer.Length) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); numSlicesBuffered = 0; } } if (numSlicesBuffered > 0) { binSizeWriter.Write(binSizeBuffer, 0, numSlicesBuffered); } } FDataStream.Length = dataStreamLength; using (var dataWriter = FDataStream.GetWriter()) { bool anyChanged = force || IsChanged; var numSlicesBuffered = 0; for (int i = 0; i < Length; i++) { var array = Buffer[i]; if (array != null) { switch (array.Count) { case 0: break; case 1: buffer[numSlicesBuffered++] = array[0]; WriteIfBufferIsFull(dataWriter, buffer, ref numSlicesBuffered); break; default: var sourceIndex = 0; while (sourceIndex < array.Count) { var chunkLength = Math.Min(array.Count - sourceIndex, buffer.Length - numSlicesBuffered); array.CopyTo(sourceIndex, buffer, numSlicesBuffered, chunkLength); sourceIndex += chunkLength; numSlicesBuffered += chunkLength; WriteIfBufferIsFull(dataWriter, buffer, ref numSlicesBuffered); } break; } } } if (numSlicesBuffered > 0) { dataWriter.Write(buffer, 0, numSlicesBuffered); } } } finally { MemoryPool <int> .PutArray(binSizeBuffer); MemoryPool <T> .PutArray(buffer); } FBinSizeStream.Flush(force); FDataStream.Flush(force); base.Flush(force); }