A game about forced loneliness, made by TACStudios
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}