SpanOrArray.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. namespace Ryujinx.Common.Memory
  3. {
  4. /// <summary>
  5. /// A struct that can represent both a Span and Array.
  6. /// This is useful to keep the Array representation when possible to avoid copies.
  7. /// </summary>
  8. /// <typeparam name="T">Element Type</typeparam>
  9. public readonly ref struct SpanOrArray<T> where T : unmanaged
  10. {
  11. public readonly T[] Array;
  12. public readonly ReadOnlySpan<T> Span;
  13. /// <summary>
  14. /// Create a new SpanOrArray from an array.
  15. /// </summary>
  16. /// <param name="array">Array to store</param>
  17. public SpanOrArray(T[] array)
  18. {
  19. Array = array;
  20. Span = ReadOnlySpan<T>.Empty;
  21. }
  22. /// <summary>
  23. /// Create a new SpanOrArray from a readonly span.
  24. /// </summary>
  25. /// <param name="array">Span to store</param>
  26. public SpanOrArray(ReadOnlySpan<T> span)
  27. {
  28. Array = null;
  29. Span = span;
  30. }
  31. /// <summary>
  32. /// Return the contained array, or convert the span if necessary.
  33. /// </summary>
  34. /// <returns>An array containing the data</returns>
  35. public T[] ToArray()
  36. {
  37. return Array ?? Span.ToArray();
  38. }
  39. /// <summary>
  40. /// Return a ReadOnlySpan from either the array or ReadOnlySpan.
  41. /// </summary>
  42. /// <returns>A ReadOnlySpan containing the data</returns>
  43. public ReadOnlySpan<T> AsSpan()
  44. {
  45. return Array ?? Span;
  46. }
  47. /// <summary>
  48. /// Cast an array to a SpanOrArray.
  49. /// </summary>
  50. /// <param name="array">Source array</param>
  51. public static implicit operator SpanOrArray<T>(T[] array)
  52. {
  53. return new SpanOrArray<T>(array);
  54. }
  55. /// <summary>
  56. /// Cast a ReadOnlySpan to a SpanOrArray.
  57. /// </summary>
  58. /// <param name="span">Source ReadOnlySpan</param>
  59. public static implicit operator SpanOrArray<T>(ReadOnlySpan<T> span)
  60. {
  61. return new SpanOrArray<T>(span);
  62. }
  63. /// <summary>
  64. /// Cast a Span to a SpanOrArray.
  65. /// </summary>
  66. /// <param name="span">Source Span</param>
  67. public static implicit operator SpanOrArray<T>(Span<T> span)
  68. {
  69. return new SpanOrArray<T>(span);
  70. }
  71. /// <summary>
  72. /// Cast a SpanOrArray to a ReadOnlySpan
  73. /// </summary>
  74. /// <param name="spanOrArray">Source SpanOrArray</param>
  75. public static implicit operator ReadOnlySpan<T>(SpanOrArray<T> spanOrArray)
  76. {
  77. return spanOrArray.AsSpan();
  78. }
  79. }
  80. }