using System; namespace Unity.Collections.LowLevel.Unsafe.NotBurstCompatible { /// /// Provides some extension methods for various collections. /// public static class Extensions { /// /// Returns a new managed array with all the elements copied from a set. /// /// The type of elements. /// The set whose elements are copied to the array. /// A new managed array with all the elements copied from a set. public static T[] ToArray(this UnsafeParallelHashSet set) where T : unmanaged, IEquatable { var array = set.ToNativeArray(Allocator.TempJob); var managed = array.ToArray(); array.Dispose(); return managed; } /// /// Adds the content of a string to this append buffer. /// /// The length of the string is written as an int to the buffer before the characters are written. /// The buffer to which to add the string. /// The string to copy. [ExcludeFromBurstCompatTesting("Takes managed string")] 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); } } /// /// Returns an unmanaged byte array with a copy of this buffer's contents. /// /// This buffer. /// An unmanaged byte array with a copy of this buffer's contents. [ExcludeFromBurstCompatTesting("Returns managed array")] 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; } /// /// Reads a string from this buffer reader. /// /// Outputs the string. /// This reader. [ExcludeFromBurstCompatTesting("Managed string out argument")] 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; } } } }