94 lines
3.1 KiB
C#
94 lines
3.1 KiB
C#
|
using System;
|
||
|
|
||
|
namespace Unity.Collections.LowLevel.Unsafe.NotBurstCompatible
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Provides some extension methods for various collections.
|
||
|
/// </summary>
|
||
|
public static class Extensions
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Returns a new managed array with all the elements copied from a set.
|
||
|
/// </summary>
|
||
|
/// <typeparam name="T">The type of elements.</typeparam>
|
||
|
/// <param name="set">The set whose elements are copied to the array.</param>
|
||
|
/// <returns>A new managed array with all the elements copied from a set.</returns>
|
||
|
public static T[] ToArray<T>(this UnsafeParallelHashSet<T> set)
|
||
|
where T : unmanaged, IEquatable<T>
|
||
|
{
|
||
|
var array = set.ToNativeArray(Allocator.TempJob);
|
||
|
var managed = array.ToArray();
|
||
|
array.Dispose();
|
||
|
return managed;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Adds the content of a string to this append buffer.
|
||
|
/// </summary>
|
||
|
/// <remarks>The length of the string is written as an int to the buffer before the characters are written.</remarks>
|
||
|
/// <param name="buffer">The buffer to which to add the string.</param>
|
||
|
/// <param name="value">The string to copy.</param>
|
||
|
[NotBurstCompatible]
|
||
|
public static unsafe void AddNBC(ref this UnsafeAppendBuffer buffer, string value)
|
||
|
{
|
||
|
if (value != null)
|
||
|
{
|
||
|
buffer.Add(value.Length);
|
||
|
fixed (char* ptr = value)
|
||
|
{
|
||
|
buffer.Add(ptr, sizeof(char) * value.Length);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
buffer.Add(-1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Returns an unmanaged byte array with a copy of this buffer's contents.
|
||
|
/// </summary>
|
||
|
/// <param name="buffer">This buffer.</param>
|
||
|
/// <returns>An unmanaged byte array with a copy of this buffer's contents.</returns>
|
||
|
[NotBurstCompatible]
|
||
|
public static unsafe byte[] ToBytesNBC(ref this UnsafeAppendBuffer buffer)
|
||
|
{
|
||
|
var dst = new byte[buffer.Length];
|
||
|
fixed (byte* dstPtr = dst)
|
||
|
{
|
||
|
UnsafeUtility.MemCpy(dstPtr, buffer.Ptr, buffer.Length);
|
||
|
}
|
||
|
return dst;
|
||
|
}
|
||
|
|
||
|
#if !NET_DOTS
|
||
|
/// <summary>
|
||
|
/// Reads a string from this buffer reader.
|
||
|
/// </summary>
|
||
|
/// <param name="value">Outputs the string.</param>
|
||
|
/// <param name="reader">This reader.</param>
|
||
|
[NotBurstCompatible]
|
||
|
public static unsafe void ReadNextNBC(ref this UnsafeAppendBuffer.Reader reader, out string value)
|
||
|
{
|
||
|
int length;
|
||
|
reader.ReadNext(out length);
|
||
|
|
||
|
if (length != -1)
|
||
|
{
|
||
|
value = new string('0', length);
|
||
|
|
||
|
fixed (char* buf = value)
|
||
|
{
|
||
|
int bufLen = length * sizeof(char);
|
||
|
UnsafeUtility.MemCpy(buf, reader.ReadNext(bufLen), bufLen);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
value = null;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|