using Unity.Collections.LowLevel.Unsafe; using Unity.Collections; using System; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// namespace Rukhanka.Toolbox { public static class CollectionUtils { public static unsafe NativeArray AsArray(this NativeSlice v) where T: unmanaged { var ptr = v.GetUnsafePtr(); var rv = CollectionHelper.ConvertExistingDataToNativeArray(ptr, v.Length, Allocator.None, true); return rv; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static unsafe UnsafeList AsUnsafeList(this NativeSlice v) where T: unmanaged { var ptr = (T*)v.GetUnsafePtr(); var rv = new UnsafeList(ptr, v.Length); return rv; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void ValidateSpanCreationParameters(this NativeList v, int startIndex, int length) where T: unmanaged { if (startIndex >= v.Length) { throw new InvalidOperationException($"Requested span start index exceed list size (Start index {startIndex}, list length {v.Length})!"); } if (startIndex + length > v.Length) { throw new InvalidOperationException($"Requested span exceed end of list (Start index {startIndex}, requested length {length}, list length {v.Length})!"); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static unsafe Span GetSpan(this NativeList v, int startIndex, int length) where T: unmanaged { #if ENABLE_UNITY_COLLECTIONS_CHECKS ValidateSpanCreationParameters(v, startIndex, length); #endif var rv = new Span(v.GetUnsafePtr() + startIndex, length); return rv; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static unsafe ReadOnlySpan GetReadOnlySpan(this NativeList v, int startIndex, int length) where T: unmanaged { #if ENABLE_UNITY_COLLECTIONS_CHECKS ValidateSpanCreationParameters(v, startIndex, length); #endif var rv = new ReadOnlySpan(v.GetUnsafeReadOnlyPtr() + startIndex, length); return rv; } ///////////////////////////////////////////////////////////////////////////////// public static unsafe Span AsSpan(this UnsafeList l) where T: unmanaged { var rv = new Span(l.Ptr, l.Length); return rv; } } }