BufferExtensions
using System;
using System.Buffers;
namespace Azure.Storage
{
    internal static class BufferExtensions
    {
        private class DisposableRentedArray<T> : IDisposable
        {
            private ArrayPool<T> _pool;
            private T[] _rentedArray;
            public DisposableRentedArray(ArrayPool<T> pool, T[] rentedArray)
            {
                _pool = pool;
                _rentedArray = rentedArray;
            }
            public void Dispose()
            {
                _pool.Return(_rentedArray, false);
            }
        }
        public static IDisposable RentDisposable<T>(this ArrayPool<T> pool, int minimumLength, out T[] array)
        {
            array = pool.Rent(minimumLength);
            return new DisposableRentedArray<T>(pool, array);
        }
        public static IDisposable RentAsMemoryDisposable<T>(this ArrayPool<T> pool, int minimumLength, out Memory<T> memory)
        {
            if (minimumLength == 0) {
                memory = Memory<T>.Empty;
                return null;
            }
            T[] array;
            IDisposable result = pool.RentDisposable(minimumLength, out array);
            memory = new Memory<T>(array, 0, minimumLength);
            return result;
        }
        public static IDisposable RentAsSpanDisposable<T>(this ArrayPool<T> pool, int minimumLength, out Span<T> span)
        {
            if (minimumLength == 0) {
                span = Span<T>.Empty;
                return null;
            }
            T[] array;
            IDisposable result = pool.RentDisposable(minimumLength, out array);
            span = new Span<T>(array, 0, minimumLength);
            return result;
        }
        public static T[] Clear<T>(this T[] array)
        {
            for (int i = 0; i < array.Length; i++) {
                array[i] = default(T);
            }
            return array;
        }
    }
}