using System; using Unity.Collections.LowLevel.Unsafe; namespace Burst.Compiler.IL.Tests { #if UNITY_2021_2_OR_NEWER || BURST_INTERNAL /// /// Test . /// internal partial class ReadOnlySpan { [TestCompiler] public static int CreateDefault() { var span = new ReadOnlySpan(); return span.Length; } [TestCompiler] public static int CreateStackalloc() { ReadOnlySpan span = stackalloc int[42]; return span.Length; } [TestCompiler(42)] public static int CreateFromNullPointer(int size) { ReadOnlySpan span; unsafe { span = new ReadOnlySpan(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; var span = new ReadOnlySpan(malloc, 1); double result = span[0]; UnsafeUtility.Free(malloc, Unity.Collections.Allocator.Persistent); return result; } [TestCompiler] public static int GetItem() { ReadOnlySpan span = stackalloc int[42]; return span[41]; } [TestCompiler] public static int SliceFromStart() { ReadOnlySpan span = stackalloc int[42]; var newSpan = span.Slice(10); return newSpan[0] + newSpan.Length; } [TestCompiler] public static int SliceFromStartWithLength() { ReadOnlySpan span = stackalloc int[42]; 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; } ReadOnlySpan other = stackalloc int[4]; other.CopyTo(span); int result = 0; for (int i = 0; i < span.Length; i++) { result += span[i]; } return result; } [TestCompiler] public static int IsEmpty() => new ReadOnlySpan().IsEmpty ? 1 : 0; [TestCompiler] public static int Empty() => ReadOnlySpan.Empty.Length; [TestCompiler] public static int GetEnumerator() { ReadOnlySpan 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 ReadOnlySpan() == ReadOnlySpan.Empty ? 1 : 0; [TestCompiler] public static int OperatorInEquality() => new ReadOnlySpan() != ReadOnlySpan.Empty ? 1 : 0; [TestCompiler] public static int Fixed() { Span span = stackalloc int[42]; for (int i = 0; i < span.Length; i++) { span[i] = i; } ReadOnlySpan readOnlySpan = span; unsafe { fixed (int* ptr = readOnlySpan) { return ptr[41]; } } } } #endif }