diff --git a/src/SharpArena/Collections/ArenaUtf8String.cs b/src/SharpArena/Collections/ArenaUtf8String.cs index a35bb13..dd9ebc5 100644 --- a/src/SharpArena/Collections/ArenaUtf8String.cs +++ b/src/SharpArena/Collections/ArenaUtf8String.cs @@ -118,6 +118,34 @@ public static ArenaUtf8String Clone(string? src, ArenaAllocator arena) return new ArenaUtf8String(arena, dest, byteCount); } + /// + /// Clones the provided span into arena-managed memory. + /// + /// The source string to copy + /// Allocator providing unmanaged storage. + /// An referencing the cloned bytes. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ArenaUtf8String Clone(ReadOnlySpan src, ArenaAllocator arena) + { + if (src.IsEmpty) + { + return default; + } + + var byteCount = Encoding.UTF8.GetByteCount(src); + if (byteCount == 0) + { + return default; + } + + var dest = (byte*)arena.Alloc((uint)byteCount, align: 1); + Encoding.UTF8.GetBytes( + src, + new Span(dest, byteCount)); + + return new ArenaUtf8String(arena, dest, byteCount); + } + /// /// Clones the provided span into arena-managed memory. ///