Solutions from RecyclableList.SetNewLength migrated to RecyclableList.SetNewLength.
This commit is contained in:
1 parent
3cfe0b7e79
commit
ea1d7d91ba
1 file changed
+19
-8
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user