SpanMemoryManager.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System;
  2. using System.Buffers;
  3. using System.Runtime.InteropServices;
  4. namespace Ryujinx.Audio.Renderer.Utils
  5. {
  6. public sealed unsafe class SpanMemoryManager<T> : MemoryManager<T>
  7. where T : unmanaged
  8. {
  9. private readonly T* _pointer;
  10. private readonly int _length;
  11. public SpanMemoryManager(Span<T> span)
  12. {
  13. fixed (T* ptr = &MemoryMarshal.GetReference(span))
  14. {
  15. _pointer = ptr;
  16. _length = span.Length;
  17. }
  18. }
  19. public override Span<T> GetSpan() => new Span<T>(_pointer, _length);
  20. public override MemoryHandle Pin(int elementIndex = 0)
  21. {
  22. if (elementIndex < 0 || elementIndex >= _length)
  23. {
  24. throw new ArgumentOutOfRangeException(nameof(elementIndex));
  25. }
  26. return new MemoryHandle(_pointer + elementIndex);
  27. }
  28. public override void Unpin() { }
  29. protected override void Dispose(bool disposing) { }
  30. public static Memory<T> Cast<TFrom>(Memory<TFrom> memory) where TFrom : unmanaged
  31. {
  32. return new SpanMemoryManager<T>(MemoryMarshal.Cast<TFrom, T>(memory.Span)).Memory;
  33. }
  34. }
  35. }