public int Get(int pos)
{
//System.out.println(" Get pos=" + pos + " nextPos=" + nextPos + " count=" + count);
if (pos == nextPos)
{
if (end)
{
return -1;
}
if (count == buffer.Length)
{
// Grow
var newBuffer = new char[ArrayUtil.Oversize(1 + count, RamUsageEstimator.NUM_BYTES_CHAR)];
//System.out.println(Thread.currentThread().getName() + ": cb grow " + newBuffer.length);
Array.Copy(buffer, nextWrite, newBuffer, 0, buffer.Length - nextWrite);
Array.Copy(buffer, 0, newBuffer, buffer.Length - nextWrite, nextWrite);
nextWrite = buffer.Length;
buffer = newBuffer;
}
if (nextWrite == buffer.Length)
{
nextWrite = 0;
}
int toRead = buffer.Length - Math.Max(count, nextWrite);
int readCount = reader.Read(buffer, nextWrite, toRead);
if (readCount <= 0)
{
end = true;
return -1;
}
int ch = buffer[nextWrite];
nextWrite += readCount;
count += readCount;
nextPos += readCount;
return ch;
}
else
{
// Cannot read from future (except by 1):
Debug.Assert(pos < nextPos);
// Cannot read from already freed past:
Debug.Assert(nextPos - pos <= count, "nextPos=" + nextPos + " pos=" + pos + " count=" + count);
return buffer[GetIndex(pos)];
}
}