Skip to content

Commit

Permalink
Merge pull request #97 from Tynkute/master
Browse files Browse the repository at this point in the history
Added comments....
  • Loading branch information
Konard authored Dec 18, 2020
2 parents 5b1923f + 61f8b70 commit 036ccac
Showing 1 changed file with 52 additions and 3 deletions.
55 changes: 52 additions & 3 deletions csharp/Platform.Collections/Arrays/ArrayPool[T].cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
using Platform.Disposables;
using Platform.Collections.Stacks;

#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member

namespace Platform.Collections.Arrays
{
/// <summary>
/// <para>Represents a set of arrays ready for reuse.</para>
/// <para>Представляет собой набор массивов готовых к повторному использованию.</para>
/// </summary>
/// <typeparam name="T"><para>The array elements type.</para><para>Тип элементов массива.</para></typeparam>
/// <remarks>
/// Original idea from http://geekswithblogs.net/blackrob/archive/2014/12/18/array-pooling-in-csharp.aspx
/// </remarks>
Expand All @@ -21,15 +24,43 @@ public class ArrayPool<T>
private readonly int _maxArraysPerSize;
private readonly Dictionary<long, Stack<T[]>> _pool = new Dictionary<long, Stack<T[]>>(ArrayPool.DefaultSizesAmount);

/// <summary>
/// <para>Initializes a new instance of the ArrayPool class using the specified maximum number of arrays per size.</para>
/// <para>Инициализирует новый экземпляр класса ArrayPool, используя указанное максимальное количество массивов на каждый размер.</para>
/// </summary>
/// <param name="maxArraysPerSize"><para>The maximum number of arrays in the pool per size.</para><para>Максимальное количество массивов в пуле на каждый размер.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ArrayPool(int maxArraysPerSize) => _maxArraysPerSize = maxArraysPerSize;

/// <summary>
/// <para>Initializes a new instance of the ArrayPool class using the default maximum number of arrays per size.</para>
/// <para>Инициализирует новый экземпляр класса ArrayPool, используя максимальное количество массивов на каждый размер по умолчанию.</para>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ArrayPool() : this(ArrayPool.DefaultMaxArraysPerSize) { }

/// <summary>
/// <para>Retrieves an array from the pool, which will automatically return to the pool when the container is disposed.</para>
/// <para>Извлекает из пула массив, который автоматически вернётся в пул при высвобождении контейнера.</para>
/// </summary>
/// <param name="size"><para>The allocated array size.</para><para>Размер выделяемого массива.</para></param>
/// <returns>
/// <para>The disposable container containing either a new array or an array from the pool.</para>
/// <para>Высвобождаемый контейнер содержащий либо новый массив, либо массив из пула.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Disposable<T[]> AllocateDisposable(long size) => (Allocate(size), Free);

/// <summary>
/// <para>Replaces the array with another array from the pool with the specified size.</para>
/// <para>Заменяет массив на другой массив из пула с указанным размером.</para>
/// </summary>
/// <param name="source"><para>The source array.</para><para>Исходный массив.</para></param>
/// <param name="size"><para>A new array size.</para><para>Новый размер массива.</para></param>
/// <returns>
/// <para>An array with a new size.</para>
/// <para>Массив с новым размером.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Disposable<T[]> Resize(Disposable<T[]> source, long size)
{
Expand All @@ -44,12 +75,30 @@ public Disposable<T[]> Resize(Disposable<T[]> source, long size)
return destination;
}

/// <summary>
/// <para>Clears the pool.</para>
/// <para>Очищает пул.</para>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public virtual void Clear() => _pool.Clear();

/// <summary>
/// <para>Retrieves an array with the specified size from the pool.</para>
/// <para>Извлекает из пула массив с указанным размером.</para>
/// </summary>
/// <param name="size"><para>The allocated array size.</para><para>Размер выделяемого массива.</para></param>
/// <returns>
/// <para>An array from the pool or a new array.</para>
/// <para>Массив из пула или новый массив.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public virtual T[] Allocate(long size) => size <= 0L ? Array.Empty<T>() : _pool.GetOrDefault(size)?.PopOrDefault() ?? new T[size];

/// <summary>
/// <para>Frees the array to the pool for later reuse.</para>
/// <para>Освобождает массив в пул для последующего повторного использования.</para>
/// </summary>
/// <param name="array"><para>The array to be freed into the pool.</para><para>Массив который нужно освободить в пул.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public virtual void Free(T[] array)
{
Expand All @@ -65,4 +114,4 @@ public virtual void Free(T[] array)
stack.Push(array);
}
}
}
}

0 comments on commit 036ccac

Please sign in to comment.