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.
///