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); } }