// 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; } }