Skip to content

Instantly share code, notes, and snippets.

@vladima
Last active July 1, 2016 03:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vladima/8cbe72f40c6fccd2a40e4edb0e480b49 to your computer and use it in GitHub Desktop.
Save vladima/8cbe72f40c6fccd2a40e4edb0e480b49 to your computer and use it in GitHub Desktop.
class UnmanagedMemoryWriter: Stream
{
private static T NotImplemented<T>()
{
throw new NotImplementedException();
}
private UnmanagedMemoryWriter()
{
}
[ThreadStatic]
private static UnmanagedMemoryWriter threadLocalWriter;
public static UnmanagedMemoryWriter FromPtr(IntPtr ptr)
{
if (threadLocalWriter == null)
{
threadLocalWriter = new UnmanagedMemoryWriter();
}
threadLocalWriter.ptr = ptr;
threadLocalWriter.offset = 0;
return threadLocalWriter;
}
private IntPtr ptr;
private int offset = 0;
protected override void Dispose(bool disposing)
{
this.ptr = IntPtr.Zero;
this.offset = 0;
}
public override void Write(byte[] buffer, int offset, int count)
{
Marshal.Copy(buffer, offset, ptr + this.offset, count);
this.offset += count;
}
public override bool CanWrite => true;
public override bool CanRead => false;
public override bool CanSeek => NotImplemented<bool>();
public override long Length => NotImplemented<long>();
public override long Position
{
get { return NotImplemented<long>(); }
set { NotImplemented<object>(); }
}
public override void Flush() => NotImplemented<object>();
public override int Read(byte[] buffer, int offset, int count) => NotImplemented<int>();
public override long Seek(long offset, SeekOrigin origin) => NotImplemented<long>();
public override void SetLength(long value) => NotImplemented<object>();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment