/// <summary> /// Moves the required amount of bytes onto a new fifostream /// Warning: Unused buffer segments can appear /// </summary> /// <param name="requiredBytes"></param> /// <returns></returns> public FifoStream FastMove(int requiredBytes) { _lastBuffer = null; var dStream = new FifoStream(_ringBufferProvider); while (requiredBytes > 0 && _length > 0 && _localBuffer.Count > 0) { var cBuf = _localBuffer.Peek(); var cBufLen = cBuf.Length; if (cBufLen <= requiredBytes) { dStream._localBuffer.Enqueue(cBuf); dStream._length += cBufLen; requiredBytes -= cBufLen; _length -= cBufLen; _localBuffer.Dequeue(); } else { var nBuf = _ringBufferProvider.Create(); var readBytes = nBuf.Write(cBuf.Value, cBuf.Low, requiredBytes); cBuf.Low += readBytes; _length -= readBytes; requiredBytes -= readBytes; dStream._length += readBytes; dStream._localBuffer.Enqueue(nBuf); if (cBuf.Length == 0) { _localBuffer.Dequeue().ReIntegrate(); } } } return(dStream); }
public BufferObject Clone(bool optimize = false) { var res = _parent.Create(); var len = Length; if (optimize) { res.Low = 0; res.High = len; } else { res.Low = Low; res.High = High; } Array.Copy(this.Value, this.Low, res.Value, res.Low, len); return(res); }