using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace StitchATon2.Infra.Buffers; internal sealed unsafe class ImmovableMemory : MemoryManager, IBuffer where T : unmanaged { internal readonly T* Pointer; private bool _disposed; public ImmovableMemory(int length) { Pointer = (T*)NativeMemory.Alloc((nuint)length, (nuint)Unsafe.SizeOf()); Length = length; } protected override void Dispose(bool disposing) { if (_disposed) return; NativeMemory.Free(Pointer); _disposed = true; } public override Span GetSpan() => _disposed ? throw new ObjectDisposedException(nameof(ImmovableMemory)) : new Span(Pointer, Length); public override MemoryHandle Pin(int elementIndex = 0) => _disposed ? throw new ObjectDisposedException(nameof(ImmovableMemory)) : new MemoryHandle(Pointer + elementIndex); public override void Unpin() { } public ref T this[int index] { get { if (_disposed) throw new ObjectDisposedException(nameof(ImmovableMemory)); return ref Unsafe.AsRef(Pointer + index); } } public Span Span => GetSpan(); public int Length { get; } }