Created
April 26, 2020 05:28
-
-
Save aschuhardt/1889d8f5a03569153a686d877ac16290 to your computer and use it in GitHub Desktop.
Revisions
-
aschuhardt created this gist
Apr 26, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,78 @@ /// <summary> /// A resizable buffer object with its underlying array exposed /// </summary> public class ElasticBuffer<T> : ICollection<T> { private int _capacity = 1, _count = 0; private T[] _buffer; public ElasticBuffer() { _buffer = new T[_capacity]; } public T[] Buffer => _buffer; public int Count => _count; public bool IsReadOnly => false; public void Add(T item) { var index = _count++; if (_count > _capacity) { _capacity *= 2; Array.Resize(ref _buffer, _capacity); } _buffer[index] = item; } public void Clear() { _count = 0; } public bool Contains(T item) { for (int i = 0; i < _count; i++) { if (_buffer[i].Equals(item)) return true; } return false; } public void CopyTo(T[] array, int arrayIndex) { _buffer.CopyTo(array, arrayIndex); } public IEnumerator<T> GetEnumerator() { for (int i = 0; i < _count; i++) yield return _buffer[i]; yield break; } public bool Remove(T item) { for (int i = 0; i < _count; i++) { if (_buffer[i].Equals(item)) { Array.Copy(_buffer, i + 1, _buffer, i, (_count-- - i)); return true; } } return false; } IEnumerator IEnumerable.GetEnumerator() { return ((ICollection<T>)this).GetEnumerator(); } }