using Misaki.HighPerformance.Unsafe.Collections.Contracts; namespace Misaki.HighPerformance.Unsafe.Helpers; public unsafe static class UnsafeCollectionExtensions { /// /// Copies elements from a source UnsafeCollection to a destination Span, ensuring both have the same size. /// /// Specifies the type of elements being copied, which must be unmanaged. /// Represents the source collection from which elements are copied. /// Represents the target span where elements are copied to. /// Thrown when the sizes of the source collection and destination span do not match. public static void CopyTo(this IUnsafeCollection source, Span destination) where T : unmanaged { if (source.Size > destination.Length) { throw new ArgumentException("Source collection is larger than the destination span."); } fixed (T* ptr = destination) { SystemUnsfae.CopyBlock(ptr, source.Buffer, (uint)(source.Size * sizeof(T))); } } /// /// Copies elements from a source span to a destination unsafe collection, ensuring both have the same size. /// /// Specifies the type of elements being copied, which must be unmanaged. /// Represents the unsafe collection that will receive the copied elements. /// Represents the span containing the elements to be copied to the unsafe collection. /// Thrown when the source span and destination collection have different sizes. public static void CopyFrom(this IUnsafeCollection destination, Span source) where T : unmanaged { if (destination.Size > source.Length) { throw new ArgumentException("Destination collection is larger than the source span."); } fixed (T* ptr = source) { SystemUnsfae.CopyBlock(destination.Buffer, ptr, (uint)(source.Length * sizeof(T))); } } /// /// Converts an UnsafeCollection of unmanaged types into a standard collection. /// /// Represents a type that is unmanaged, allowing for direct memory manipulation. /// The UnsafeCollection instance that contains the data to be converted. /// A new collection containing the elements from the UnsafeCollection. public static T[] ToArray(this IUnsafeCollection source) where T : unmanaged { var array = new T[source.Size]; fixed (T* ptr = array) { SystemUnsfae.CopyBlock(ptr, source.Buffer, (uint)(source.Size * sizeof(T))); } return array; } /// /// Converts an unmanaged collection into a list by copying its elements into a new list. /// /// Represents a type that is unmanaged, allowing for direct memory manipulation. /// The collection from which elements are copied to create the new list. /// A list containing the elements from the specified unmanaged collection. public static List ToList(this IUnsafeCollection source) where T : unmanaged { var list = new List(source.Size); fixed (T* ptr = list.ToArray()) { SystemUnsfae.CopyBlock(ptr, source.Buffer, (uint)(source.Size * sizeof(T))); } return list; } /// /// Converts an UnsafeCollection into a Span for efficient memory access. /// /// Represents a type that can be stored in unmanaged memory. /// The UnsafeCollection instance to be converted into a Span. /// A Span that provides a view over the elements of the UnsafeCollection. public static Span AsSpan(this IUnsafeCollection source) where T : unmanaged { return new(source.Buffer, source.Size); } }