diff --git a/ArrayMemory.cs b/ArrayMemory.cs
index 55cbb46..7e1cb35 100644
--- a/ArrayMemory.cs
+++ b/ArrayMemory.cs
@@ -1,10 +1,10 @@
namespace Platform.Memory
{
///
- /// Represents a memory block with access via indexer.
- /// Представляет блок памяти с доступом через индексатор.
+ /// Represents a memory block with access via indexer.
+ /// Представляет блок памяти с доступом через индексатор.
///
- /// Element type. Тип элемента.
+ /// Element type.Тип элемента.
public class ArrayMemory : IArrayMemory
{
#region Fields
@@ -15,8 +15,12 @@ public class ArrayMemory : IArrayMemory
#region Properties
+ ///
+ ///
public long Size => _array.Length;
+ ///
+ ///
public TElement this[long index]
{
get => _array[index];
@@ -27,6 +31,11 @@ public TElement this[long index]
#region Constuctors
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// Size in bytes.Размер в байтах.
public ArrayMemory(long size) => _array = new TElement[size];
#endregion
diff --git a/DirectMemoryAsArrayMemoryAdapter.cs b/DirectMemoryAsArrayMemoryAdapter.cs
index 1dd5fe6..b7f1d10 100644
--- a/DirectMemoryAsArrayMemoryAdapter.cs
+++ b/DirectMemoryAsArrayMemoryAdapter.cs
@@ -6,10 +6,10 @@
namespace Platform.Memory
{
///
- /// Represents adapter to a memory block with access via indexer.
- /// Представляет адаптер к блоку памяти с доступом через индексатор.
+ /// Represents adapter to a memory block with access via indexer.
+ /// Представляет адаптер к блоку памяти с доступом через индексатор.
///
- /// Element type. Тип элемента.
+ /// Element type.Тип элемента.
public class DirectMemoryAsArrayMemoryAdapter : DisposableBase, IArrayMemory, IDirectMemory
where TElement : struct
{
@@ -21,10 +21,16 @@ public class DirectMemoryAsArrayMemoryAdapter : DisposableBase, IArray
#region Properties
+ ///
+ ///
public long Size => _memory.Size;
+ ///
+ ///
public IntPtr Pointer => _memory.Pointer;
+ ///
+ ///
public TElement this[long index]
{
get => Pointer.GetElement(Structure.Size, index).GetValue();
@@ -35,12 +41,18 @@ public TElement this[long index]
#region DisposableBase Properties
+ ///
protected override string ObjectName => $"Array as memory block at '{Pointer}' address.";
#endregion
#region Constructors
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// An object implementing interface.Объект, реализующий интерфейс .
public DirectMemoryAsArrayMemoryAdapter(IDirectMemory memory)
{
Ensure.Always.ArgumentMeetsCriteria(m => (m.Size % Structure.Size) == 0, memory, nameof(memory), "Memory is not aligned to element size.");
@@ -51,6 +63,7 @@ public DirectMemoryAsArrayMemoryAdapter(IDirectMemory memory)
#region DisposableBase Methods
+ ///
protected override void Dispose(bool manual, bool wasDisposed)
{
if (!wasDisposed)
diff --git a/FileArrayMemory.cs b/FileArrayMemory.cs
index 3e7c80c..e79f207 100644
--- a/FileArrayMemory.cs
+++ b/FileArrayMemory.cs
@@ -6,10 +6,10 @@
namespace Platform.Memory
{
///
- /// Represents a memory block with access via indexer and stored as file on disk.
- /// Представляет блок памяти с доступом через индексатор и хранящийся в виде файла на диске.
+ /// Represents a memory block with access via indexer and stored as file on disk.
+ /// Представляет блок памяти с доступом через индексатор и хранящийся в виде файла на диске.
///
- /// Element type. Тип элемента.
+ /// Element type.Тип элемента.
public class FileArrayMemory : DisposableBase, IArrayMemory //-V3073
where TElement : struct
{
@@ -22,8 +22,12 @@ public class FileArrayMemory : DisposableBase, IArrayMemory
#region Properties
+ ///
+ ///
public long Size => _file.Length;
+ ///
+ ///
public TElement this[long index]
{
get
@@ -42,22 +46,29 @@ public TElement this[long index]
#region DisposableBase Properties
+ ///
protected override string ObjectName => $"File stored memory block at '{_address}' path.";
#endregion
#region Contructors
- public FileArrayMemory(string address)
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// An path to file.Путь к файлу.
+ public FileArrayMemory(string path)
{
- _address = address;
- _file = File.Open(address, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+ _address = path;
+ _file = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
}
#endregion
#region DisposableBase Methods
+ ///
protected override void Dispose(bool manual, bool wasDisposed)
{
if(!wasDisposed)
diff --git a/FileMappedResizableDirectMemory.cs b/FileMappedResizableDirectMemory.cs
index ec2860a..6111bee 100644
--- a/FileMappedResizableDirectMemory.cs
+++ b/FileMappedResizableDirectMemory.cs
@@ -9,8 +9,8 @@
namespace Platform.Memory
{
///
- /// Represents a memory block stored as a file on disk.
- /// Представляет блок памяти, хранящийся в виде файла на диске.
+ /// Represents a memory block stored as a file on disk.
+ /// Представляет блок памяти, хранящийся в виде файла на диске.
///
public unsafe class FileMappedResizableDirectMemory : ResizableDirectMemoryBase
{
@@ -19,31 +19,47 @@ public unsafe class FileMappedResizableDirectMemory : ResizableDirectMemoryBase
private MemoryMappedFile _file;
private MemoryMappedViewAccessor _accessor;
- protected readonly string Address;
+ ///
+ /// Gets path to memory mapped file.
+ /// Получает путь к отображенному в памяти файлу.
+ ///
+ protected readonly string Path;
#endregion
#region DisposableBase Properties
- protected override string ObjectName => $"File stored memory block at '{Address}' path.";
+ ///
+ protected override string ObjectName => $"File stored memory block at '{Path}' path.";
#endregion
#region Constructors
- public FileMappedResizableDirectMemory(string address, long minimumReservedCapacity)
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// An path to file.Путь к файлу.
+ /// Minimum file size in bytes.Минимальный размер файла в байтах.
+ public FileMappedResizableDirectMemory(string path, long minimumReservedCapacity)
{
- Ensure.Always.ArgumentNotEmptyAndNotWhiteSpace(address, nameof(address));
+ Ensure.Always.ArgumentNotEmptyAndNotWhiteSpace(path, nameof(path));
if (minimumReservedCapacity < MinimumCapacity)
{
minimumReservedCapacity = MinimumCapacity;
}
- Address = address;
- var size = FileHelpers.GetSize(Address);
+ Path = path;
+ var size = FileHelpers.GetSize(Path);
ReservedCapacity = size > minimumReservedCapacity ? ((size / minimumReservedCapacity) + 1) * minimumReservedCapacity : minimumReservedCapacity;
UsedCapacity = size;
}
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// An path to file.Путь к файлу.
public FileMappedResizableDirectMemory(string address) : this(address, MinimumCapacity) { }
#endregion
@@ -56,7 +72,7 @@ private void MapFile(long capacity)
{
return;
}
- _file = MemoryMappedFile.CreateFromFile(Address, FileMode.Open, mapName: null, capacity, MemoryMappedFileAccess.ReadWrite);
+ _file = MemoryMappedFile.CreateFromFile(Path, FileMode.Open, mapName: null, capacity, MemoryMappedFileAccess.ReadWrite);
_accessor = _file.CreateViewAccessor();
byte* pointer = null;
_accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref pointer);
@@ -90,18 +106,22 @@ private bool UnmapFile(IntPtr pointer)
#region ResizableDirectMemoryBase Methods
+ ///
+ ///
protected override void OnReservedCapacityChanged(long oldReservedCapacity, long newReservedCapacity)
{
UnmapFile();
- FileHelpers.SetSize(Address, newReservedCapacity);
+ FileHelpers.SetSize(Path, newReservedCapacity);
MapFile(newReservedCapacity);
}
- protected override void DisposePointer(IntPtr pointer, long size)
+ ///
+ ///
+ protected override void DisposePointer(IntPtr pointer, long usedCapacity)
{
if (UnmapFile(pointer))
{
- FileHelpers.SetSize(Address, size);
+ FileHelpers.SetSize(Path, usedCapacity);
}
}
diff --git a/HeapResizableDirectMemory.cs b/HeapResizableDirectMemory.cs
index 3688c2e..b506baf 100644
--- a/HeapResizableDirectMemory.cs
+++ b/HeapResizableDirectMemory.cs
@@ -5,19 +5,25 @@
namespace Platform.Memory
{
///
- /// Represents a memory block allocated in Heap.
- /// Представляет блок памяти, выделенный в "куче".
+ /// Represents a memory block allocated in Heap.
+ /// Представляет блок памяти, выделенный в "куче".
///
public unsafe class HeapResizableDirectMemory : ResizableDirectMemoryBase
{
#region DisposableBase Properties
+ ///
protected override string ObjectName => $"Heap stored memory block at {Pointer} address.";
#endregion
#region Constructors
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// Minimum file size in bytes.Минимальный размер файла в байтах.
public HeapResizableDirectMemory(long minimumReservedCapacity)
{
if (minimumReservedCapacity < MinimumCapacity)
@@ -28,14 +34,22 @@ public HeapResizableDirectMemory(long minimumReservedCapacity)
UsedCapacity = 0;
}
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
public HeapResizableDirectMemory() : this(MinimumCapacity) { }
#endregion
#region ResizableDirectMemoryBase Methods
- protected override void DisposePointer(IntPtr pointer, long size) => Marshal.FreeHGlobal(pointer);
+ ///
+ ///
+ protected override void DisposePointer(IntPtr pointer, long usedCapacity) => Marshal.FreeHGlobal(pointer);
+ ///
+ ///
protected override void OnReservedCapacityChanged(long oldReservedCapacity, long newReservedCapacity)
{
if (Pointer == IntPtr.Zero)
diff --git a/IArrayMemory.cs b/IArrayMemory.cs
index 695d2fc..e5ac45c 100644
--- a/IArrayMemory.cs
+++ b/IArrayMemory.cs
@@ -1,17 +1,17 @@
namespace Platform.Memory
{
///
- /// Represents a memory block interface with access via indexer.
- /// Представляет интерфейс блока памяти с доступом через индексатор.
+ /// Represents a memory block interface with access via indexer.
+ /// Представляет интерфейс блока памяти с доступом через индексатор.
///
- /// Element type. Тип элемента.
+ /// Element type.Тип элемента.
public interface IArrayMemory : IMemory
{
///
- /// Gets or sets the element at the specified index.
- /// Возвращает или устанавливает элемент по указанному индексу.
+ /// Gets or sets the element at the specified index.
+ /// Возвращает или устанавливает элемент по указанному индексу.
///
- /// The index of the element to get or set. Индекс элемента, который нужно получить или установить.
+ /// The index of the element to get or set.Индекс элемента, который нужно получить или установить.
TElement this[long index] { get; set; }
}
}
diff --git a/IDirectMemory.cs b/IDirectMemory.cs
index 5794f89..0476461 100644
--- a/IDirectMemory.cs
+++ b/IDirectMemory.cs
@@ -3,16 +3,15 @@
namespace Platform.Memory
{
///
- /// Represents a memory block interface with direct access (via unmanaged pointers).
- /// Представляет интерфейс блока памяти с прямым доступом (через неуправляемые указатели).
+ /// Represents a memory block interface with direct access (via unmanaged pointers).
+ /// Представляет интерфейс блока памяти с прямым доступом (через неуправляемые указатели).
///
public interface IDirectMemory : IMemory, IDisposable
{
///
- /// Gets the pointer to the beginning of this memory block.
- /// Возвращает указатель на начало блока памяти.
+ /// Gets the pointer to the beginning of this memory block.
+ /// Возвращает указатель на начало блока памяти.
///
- /// The memory block is disposed. Блок памяти уже высвобожден.
IntPtr Pointer { get; }
}
}
\ No newline at end of file
diff --git a/IMemory.cs b/IMemory.cs
index a90d70b..f236aae 100644
--- a/IMemory.cs
+++ b/IMemory.cs
@@ -1,14 +1,14 @@
namespace Platform.Memory
{
///
- /// Represents a memory block interface with size in bytes.
- /// Представляет интерфейс блока памяти с размером в байтах.
+ /// Represents a memory block interface with size in bytes.
+ /// Представляет интерфейс блока памяти с размером в байтах.
///
public interface IMemory
{
///
- /// Gets the size in bytes of this memory block.
- /// Возвращает размер блока памяти в байтах.
+ /// Gets the size in bytes of this memory block.
+ /// Возвращает размер блока памяти в байтах.
///
long Size { get; }
}
diff --git a/IResizableDirectMemory.cs b/IResizableDirectMemory.cs
index 120fcf0..a2d0956 100644
--- a/IResizableDirectMemory.cs
+++ b/IResizableDirectMemory.cs
@@ -1,8 +1,8 @@
namespace Platform.Memory
{
///
- /// Represents a resizable memory block interface with direct access (via unmanaged pointers).
- /// Представляет интерфейс блока памяти c изменяемым размером и прямым доступом (через неуправляемые указатели).
+ /// Represents a resizable memory block interface with direct access (via unmanaged pointers).
+ /// Представляет интерфейс блока памяти c изменяемым размером и прямым доступом (через неуправляемые указатели).
///
///
/// Возможно, если дать настройку - инициализировать ли нулями выделяемую память можно немного выиграть в производительности,
@@ -24,33 +24,41 @@
public interface IResizableDirectMemory : IDirectMemory
{
///
- /// Gets or sets the reserved capacity in bytes of this memory block.
- /// Возвращает или устаналивает зарезервированный размер блока памяти в байтах.
+ /// Gets or sets the reserved capacity in bytes of this memory block.
+ /// Возвращает или устаналивает зарезервированный размер блока памяти в байтах.
///
///
+ ///
/// If less then zero the value is replaced with zero.
/// Cannot be less than the used capacity of this memory block.
+ ///
+ ///
/// Если меньше нуля, значение заменяется на ноль.
/// Не может быть меньше используемой емкости блока памяти.
+ ///
///
- /// The memory block is disposed. Блок памяти уже высвобожден.
- /// Attempted to set the reserved capacity to a value that is less than the used capacity. Была выполнена попытка установить зарезервированную емкость на значение, которое меньше используемой емкости.
long ReservedCapacity { get; set; }
///
- /// Gets or sets the used capacity in bytes of this memory block.
- /// Возвращает или устанавливает используемый размер в блоке памяти (в байтах).
+ /// Gets or sets the used capacity in bytes of this memory block.
+ /// Возвращает или устанавливает используемый размер в блоке памяти (в байтах).
///
///
+ ///
/// If less then zero the value is replaced with zero.
/// Cannot be greater than the reserved capacity of this memory block.
+ ///
+ ///
/// It is recommended to reduce the reserved capacity of the memory block to the used capacity (specified in this property) after the completion of the use of the memory block.
+ ///
+ ///
/// Если меньше нуля, значение заменяется на ноль.
/// Не может быть больше, чем зарезервированная емкость этого блока памяти.
+ ///
+ ///
/// Рекомендуется уменьшать фактический размер блока памяти до используемого размера (указанного в этом свойстве) после завершения использования блока памяти.
+ ///
///
- /// The memory block is disposed. Блок памяти уже высвобожден.
- /// Attempted to set the used capacity to a value that is greater than the reserved capacity or less than zero. Была выполнена попытка установить используемую емкость на значение, которое больше, чем зарезервированная емкость или меньше нуля.
long UsedCapacity { get; set; }
}
}
\ No newline at end of file
diff --git a/ResizableDirectMemoryBase.cs b/ResizableDirectMemoryBase.cs
index 2c36096..e969162 100644
--- a/ResizableDirectMemoryBase.cs
+++ b/ResizableDirectMemoryBase.cs
@@ -7,13 +7,17 @@
namespace Platform.Memory
{
///
- /// Provides a base implementation for the resizable memory block with direct access (via unmanaged pointers).
- /// Предоставляет базовую реализацию для блока памяти c изменяемым размером и прямым доступом (через неуправляемые указатели).
+ /// Provides a base implementation for the resizable memory block with direct access (via unmanaged pointers).
+ /// Предоставляет базовую реализацию для блока памяти c изменяемым размером и прямым доступом (через неуправляемые указатели).
///
public abstract class ResizableDirectMemoryBase : DisposableBase, IResizableDirectMemory
{
#region Constants
+ ///
+ /// Gets minimum capacity in bytes.
+ /// Возвращает минимальную емкость в байтах.
+ ///
public static readonly long MinimumCapacity = 4096;
#endregion
@@ -28,7 +32,10 @@ public abstract class ResizableDirectMemoryBase : DisposableBase, IResizableDire
#region Properties
- /// The memory block is disposed. Блок памяти уже высвобожден.
+
+ ///
+ ///
+ /// The memory block is disposed.Блок памяти уже высвобожден.
public long Size
{
get
@@ -38,7 +45,9 @@ public long Size
}
}
- /// The memory block is disposed. Блок памяти уже высвобожден.
+ ///
+ ///
+ /// The memory block is disposed.Блок памяти уже высвобожден.
public IntPtr Pointer
{
get
@@ -53,8 +62,10 @@ protected set
}
}
- /// The memory block is disposed. Блок памяти уже высвобожден.
- /// Attempted to set the reserved capacity to a value that is less than the used capacity. Была выполнена попытка установить зарезервированную емкость на значение, которое меньше используемой емкости.
+ ///
+ ///
+ /// The memory block is disposed.Блок памяти уже высвобожден.
+ /// Attempted to set the reserved capacity to a value that is less than the used capacity.Была выполнена попытка установить зарезервированную емкость на значение, которое меньше используемой емкости.
public long ReservedCapacity
{
get
@@ -74,8 +85,10 @@ public long ReservedCapacity
}
}
- /// The memory block is disposed. Блок памяти уже высвобожден.
- /// Attempted to set the used capacity to a value that is greater than the reserved capacity or less than zero. Была выполнена попытка установить используемую емкость на значение, которое больше, чем зарезервированная емкость или меньше нуля.
+ ///
+ ///
+ /// The memory block is disposed.Блок памяти уже высвобожден.
+ /// Attempted to set the used capacity to a value that is greater than the reserved capacity or less than zero.Была выполнена попытка установить используемую емкость на значение, которое больше, чем зарезервированная емкость или меньше нуля.
public long UsedCapacity
{
get
@@ -98,20 +111,34 @@ public long UsedCapacity
#region DisposableBase Properties
+ ///
protected override bool AllowMultipleDisposeCalls => true;
#endregion
#region Methods
+ ///
+ /// Executed on the event of change for property.
+ /// Выполняется в случае изменения свойства .
+ ///
+ /// The old reserved capacity of the memory block in bytes.Старая зарезервированная емкость блока памяти в байтах.
+ /// The new reserved capacity of the memory block in bytes.Новая зарезервированная емкость блока памяти в байтах.
protected abstract void OnReservedCapacityChanged(long oldReservedCapacity, long newReservedCapacity);
- protected abstract void DisposePointer(IntPtr pointer, long size);
+ ///
+ /// Executed when it is time to dispose .
+ /// Выполняется, когда пришло время высвободить .
+ ///
+ /// The pointer to a memory block.Указатель на блок памяти.
+ /// The used capacity of the memory block in bytes.Используемая емкость блока памяти в байтах.
+ protected abstract void DisposePointer(IntPtr pointer, long usedCapacity);
#endregion
#region DisposableBase Methods
+ ///
protected override void Dispose(bool manual, bool wasDisposed)
{
if (!wasDisposed)
diff --git a/TemporaryFileMappedResizableDirectMemory.cs b/TemporaryFileMappedResizableDirectMemory.cs
index 56c6e98..63e9392 100644
--- a/TemporaryFileMappedResizableDirectMemory.cs
+++ b/TemporaryFileMappedResizableDirectMemory.cs
@@ -3,33 +3,44 @@
namespace Platform.Memory
{
///
- /// Represents a memory block stored as a temporary file on disk.
- /// Представляет блок памяти, хранящийся в виде временного файла на диске.
+ /// Represents a memory block stored as a temporary file on disk.
+ /// Представляет блок памяти, хранящийся в виде временного файла на диске.
///
public class TemporaryFileMappedResizableDirectMemory : FileMappedResizableDirectMemory
{
#region DisposableBase Properties
- protected override string ObjectName => $"Temporary file stored memory block at '{Address}' path.";
+ ///
+ protected override string ObjectName => $"Temporary file stored memory block at '{Path}' path.";
#endregion
#region Constructors
- public TemporaryFileMappedResizableDirectMemory(long minimumReservedCapacity) : base(Path.GetTempFileName(), minimumReservedCapacity) { }
-
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// Minimum file size in bytes.Минимальный размер файла в байтах.
+ public TemporaryFileMappedResizableDirectMemory(long minimumReservedCapacity) : base(System.IO.Path.GetTempFileName(), minimumReservedCapacity) { }
+
+ ///
+ /// Initializes a new instance of the class.
+ /// Инициализирует новый экземпляр класса .
+ ///
public TemporaryFileMappedResizableDirectMemory() : this(MinimumCapacity) { }
#endregion
#region DisposableBase Methods
+ ///
protected override void Dispose(bool manual, bool wasDisposed)
{
base.Dispose(manual, wasDisposed);
if (!wasDisposed)
{
- File.Delete(Address);
+ File.Delete(Path);
}
}