using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace StitchATon2.Infra.Buffers; internal sealed unsafe class ImmovableMemory : MemoryManager where T : unmanaged { private readonly T* _pointer; private readonly int _length; private bool _disposed; public ImmovableMemory(int count) { _pointer = (T*)NativeMemory.Alloc((nuint)count, (nuint)Unsafe.SizeOf()); _length = count; } protected override void Dispose(bool disposing) { if (!_disposed) { NativeMemory.Free(_pointer); _disposed = true; } } public override Span GetSpan() => new(_pointer, _length); public override MemoryHandle Pin(int elementIndex = 0) => new(_pointer + elementIndex); public override void Unpin() { } }