13 public CircularBuffer(
int size,
bool allowOverwrite =
false,
int padding = 4)
15 data =
new byte[size];
16 readWritePadding = padding;
17 this.allowOverwrite = allowOverwrite;
20 public int TotalCapacity
24 return data.Length - readWritePadding;
28 public int UsedCapacity
32 if (writeOffset >= readOffset)
34 return writeOffset - readOffset;
36 int firstChunk = data.Length - readOffset;
37 int secondChunk = writeOffset;
38 return firstChunk + secondChunk;
48 public int Write(Array src,
int srcReadPosBytes,
int byteCount)
51 bool wrappedAround = writeOffset < readOffset;
54 maxWritePos = (readOffset != 0 || allowOverwrite) ? data.Length : data.Length - readWritePadding;
58 maxWritePos = allowOverwrite ? data.Length : readOffset - readWritePadding;
61 int chunkSize = Math.Min(byteCount, maxWritePos - writeOffset);
62 int writeEnd = writeOffset + chunkSize;
63 bool needToMoveReadOffset = wrappedAround ? writeEnd >= readOffset : (writeEnd == data.Length && readOffset == 0);
64 if (needToMoveReadOffset)
68 throw new Exception(
"Circular buffer logic error. Overwriting data.");
70 readOffset = (writeEnd + readWritePadding) % data.Length;
73 Buffer.BlockCopy(src, srcReadPosBytes, data, writeOffset, chunkSize);
74 writeOffset = (writeOffset + chunkSize) % data.Length;
76 int bytesWritten = chunkSize;
77 int remaining = byteCount - bytesWritten;
78 if (bytesWritten > 0 && remaining > 0)
80 bytesWritten += Write(src, srcReadPosBytes + chunkSize, remaining);
86 public int Read(Array dst,
int dstWritePosBytes,
int byteCount)
88 if (readOffset == writeOffset)
94 if (readOffset > writeOffset)
96 maxReadPos = data.Length;
100 maxReadPos = writeOffset;
103 int chunkSize = Math.Min(byteCount, maxReadPos - readOffset);
105 Buffer.BlockCopy(data, readOffset, dst, dstWritePosBytes, chunkSize);
106 readOffset = (readOffset + chunkSize) % data.Length;
108 int bytesRead = chunkSize;
109 int remaining = byteCount - bytesRead;
110 if (bytesRead > 0 && remaining > 0)
112 bytesRead += Read(dst, dstWritePosBytes + bytesRead, remaining);
119 private int writeOffset;
120 private int readOffset;
122 private readonly
int readWritePadding;
123 private readonly
bool allowOverwrite;