Solutions from RecyclableList.SetNewLength migrated to RecyclableList.SetNewLength.

This commit is contained in:
mlemanczyk committed 2023-01-28 23:17:30 +01:00
1 parent 3cfe0b7e79
commit ea1d7d91ba
1 file changed
+19 -8
+19 -8
View File
@@ -21,25 +21,36 @@ namespace Recyclable.Collections
{ {
ArrayPool<T> arrayPool = _arrayPool; ArrayPool<T> arrayPool = _arrayPool;
var sourceLength = source?.Length ?? 0; var sourceLength = source?.Length ?? 0;
T[] newMemoryBlock = newSize.RentArrayFromPool(arrayPool); Span<T> sourceSpan, newArraySpan;
T[] newMemoryBlock = newSize >= RecyclableDefaults.MinPooledArrayLength
? arrayPool.Rent(newSize)
: new T[newSize];
switch (newSize >= sourceLength) switch (newSize >= sourceLength)
{ {
case true: case true:
if (sourceLength > 0) if (sourceLength > 0)
{ {
Memory<T> sourceMemory = new(source); sourceSpan = new Span<T>(source);
Memory<T> newArrayMemory = new(newMemoryBlock); newArraySpan = new Span<T>(newMemoryBlock);
sourceMemory.CopyTo(newArrayMemory); sourceSpan.CopyTo(newArraySpan);
source!.ReturnToPool(arrayPool); if (sourceLength >= RecyclableDefaults.MinPooledArrayLength)
{
arrayPool.Return(source!);
}
} }
return newMemoryBlock; return newMemoryBlock;
case false: case false:
var sourceSpan = new Span<T>(source)[..newSize]; sourceSpan = new Span<T>(source)[..newSize];
Span<T> newArraySpan = new(newMemoryBlock); newArraySpan = new(newMemoryBlock);
sourceSpan.CopyTo(newArraySpan); sourceSpan.CopyTo(newArraySpan);
source!.ReturnToPool(arrayPool); if (sourceLength >= RecyclableDefaults.MinPooledArrayLength)
{
arrayPool.Return(source!);
}
return newMemoryBlock; return newMemoryBlock;
} }
} }