using System.Runtime.CompilerServices; namespace System.Buffers; internal sealed class ArrayMemoryPool : MemoryPool { private sealed class ArrayMemoryPoolBuffer : IMemoryOwner, IDisposable { private T[] _array; public Memory Memory { get { T[] array = _array; if (array == null) { System.ThrowHelper.ThrowObjectDisposedException_ArrayMemoryPoolBuffer(); } return new Memory(array); } } public ArrayMemoryPoolBuffer(int size) { _array = ArrayPool.Shared.Rent(size); } public void Dispose() { T[] array = _array; if (array != null) { _array = null; ArrayPool.Shared.Return(array); } } } private const int s_maxBufferSize = int.MaxValue; public sealed override int MaxBufferSize => int.MaxValue; public sealed override IMemoryOwner Rent(int minimumBufferSize = -1) { if (minimumBufferSize == -1) { minimumBufferSize = 1 + 4095 / Unsafe.SizeOf(); } else if ((uint)minimumBufferSize > 2147483647u) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.minimumBufferSize); } return new ArrayMemoryPoolBuffer(minimumBufferSize); } protected sealed override void Dispose(bool disposing) { } }