No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DataStreamExtensions.cs 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. namespace 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. /// <summary>
  24. /// Appends a specified number of bytes from the buffer to the data stream.
  25. /// </summary>
  26. /// <param name="writer">Data stream writer.</param>
  27. /// <param name="data">Pointer to the data.</param>
  28. /// <param name="bytes">A positive number of bytes to write.</param>
  29. /// <returns>Whether the write was successful</returns>
  30. public static unsafe bool WriteBytesUnsafe(this ref DataStreamWriter writer, byte* data, int bytes)
  31. {
  32. var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, bytes, Allocator.None);
  33. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  34. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
  35. #endif
  36. return writer.WriteBytes(dataArray);
  37. }
  38. /// <summary>
  39. /// Read and copy data to the memory location pointed to, an error will
  40. /// be logged if the <paramref name="length"/> will put the reader out of bounds on the current read pointer.
  41. /// </summary>
  42. /// <param name="reader">Data stream reader.</param>
  43. /// <param name="data">Pointer to the data.</param>
  44. /// <param name="length">Number of bytes to read.</param>
  45. public static unsafe void ReadBytesUnsafe(this ref DataStreamReader reader, byte* data, int length)
  46. {
  47. var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, length, Allocator.None);
  48. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  49. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
  50. #endif
  51. reader.ReadBytes(dataArray);
  52. }
  53. /// <summary>
  54. /// Reads a 2-byte length value from the current stream, reads the specified number of bytes
  55. /// to the buffer and advances the current position of the stream by the length of the string.
  56. /// </summary>
  57. /// <param name="reader">Data stream reader.</param>
  58. /// <param name="data">Buffer to write the string bytes to.</param>
  59. /// <param name="maxLength">Max number of bytes allowed to be read into the buffer.</param>
  60. /// <returns>The number of bytes written to the data buffer.</returns>
  61. public static unsafe ushort ReadFixedStringUnsafe(this ref DataStreamReader reader, byte* data, int maxLength)
  62. {
  63. var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp);
  64. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  65. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
  66. #endif
  67. return reader.ReadFixedString(dataArray);
  68. }
  69. /// <summary>
  70. /// Writes a delta FixedString value to the data stream using a <see cref="StreamCompressionModel"/>.
  71. ///
  72. /// If the value cannot be written <see cref="DataStreamReader.HasFailedReads"/> will return true.
  73. /// </summary>
  74. /// <param name="reader">Data stream reader.</param>
  75. /// <param name="data">Pointer to a packed fixed string.</param>
  76. /// <param name="maxLength">Max number of bytes allowed to be read into the pointer.</param>
  77. /// <param name="baseData">Pointer to the previous value, used to compute the diff.</param>
  78. /// <param name="baseLength">The length of the previous value.</param>
  79. /// <param name="model"><see cref="StreamCompressionModel"/> model for writing value in a packed manner.</param>
  80. /// <returns>Whether the write was successful</returns>
  81. public static unsafe ushort ReadPackedFixedStringDeltaUnsafe(this ref DataStreamReader reader, byte* data, int maxLength, byte* baseData, ushort baseLength, StreamCompressionModel model)
  82. {
  83. var current = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp);
  84. var baseline = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(baseData, baseLength, Allocator.Temp);
  85. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  86. var safetyHandle = AtomicSafetyHandle.GetTempMemoryHandle();
  87. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref current, safetyHandle);
  88. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref baseline, safetyHandle);
  89. #endif
  90. return reader.ReadPackedFixedStringDelta(current, baseline, model);
  91. }
  92. /// <summary>
  93. /// Get a pointer to the stream's data. Note that the pointer always points at the
  94. /// beginning of the data, no matter how much was read from the stream.
  95. /// </summary>
  96. /// <remarks>Performs a job safety check for read-only access.</remarks>
  97. /// <param name="reader">Data stream reader.</param>
  98. /// <returns>A pointer to the stream's data.</returns>
  99. public static unsafe void* GetUnsafeReadOnlyPtr(this ref DataStreamReader reader)
  100. {
  101. reader.CheckRead();
  102. return reader.m_BufferPtr;
  103. }
  104. }
  105. }