using System; using System.Runtime.InteropServices; using Unity.Collections.LowLevel.Unsafe; namespace Burst.Compiler.IL.Tests { #if UNITY_2021_2_OR_NEWER || BURST_INTERNAL /// /// Test . /// internal partial class Span { [TestCompiler] public static int CreateDefault() { var span = new Span(); return span.Length; } [TestCompiler] public static int CreateStackalloc() { Span span = stackalloc int[42]; return span.Length; } [TestCompiler(42)] public static int CreateFromNullPointer(int size) { Span span; unsafe { span = new Span(null, size); } return span.Length; } [TestCompiler] public static unsafe double CreateFromMalloc() { double* malloc = (double*)UnsafeUtility.Malloc(UnsafeUtility.SizeOf(), UnsafeUtility.AlignOf(), Unity.Collections.Allocator.Persistent); *malloc = 42.0f; Span span = new Span(malloc, 1); double result = span[0]; UnsafeUtility.Free(malloc, Unity.Collections.Allocator.Persistent); return result; } [TestCompiler] public static int GetItem() { Span span = stackalloc int[42]; return span[41]; } [TestCompiler] public static int SetItem() { Span span = stackalloc int[42]; span[41] = 13; return span[41]; } [TestCompiler] public static int Clear() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } span.Clear(); int result = 0; for (int i = 0; i < span.Length; i++) { result += span[i]; } return result; } [TestCompiler] public static int SliceFromStart() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } var newSpan = span.Slice(10); return newSpan[0] + newSpan.Length; } [TestCompiler] public static int SliceFromStartWithLength() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } var newSpan = span.Slice(10, 4); return newSpan[3] + newSpan.Length; } [TestCompiler] public static int CopyTo() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } Span other = stackalloc int[4]; for (int i = 0; i < other.Length; i++) { other[i] = -i - 1; } other.CopyTo(span); int result = 0; for (int i = 0; i < span.Length; i++) { result += span[i]; } return result; } [TestCompiler] public static int Fill() { Span span = stackalloc int[42]; span.Fill(123); int result = 0; for (int i = 0; i < span.Length; i++) { result += span[i]; } return result; } [TestCompiler] public static int IsEmpty() => new Span().IsEmpty ? 1 : 0; [TestCompiler] public static int Empty() => Span.Empty.Length; [TestCompiler] public static int GetEnumerator() { Span span = stackalloc int[42]; int result = 0; var enumerator = span.GetEnumerator(); while (enumerator.MoveNext()) { result += enumerator.Current; } return result; } [TestCompiler] public static int OperatorEquality() => new Span() == Span.Empty ? 1 : 0; [TestCompiler] public static int OperatorInEquality() => new Span() != Span.Empty ? 1 : 0; [TestCompiler] public static int OperatorImplicit() { ReadOnlySpan span = new Span(); return span.Length; } [TestCompiler] public static int Fixed() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } unsafe { fixed (int* ptr = span) { *ptr = 42; return ptr[41]; } } } [TestCompiler] public static int TestMemoryMarshalGetReference() { Span span = stackalloc int[42]; ref int x = ref MemoryMarshal.GetReference(span); return x; } } #endif }