A game about forced loneliness, made by TACStudios
at master 111 lines 6.1 kB view raw
1namespace Unity.Collections.LowLevel.Unsafe 2{ 3 /// <summary> 4 /// Extension methods for DataStream. 5 /// </summary> 6 [GenerateTestsForBurstCompatibility] 7 public static class DataStreamExtensions 8 { 9 /// <summary> 10 /// Initializes a new instance of the DataStreamWriter struct with externally owned memory 11 /// </summary> 12 /// <param name="data">Pointer to the data</param> 13 /// <param name="length">Length of the data</param> 14 /// <returns>A new instance of the <see cref="DataStreamWriter"/></returns> 15 public static unsafe DataStreamWriter Create(byte* data, int length) 16 { 17 var na = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, length, Allocator.None); 18#if ENABLE_UNITY_COLLECTIONS_CHECKS 19 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref na, AtomicSafetyHandle.GetTempMemoryHandle()); 20#endif 21 return new DataStreamWriter(na); 22 } 23 24 /// <summary> 25 /// Appends a specified number of bytes from the buffer to the data stream. 26 /// </summary> 27 /// <param name="writer">Data stream writer.</param> 28 /// <param name="data">Pointer to the data.</param> 29 /// <param name="bytes">A positive number of bytes to write.</param> 30 /// <returns>Whether the write was successful</returns> 31 public static unsafe bool WriteBytesUnsafe(this ref DataStreamWriter writer, byte* data, int bytes) 32 { 33 var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, bytes, Allocator.None); 34#if ENABLE_UNITY_COLLECTIONS_CHECKS 35 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle()); 36#endif 37 return writer.WriteBytes(dataArray); 38 } 39 40 /// <summary> 41 /// Read and copy data to the memory location pointed to, an error will 42 /// be logged if the <paramref name="length"/> will put the reader out of bounds on the current read pointer. 43 /// </summary> 44 /// <param name="reader">Data stream reader.</param> 45 /// <param name="data">Pointer to the data.</param> 46 /// <param name="length">Number of bytes to read.</param> 47 public static unsafe void ReadBytesUnsafe(this ref DataStreamReader reader, byte* data, int length) 48 { 49 var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, length, Allocator.None); 50#if ENABLE_UNITY_COLLECTIONS_CHECKS 51 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle()); 52#endif 53 reader.ReadBytes(dataArray); 54 } 55 56 57 /// <summary> 58 /// Reads a 2-byte length value from the current stream, reads the specified number of bytes 59 /// to the buffer and advances the current position of the stream by the length of the string. 60 /// </summary> 61 /// <param name="reader">Data stream reader.</param> 62 /// <param name="data">Buffer to write the string bytes to.</param> 63 /// <param name="maxLength">Max number of bytes allowed to be read into the buffer.</param> 64 /// <returns>The number of bytes written to the data buffer.</returns> 65 public static unsafe ushort ReadFixedStringUnsafe(this ref DataStreamReader reader, byte* data, int maxLength) 66 { 67 var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp); 68#if ENABLE_UNITY_COLLECTIONS_CHECKS 69 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle()); 70#endif 71 return reader.ReadFixedString(dataArray); 72 } 73 74 /// <summary> 75 /// Writes a delta FixedString value to the data stream using a <see cref="StreamCompressionModel"/>. 76 /// 77 /// If the value cannot be written <see cref="DataStreamReader.HasFailedReads"/> will return true. 78 /// </summary> 79 /// <param name="reader">Data stream reader.</param> 80 /// <param name="data">Pointer to a packed fixed string.</param> 81 /// <param name="maxLength">Max number of bytes allowed to be read into the pointer.</param> 82 /// <param name="baseData">Pointer to the previous value, used to compute the diff.</param> 83 /// <param name="baseLength">The length of the previous value.</param> 84 /// <param name="model"><see cref="StreamCompressionModel"/> model for writing value in a packed manner.</param> 85 /// <returns>Whether the write was successful</returns> 86 public static unsafe ushort ReadPackedFixedStringDeltaUnsafe(this ref DataStreamReader reader, byte* data, int maxLength, byte* baseData, ushort baseLength, StreamCompressionModel model) 87 { 88 var current = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp); 89 var baseline = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(baseData, baseLength, Allocator.Temp); 90#if ENABLE_UNITY_COLLECTIONS_CHECKS 91 var safetyHandle = AtomicSafetyHandle.GetTempMemoryHandle(); 92 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref current, safetyHandle); 93 NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref baseline, safetyHandle); 94#endif 95 return reader.ReadPackedFixedStringDelta(current, baseline, model); 96 } 97 98 /// <summary> 99 /// Get a pointer to the stream's data. Note that the pointer always points at the 100 /// beginning of the data, no matter how much was read from the stream. 101 /// </summary> 102 /// <remarks>Performs a job safety check for read-only access.</remarks> 103 /// <param name="reader">Data stream reader.</param> 104 /// <returns>A pointer to the stream's data.</returns> 105 public static unsafe void* GetUnsafeReadOnlyPtr(this ref DataStreamReader reader) 106 { 107 reader.CheckRead(); 108 return reader.m_BufferPtr; 109 } 110 } 111}