17 private int firstIdx = 0;
18 private int lastIdx = -1;
21 bufferSize = System.Math.Max(1, bufferSize);
22 arr =
new T[bufferSize];
27 if (lastIdx == -1)
return 0;
29 int endIdx = (lastIdx + 1) % arr.Length;
31 if (endIdx <= firstIdx) { endIdx += arr.Length; }
32 return endIdx - firstIdx;
37 get {
return arr.Length; }
41 get {
return lastIdx != -1
42 && ((lastIdx + 1 + arr.Length) % arr.Length) == firstIdx; }
46 get {
return lastIdx == -1; }
52 public T
this[
int idx] {
53 get {
return Get(idx); }
54 set {
Set(idx, value); }
62 public void Add(T t) {
65 firstIdx %= arr.Length;
68 lastIdx %= arr.Length;
81 public T
Get(
int idx) {
82 if (idx < 0 || idx >
Count - 1) {
83 Debug.Log(
"Tried to access index " + idx +
" of RingBuffer with count " +
Count);
84 throw new IndexOutOfRangeException();
87 return arr[(firstIdx + idx) % arr.Length];
92 throw new IndexOutOfRangeException(
"Can't get latest value in an empty RingBuffer.");
100 throw new IndexOutOfRangeException(
"Can't get oldest value in an empty RingBuffer.");
106 public void Set(
int idx, T t) {
107 if (idx < 0 || idx >
Count - 1) {
throw new IndexOutOfRangeException(); }
109 int actualIdx = (firstIdx + idx) % arr.Length;
115 throw new IndexOutOfRangeException(
"Can't set latest value in an empty RingBuffer.");
122 var sb =
new System.Text.StringBuilder();
123 sb.Append(
"[RingBuffer: ");
124 for (
int i = 0; i < this.
Count; i++) {
130 return sb.ToString();
141 this._buffer = buffer;
146 if (_idx >= _buffer.
Count) {
return false; }
148 if (_idx < 0 || _idx >= _buffer.
Count) {
return false; }
151 public T
Current {
get {
return _buffer[_idx]; }}
T Get(int idx)
Oldest element is at index 0, youngest is at Count - 1.
RingBuffer(int bufferSize)
void Push(T t)
Synonym for "Add".
RingBufferEnumerator GetEnumerator()
override string ToString()
This easy-to-implement interface represents the ability to index into a collection of elements of typ...
RingBufferEnumerator(RingBuffer< T > buffer)