using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; namespace UnityEngine.Collections { // Token: 0x020004C7 RID: 1223 [NativeContainer] [NativeContainerSupportsMinMaxWriteRestriction] [DebuggerDisplay("Length = {Length}")] [DebuggerTypeProxy(typeof(NativeArrayDebugView<>))] public struct NativeArray : IDisposable, IEnumerable, IEnumerable where T : struct { // Token: 0x06003BB5 RID: 15285 RVA: 0x00068D54 File Offset: 0x00066F54 public NativeArray(int length, Allocator allocMode) { NativeArray.Allocate(length, allocMode, out this); } // Token: 0x06003BB6 RID: 15286 RVA: 0x00068D60 File Offset: 0x00066F60 public NativeArray(T[] array, Allocator allocMode) { if (array == null) { throw new ArgumentNullException("array"); } NativeArray.Allocate(array.Length, allocMode, out this); this.FromArray(array); } // Token: 0x06003BB7 RID: 15287 RVA: 0x00068D88 File Offset: 0x00066F88 internal NativeArray(IntPtr dataPointer, int length) { this = new NativeArray(dataPointer, length, Allocator.None); } // Token: 0x06003BB8 RID: 15288 RVA: 0x00068D94 File Offset: 0x00066F94 internal NativeArray(IntPtr dataPointer, int length, int stride, AtomicSafetyHandle safety, Allocator allocMode) { this.m_Buffer = dataPointer; this.m_Length = length; this.m_Stride = stride; this.m_AllocatorLabel = allocMode; } // Token: 0x06003BB9 RID: 15289 RVA: 0x00068DB4 File Offset: 0x00066FB4 private NativeArray(IntPtr dataPointer, int length, Allocator allocMode) { if (dataPointer == IntPtr.Zero) { throw new ArgumentOutOfRangeException("dataPointer", "Pointer must not be zero"); } if (length < 0) { throw new ArgumentOutOfRangeException("length", "Length must be >= 0"); } this.m_Buffer = dataPointer; this.m_Length = length; this.m_Stride = UnsafeUtility.SizeOf(); this.m_AllocatorLabel = allocMode; } // Token: 0x17000D85 RID: 3461 // (get) Token: 0x06003BBA RID: 15290 RVA: 0x00068E1C File Offset: 0x0006701C public int Length { get { return this.m_Length; } } // Token: 0x17000D86 RID: 3462 public T this[int index] { get { if (index >= this.m_Length) { this.FailOutOfRangeError(index); } return UnsafeUtility.ReadArrayElement(this.m_Buffer, index * this.m_Stride); } set { if (index >= this.m_Length) { this.FailOutOfRangeError(index); } UnsafeUtility.WriteArrayElement(this.m_Buffer, index * this.m_Stride, value); } } // Token: 0x06003BBD RID: 15293 RVA: 0x00068EA0 File Offset: 0x000670A0 public void Dispose() { UnsafeUtility.Free(this.m_Buffer, this.m_AllocatorLabel); this.m_Buffer = IntPtr.Zero; this.m_Length = 0; } // Token: 0x06003BBE RID: 15294 RVA: 0x00068EC8 File Offset: 0x000670C8 public IntPtr GetUnsafeReadBufferPtr() { return this.m_Buffer; } // Token: 0x06003BBF RID: 15295 RVA: 0x00068EE4 File Offset: 0x000670E4 public IntPtr GetUnsafeWriteBufferPtr() { return this.m_Buffer; } // Token: 0x06003BC0 RID: 15296 RVA: 0x00068F00 File Offset: 0x00067100 public void FromArray(T[] array) { if (this.Length != array.Length) { throw new ArgumentException("Array length does not match the length of this instance"); } for (int i = 0; i < this.Length; i++) { UnsafeUtility.WriteArrayElement(this.m_Buffer, i * this.m_Stride, array[i]); } } // Token: 0x06003BC1 RID: 15297 RVA: 0x00068F58 File Offset: 0x00067158 public T[] ToArray() { T[] array = new T[this.Length]; for (int i = 0; i < this.Length; i++) { array[i] = UnsafeUtility.ReadArrayElement(this.m_Buffer, i * this.m_Stride); } return array; } // Token: 0x06003BC2 RID: 15298 RVA: 0x00068FAC File Offset: 0x000671AC private void FailOutOfRangeError(int index) { throw new IndexOutOfRangeException(string.Format("Index {0} is out of range of '{1}' Length.", index, this.Length)); } // Token: 0x06003BC3 RID: 15299 RVA: 0x00068FD0 File Offset: 0x000671D0 private static void Allocate(int length, Allocator allocMode, out NativeArray outArray) { if (allocMode <= Allocator.None) { throw new ArgumentOutOfRangeException("allocMode", "Allocator must be Temp, Job or Persistent"); } if (length < 0) { throw new ArgumentOutOfRangeException("length", "Length must be >= 0"); } long num = (long)UnsafeUtility.SizeOf() * (long)length; if (num > 2147483647L) { throw new ArgumentOutOfRangeException("length", "Length * sizeof(T) cannot exceed " + int.MaxValue + "bytes"); } outArray = new NativeArray(UnsafeUtility.Malloc((int)num, UnsafeUtility.AlignOf(), allocMode), length, allocMode); } // Token: 0x06003BC4 RID: 15300 RVA: 0x0006905C File Offset: 0x0006725C public IEnumerator GetEnumerator() { return new NativeArray.Enumerator(ref this); } // Token: 0x06003BC5 RID: 15301 RVA: 0x0006907C File Offset: 0x0006727C IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } // Token: 0x040011EF RID: 4591 private IntPtr m_Buffer; // Token: 0x040011F0 RID: 4592 private int m_Length; // Token: 0x040011F1 RID: 4593 private int m_Stride; // Token: 0x040011F2 RID: 4594 private readonly Allocator m_AllocatorLabel; // Token: 0x020004C8 RID: 1224 public struct Enumerator : IEnumerator, IDisposable, IEnumerator { // Token: 0x06003BC6 RID: 15302 RVA: 0x00069098 File Offset: 0x00067298 public Enumerator(ref NativeArray array) { this.array = array; this.index = -1; } // Token: 0x06003BC7 RID: 15303 RVA: 0x000690B0 File Offset: 0x000672B0 public void Dispose() { } // Token: 0x06003BC8 RID: 15304 RVA: 0x000690B4 File Offset: 0x000672B4 public bool MoveNext() { this.index++; return this.index < this.array.Length; } // Token: 0x06003BC9 RID: 15305 RVA: 0x000690EC File Offset: 0x000672EC public void Reset() { this.index = -1; } // Token: 0x17000D88 RID: 3464 // (get) Token: 0x06003BCA RID: 15306 RVA: 0x000690F8 File Offset: 0x000672F8 public T Current { get { return this.array[this.index]; } } // Token: 0x17000D87 RID: 3463 // (get) Token: 0x06003BCB RID: 15307 RVA: 0x00069120 File Offset: 0x00067320 object IEnumerator.Current { get { return this.Current; } } // Token: 0x040011F3 RID: 4595 private NativeArray array; // Token: 0x040011F4 RID: 4596 private int index; } } }