public static unsafe void UsePointer(this MemoryStream ms, BytePointerWriter f) { void ExecAndTrack(byte *p) => ms.Position += f(p); if (ms.TryGetBuffer(out var buf)) fixed(byte *p = &buf.Array[buf.Offset]) ExecAndTrack(p); fixed(byte *p = &ms.ToArray()[ms.Position]) ExecAndTrack(p); }
public static unsafe void UsePointer(this UnmanagedMemoryStream ums, BytePointerWriter f) { if (ums is MemoryMappedViewStream mmvs) { byte *p = null; var h = mmvs.SafeMemoryMappedViewHandle; h.AcquirePointer(ref p); var diff = f(p + ums.Position); h.ReleasePointer(); ums.Position += diff; return; } ums.Position += f(ums.PositionPointer); }