public int Dequeue( byte[] buffer, int offset, int size )
{
if ( size > m_Size )
size = m_Size;
if ( size == 0 )
return 0;
if ( m_Head < m_Tail )
{
Buffer.BlockCopy( m_Buffer, m_Head, buffer, offset, size );
}
else
{
int rightLength = ( m_Buffer.Length - m_Head );
if ( rightLength >= size )
{
Buffer.BlockCopy( m_Buffer, m_Head, buffer, offset, size );
}
else
{
Buffer.BlockCopy( m_Buffer, m_Head, buffer, offset, rightLength );
Buffer.BlockCopy( m_Buffer, 0, buffer, offset + rightLength, size - rightLength );
}
}
m_Head = ( m_Head + size ) % m_Buffer.Length;
m_Size -= size;
if ( m_Size == 0 )
{
m_Head = 0;
m_Tail = 0;
}
return size;
}