From 7f9c83f8939d60b83bc9ed8160f7442dc80b5194 Mon Sep 17 00:00:00 2001 From: Michael Yarichuk Date: Sat, 2 May 2026 14:50:17 +0300 Subject: [PATCH] chore: add Clone method overload for read-only spans of characters --- src/SharpArena/Collections/ArenaUtf8String.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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. ///