From a32b0668de94f84ec56293d4e58f73c6f40828de Mon Sep 17 00:00:00 2001 From: Misaki Date: Wed, 25 Mar 2026 17:37:21 +0900 Subject: [PATCH] feat(collections): add implicit conversions and AddRange overloads Added implicit conversion operators to UnsafeArray and UnsafeList for easier conversion to ReadOnlyUnsafeCollection and Span. Introduced new AddRange overloads in UnsafeList for ReadOnlyUnsafeCollection and pointer-based sources. Updated AssemblyVersion in all projects. Improved MemoryLeakException stack trace output and fixed a documentation comment. --- ...ki.HighPerformance.Analyzer.Package.csproj | 2 +- .../Collections/UnsafeArray.cs | 11 +++++ .../Collections/UnsafeList.cs | 43 ++++++++++++++++++- .../MemoryLeakException.cs | 2 +- .../Misaki.HighPerformance.LowLevel.csproj | 2 +- .../Misaki.HighPerformance.csproj | 2 +- 6 files changed, 57 insertions(+), 5 deletions(-) diff --git a/Misaki.HighPerformance.Analyzer/Misaki.HighPerformance.Analyzer.Package/Misaki.HighPerformance.Analyzer.Package.csproj b/Misaki.HighPerformance.Analyzer/Misaki.HighPerformance.Analyzer.Package/Misaki.HighPerformance.Analyzer.Package.csproj index c290a5d..2d8e237 100644 --- a/Misaki.HighPerformance.Analyzer/Misaki.HighPerformance.Analyzer.Package/Misaki.HighPerformance.Analyzer.Package.csproj +++ b/Misaki.HighPerformance.Analyzer/Misaki.HighPerformance.Analyzer.Package/Misaki.HighPerformance.Analyzer.Package.csproj @@ -5,7 +5,7 @@ False True True - 1.0.0 + 1.1.0 diff --git a/Misaki.HighPerformance.LowLevel/Collections/UnsafeArray.cs b/Misaki.HighPerformance.LowLevel/Collections/UnsafeArray.cs index e4124a6..4e68763 100644 --- a/Misaki.HighPerformance.LowLevel/Collections/UnsafeArray.cs +++ b/Misaki.HighPerformance.LowLevel/Collections/UnsafeArray.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Diagnostics; using System.Drawing; using System.Runtime.CompilerServices; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace Misaki.HighPerformance.LowLevel.Collections; @@ -319,4 +320,14 @@ public unsafe struct UnsafeArray : IUnsafeCollection _buffer = null; _count = 0; } + + public static implicit operator ReadOnlyUnsafeCollection(UnsafeArray array) + { + return array.AsReadOnly(); + } + + public static implicit operator Span(UnsafeArray array) + { + return array.AsSpan(); + } } diff --git a/Misaki.HighPerformance.LowLevel/Collections/UnsafeList.cs b/Misaki.HighPerformance.LowLevel/Collections/UnsafeList.cs index 69c8ff2..101ae87 100644 --- a/Misaki.HighPerformance.LowLevel/Collections/UnsafeList.cs +++ b/Misaki.HighPerformance.LowLevel/Collections/UnsafeList.cs @@ -346,7 +346,7 @@ public unsafe struct UnsafeList : IUnsafeCollection /// /// Adds a range of elements to the collection. /// - /// A span containing the elements to add. The span must not exceed the specified . + /// A span containing the elements to add. public void AddRange(Span values) { var newSize = _count + values.Length; @@ -363,6 +363,32 @@ public unsafe struct UnsafeList : IUnsafeCollection _count += values.Length; } + /// + /// Adds a range of elements to the collection. + /// + /// A collection containing the elements to add. + public void AddRange(ReadOnlyUnsafeCollection collection) + { + AddRange((T*)collection.GetUnsafePtr(), collection.Count); + } + + /// + /// Adds a range of elements from a pointer to the collection. + /// + /// Points to the source data to be copied into the collection. + /// Indicates the number of elements to be added from the source data. + public void AddRange(T* ptr, int count) + { + var newSize = _count + count; + if (newSize > Capacity) + { + Resize(Capacity + count); + } + + MemCpy(UnsafeUtility.ReadArrayElementUnsafe(_array.GetUnsafePtr(), _count), ptr, (uint)(count * sizeof(T))); + _count += count; + } + /// /// Adds the elements of the specified collection to the current list without resizing the underlying storage. /// @@ -494,4 +520,19 @@ public unsafe struct UnsafeList : IUnsafeCollection _array.Dispose(); _count = 0; } + + public static implicit operator UnsafeArray(UnsafeList list) + { + return list.AsUnsafeArray(); + } + + public static implicit operator ReadOnlyUnsafeCollection(UnsafeList list) + { + return list.AsReadOnly(); + } + + public static implicit operator Span(UnsafeList list) + { + return list.AsSpan(); + } } diff --git a/Misaki.HighPerformance.LowLevel/MemoryLeakException.cs b/Misaki.HighPerformance.LowLevel/MemoryLeakException.cs index 5dfd62b..e0f2a71 100644 --- a/Misaki.HighPerformance.LowLevel/MemoryLeakException.cs +++ b/Misaki.HighPerformance.LowLevel/MemoryLeakException.cs @@ -48,7 +48,7 @@ public class MemoryLeakException : Exception var frame = stackTrace.GetFrame(i); var fileName = frame?.GetFileName(); - if (frame != null && fileName != null) + if (frame != null) { stringBuilder.AppendLine($"File: {fileName}, Method: {DiagnosticMethodInfo.Create(frame)?.Name}, Line: {frame.GetFileLineNumber()}"); } diff --git a/Misaki.HighPerformance.LowLevel/Misaki.HighPerformance.LowLevel.csproj b/Misaki.HighPerformance.LowLevel/Misaki.HighPerformance.LowLevel.csproj index 5375c33..5829706 100644 --- a/Misaki.HighPerformance.LowLevel/Misaki.HighPerformance.LowLevel.csproj +++ b/Misaki.HighPerformance.LowLevel/Misaki.HighPerformance.LowLevel.csproj @@ -7,7 +7,7 @@ true true Misaki - 1.5.2 + 1.5.3 $(AssemblyVersion) https://git.personalnas.com/Misaki/Misaki.HighPerformance.git https://git.personalnas.com/Misaki/Misaki.HighPerformance.git diff --git a/Misaki.HighPerformance/Misaki.HighPerformance.csproj b/Misaki.HighPerformance/Misaki.HighPerformance.csproj index b1e1940..977088c 100644 --- a/Misaki.HighPerformance/Misaki.HighPerformance.csproj +++ b/Misaki.HighPerformance/Misaki.HighPerformance.csproj @@ -7,7 +7,7 @@ True true Misaki - 1.0.4 + 1.0.5 $(AssemblyVersion) https://git.personalnas.com/Misaki/Misaki.HighPerformance.git https://git.personalnas.com/Misaki/Misaki.HighPerformance.git