using System;
using System.Buffers;
namespace Ryujinx.Common.Pools
{
///
/// A centralized, static pool for getting multipurpose buffers of any type.
/// "But why does this exist when you have ?" This actually just wraps around
/// ArrayPool. The difference is that this also tracks the requested size of the allocated
/// buffer, so you can pass it around and users of it know how much of the data is actually valid,
/// compared to ArrayPool which just gives you an arbitrary sized array. Also, returning a strongly
/// typed codifies the fact that the buffer is part of a pool, and that code
/// can more clearly manage lifetime and disposal automatically.
///
public static class BufferPool
{
public const int DEFAULT_BUFFER_SIZE = 65536;
private static readonly PooledBuffer EMPTY_POOLED_BUFFER = new PooledBuffer(Array.Empty(), -1);
///
/// Returns a disposable instance containing an array of at least the specified number of elements.
///
/// The minimum number of elements that you require
/// A pooled buffer of at least the requested size. Buffers are not cleared between rentals, so it may initially contain garbage.
public static PooledBuffer Rent(int minimumRequestedSize = DEFAULT_BUFFER_SIZE)
{
if (minimumRequestedSize < 0)
{
throw new ArgumentOutOfRangeException("Requested buffer size must be a positive number");
}
if (minimumRequestedSize == 0)
{
return EMPTY_POOLED_BUFFER;
}
PooledBuffer returnVal = new PooledBuffer(ArrayPool.Shared.Rent(minimumRequestedSize), minimumRequestedSize);
#if DEBUG
returnVal.MarkRented();
#endif
return returnVal;
}
}
}