internal void Push(byte[] buffer, int offset, int count)
{
if (count == 0)
return;
if (_storedOffset == _storedLength)
{
if (_storedBuffer == null || _storedBuffer.Length < count)
{
_storedBuffer = new byte[count];
}
_storedOffset = 0;
_storedLength = count;
}
else
{
// if there's room to just insert before existing data
if (count <= _storedOffset)
{
_storedOffset -= count;
}
// if there's room in the buffer but need to shift things over
else if (count <= _storedBuffer.Length - _storedLength + _storedOffset)
{
Buffer.BlockCopy(_storedBuffer, _storedOffset, _storedBuffer, count, _storedLength - _storedOffset);
_storedLength += count - _storedOffset;
_storedOffset = 0;
}
else
{
byte[] newBuffer = new byte[count + _storedLength - _storedOffset];
Buffer.BlockCopy(_storedBuffer, _storedOffset, newBuffer, count, _storedLength - _storedOffset);
_storedLength += count - _storedOffset;
_storedOffset = 0;
_storedBuffer = newBuffer;
}
}
Buffer.BlockCopy(buffer, offset, _storedBuffer, _storedOffset, count);
}