// ReSharper disable once InconsistentNaming
        internal void SetIOBuffer(IOBuffer ioBuffer)
        {
            if (ioBuffer != null)
            {
                IOBuffer = ioBuffer;

                // Buffer must be assigned first, as it will reset BufferOffset and BufferLength
                Buffer = ioBuffer.Buffer;

                BufferOffset = ioBuffer.Offset;
                BufferLength = ioBuffer.Length;
            }
            else
            {
                IOBuffer = null;
                Buffer = null;
            }
        }
        /// <summary>
        /// Returns an <see cref="IOBuffer"/>.
        /// </summary>
        /// <returns>The <see cref="IOBuffer"/>, or null if no buffer is available.</returns>
        public virtual IOBuffer GetBuffer()
        {
            lock (_freeIndexPool)
            {
                EnsureBufferAllocated();

                if (_freeIndexPool.Count > 0)
                {
                    return new IOBuffer(_buffer, _freeIndexPool.Pop(), _bufferSize);
                }
                else
                {
                    if ((_numberOfBytes - _bufferSize) >= _currentIndex)
                    {
                        var result = new IOBuffer(_buffer, _currentIndex, _bufferSize);
                        _currentIndex += _bufferSize;
                        return result;
                    }
                }
                return null;
            }
        }
 /// <summary>
 /// Releases the buffer allocated to an <see cref="IOBuffer"/> instance.
 /// </summary>
 /// <param name="buffer">The instance the buffer will be released from.</param>
 public void ReleaseBuffer(IOBuffer buffer)
 {
     ReleaseBuffer(buffer.Offset);
 }