forked from BilalY/Rasagar
112 lines
5.9 KiB
C#
112 lines
5.9 KiB
C#
namespace Unity.Collections.LowLevel.Unsafe
|
|
{
|
|
/// <summary>
|
|
/// Extension methods for DataStream.
|
|
/// </summary>
|
|
[GenerateTestsForBurstCompatibility]
|
|
public static class DataStreamExtensions
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of the DataStreamWriter struct with externally owned memory
|
|
/// </summary>
|
|
/// <param name="data">Pointer to the data</param>
|
|
/// <param name="length">Length of the data</param>
|
|
/// <returns>A new instance of the <see cref="DataStreamWriter"/></returns>
|
|
public static unsafe DataStreamWriter Create(byte* data, int length)
|
|
{
|
|
var na = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, length, Allocator.None);
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref na, AtomicSafetyHandle.GetTempMemoryHandle());
|
|
#endif
|
|
return new DataStreamWriter(na);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Appends a specified number of bytes from the buffer to the data stream.
|
|
/// </summary>
|
|
/// <param name="writer">Data stream writer.</param>
|
|
/// <param name="data">Pointer to the data.</param>
|
|
/// <param name="bytes">A positive number of bytes to write.</param>
|
|
/// <returns>Whether the write was successful</returns>
|
|
public static unsafe bool WriteBytesUnsafe(this ref DataStreamWriter writer, byte* data, int bytes)
|
|
{
|
|
var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, bytes, Allocator.None);
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
|
|
#endif
|
|
return writer.WriteBytes(dataArray);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read and copy data to the memory location pointed to, an error will
|
|
/// be logged if the <paramref name="length"/> will put the reader out of bounds on the current read pointer.
|
|
/// </summary>
|
|
/// <param name="reader">Data stream reader.</param>
|
|
/// <param name="data">Pointer to the data.</param>
|
|
/// <param name="length">Number of bytes to read.</param>
|
|
public static unsafe void ReadBytesUnsafe(this ref DataStreamReader reader, byte* data, int length)
|
|
{
|
|
var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, length, Allocator.None);
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
|
|
#endif
|
|
reader.ReadBytes(dataArray);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Reads a 2-byte length value from the current stream, reads the specified number of bytes
|
|
/// to the buffer and advances the current position of the stream by the length of the string.
|
|
/// </summary>
|
|
/// <param name="reader">Data stream reader.</param>
|
|
/// <param name="data">Buffer to write the string bytes to.</param>
|
|
/// <param name="maxLength">Max number of bytes allowed to be read into the buffer.</param>
|
|
/// <returns>The number of bytes written to the data buffer.</returns>
|
|
public static unsafe ushort ReadFixedStringUnsafe(this ref DataStreamReader reader, byte* data, int maxLength)
|
|
{
|
|
var dataArray = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp);
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref dataArray, AtomicSafetyHandle.GetTempMemoryHandle());
|
|
#endif
|
|
return reader.ReadFixedString(dataArray);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a delta FixedString value to the data stream using a <see cref="StreamCompressionModel"/>.
|
|
///
|
|
/// If the value cannot be written <see cref="DataStreamReader.HasFailedReads"/> will return true.
|
|
/// </summary>
|
|
/// <param name="reader">Data stream reader.</param>
|
|
/// <param name="data">Pointer to a packed fixed string.</param>
|
|
/// <param name="maxLength">Max number of bytes allowed to be read into the pointer.</param>
|
|
/// <param name="baseData">Pointer to the previous value, used to compute the diff.</param>
|
|
/// <param name="baseLength">The length of the previous value.</param>
|
|
/// <param name="model"><see cref="StreamCompressionModel"/> model for writing value in a packed manner.</param>
|
|
/// <returns>Whether the write was successful</returns>
|
|
public static unsafe ushort ReadPackedFixedStringDeltaUnsafe(this ref DataStreamReader reader, byte* data, int maxLength, byte* baseData, ushort baseLength, StreamCompressionModel model)
|
|
{
|
|
var current = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, maxLength, Allocator.Temp);
|
|
var baseline = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(baseData, baseLength, Allocator.Temp);
|
|
#if ENABLE_UNITY_COLLECTIONS_CHECKS
|
|
var safetyHandle = AtomicSafetyHandle.GetTempMemoryHandle();
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref current, safetyHandle);
|
|
NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref baseline, safetyHandle);
|
|
#endif
|
|
return reader.ReadPackedFixedStringDelta(current, baseline, model);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get a pointer to the stream's data. Note that the pointer always points at the
|
|
/// beginning of the data, no matter how much was read from the stream.
|
|
/// </summary>
|
|
/// <remarks>Performs a job safety check for read-only access.</remarks>
|
|
/// <param name="reader">Data stream reader.</param>
|
|
/// <returns>A pointer to the stream's data.</returns>
|
|
public static unsafe void* GetUnsafeReadOnlyPtr(this ref DataStreamReader reader)
|
|
{
|
|
reader.CheckRead();
|
|
return reader.m_BufferPtr;
|
|
}
|
|
}
|
|
}
|