StitchATon2/Infra/Utils.cs

42 lines
1.3 KiB
C#
Raw Permalink Normal View History

2025-07-30 07:30:00 +07:00
using System.IO.MemoryMappedFiles;
namespace StitchATon2.Infra;
internal static class Utils
2025-07-30 07:30:00 +07:00
{
private static unsafe uint AlignedSizeOf<T>() where T : unmanaged
{
uint size = (uint)sizeof(T);
return size is 1 or 2 ? size : (uint)((size + 3) & ~3);
2025-07-30 07:30:00 +07:00
}
2025-07-31 06:19:32 +07:00
internal static void DangerousReadSpan<T>(this MemoryMappedViewAccessor view, long position, Span<T> span, int offset, int count)
2025-07-30 07:30:00 +07:00
where T : unmanaged
{
uint sizeOfT = AlignedSizeOf<T>();
int n = count;
long spaceLeft = view.Capacity - position;
if (spaceLeft < 0)
{
n = 0;
}
else
{
ulong spaceNeeded = (ulong)(sizeOfT * count);
if ((ulong)spaceLeft < spaceNeeded)
{
n = (int)(spaceLeft / sizeOfT);
}
}
2025-07-31 06:19:32 +07:00
var byteOffset = (ulong)(view.PointerOffset + position);
view.SafeMemoryMappedViewHandle.ReadSpan(byteOffset, span.Slice(offset, n));
2025-07-30 07:30:00 +07:00
}
internal static void DangerousWriteSpan<T>(this MemoryMappedViewAccessor view, long position, Span<T> span, int offset, int count)
where T : unmanaged
2025-07-30 07:30:00 +07:00
{
var byteOffset = (ulong)(view.PointerOffset + position);
view.SafeMemoryMappedViewHandle.WriteSpan<T>(byteOffset, span.Slice(offset, count));
2025-07-30 07:30:00 +07:00
}
}