// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Buffers;
using System.Diagnostics.CodeAnalysis;
namespace CommunityToolkit.HighPerformance;
///
/// Helpers for working with the type.
///
public static class ArrayPoolExtensions
{
///
/// Changes the number of elements of a rented one-dimensional array to the specified new size.
///
/// The type of items into the target array to resize.
/// The target instance to use to resize the array.
/// The rented array to resize, or to create a new array.
/// The size of the new array.
/// Indicates whether the contents of the array should be cleared before reuse.
/// Thrown when is less than 0.
/// When this method returns, the caller must not use any references to the old array anymore.
public static void Resize(this ArrayPool pool, [NotNull] ref T[]? array, int newSize, bool clearArray = false)
{
// If the old array is null, just create a new one with the requested size
if (array is null)
{
array = pool.Rent(newSize);
return;
}
// If the new size is the same as the current size, do nothing
if (array.Length == newSize)
{
return;
}
// Rent a new array with the specified size, and copy as many items from the current array
// as possible to the new array. This mirrors the behavior of the Array.Resize API from
// the BCL: if the new size is greater than the length of the current array, copy all the
// items from the original array into the new one. Otherwise, copy as many items as possible,
// until the new array is completely filled, and ignore the remaining items in the first array.
T[] newArray = pool.Rent(newSize);
int itemsToCopy = Math.Min(array.Length, newSize);
Array.Copy(array, 0, newArray, 0, itemsToCopy);
pool.Return(array, clearArray);
array = newArray;
}
}