Revert "make a new "FixedGrowthList" and use it for the StringLogs"

This reverts commit da5fae0b01.
This commit is contained in:
Morilli 2022-12-21 07:40:31 +01:00
parent 66c19cfcb2
commit 79857a3b71
1 changed files with 2 additions and 83 deletions

View File

@ -68,88 +68,7 @@ namespace BizHawk.Client.Common
void CopyTo(int index, string[] array, int arrayIndex, int count);
}
/// <summary>
/// A list that grows in fixed 16MB increments
/// This delays 2GB OOM exceptions from occurring
/// (due to .NET doubling the internal array on resize)
/// </summary>
/// <typeparam name="T">the type for the list</typeparam>
internal class FixedGrowthList<T> : IEnumerable<T>
{
private const int GROW_AMOUNT = 16 * 1024 * 1024;
private readonly List<T> _backingList = new();
public void Add(T value)
{
if (_backingList.Count == _backingList.Capacity)
{
_backingList.Capacity += GROW_AMOUNT;
}
_backingList.Add(value);
}
public void Insert(int index, T item)
{
if (_backingList.Count == _backingList.Capacity)
{
_backingList.Capacity += GROW_AMOUNT;
}
_backingList.Insert(index, item);
}
public void AddRange(IEnumerable<T> collection)
{
if (collection is ICollection<T> c)
{
var count = c.Count;
while ((_backingList.Capacity - _backingList.Count) <= count)
{
_backingList.Capacity += GROW_AMOUNT;
}
_backingList.AddRange(collection);
}
else
{
foreach (var item in collection)
{
Add(item);
}
}
}
public void InsertRange(int index, IEnumerable<T> collection)
{
if (collection is ICollection<T> c)
{
var count = c.Count;
while ((_backingList.Capacity - _backingList.Count) <= count)
{
_backingList.Capacity += GROW_AMOUNT;
}
_backingList.InsertRange(index, collection);
}
else
{
foreach (var item in collection)
{
Insert(index++, item);
}
}
}
public T this[int index] { get => _backingList[index]; set => _backingList[index] = value; }
public int Count => _backingList.Count;
public void Clear() => _backingList.Clear();
public void CopyTo(int index, T[] array, int arrayIndex, int count) => _backingList.CopyTo(index, array, arrayIndex, count);
public IEnumerator<T> GetEnumerator() => _backingList.GetEnumerator();
public void RemoveAt(int index) => _backingList.RemoveAt(index);
public void RemoveRange(int index, int count) => _backingList.RemoveRange(index, count);
IEnumerator IEnumerable.GetEnumerator() => _backingList.GetEnumerator();
}
internal class ListStringLog : FixedGrowthList<string>, IStringLog
internal class ListStringLog : List<string>, IStringLog
{
public IStringLog Clone()
{
@ -170,7 +89,7 @@ namespace BizHawk.Client.Common
internal class StreamStringLog : IStringLog
{
private readonly Stream _stream;
private readonly FixedGrowthList<long> _offsets = new();
private readonly List<long> _offsets = new List<long>();
private readonly BinaryWriter _bw;
private readonly BinaryReader _br;
private readonly bool _mDisk;