Exemplo n.º 1
0
 public override void Flush()
 {
     if (IsChanged)
     {
         // Write the buffered data to the out stream.
         FOutStream.AssignFrom(this);
         FOutStream.Flush();
     }
     base.Flush();
 }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
            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();
            }
Exemplo n.º 5
0
        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);
        }