// dnlib: See LICENSE.txt for more info using System; using System.Diagnostics; namespace dnlib.DotNet.Writer { /// /// Writes data /// public unsafe struct ArrayWriter { /// /// Gets the current position /// public int Position { get => position; set => position = value; } readonly byte[] data; int position; /// /// Constructor /// /// Destination array public ArrayWriter(byte[] data) { this.data = data; position = 0; } internal byte[] DataUnsafe => data; /// /// Writes a /// /// Value public void WriteSByte(sbyte value) => data[position++] = (byte)value; /// /// Writes a /// /// Value public void WriteByte(byte value) => data[position++] = value; /// /// Writes a /// /// Value public void WriteInt16(short value) { data[position++] = (byte)value; data[position++] = (byte)(value >> 8); } /// /// Writes a /// /// Value public void WriteUInt16(ushort value) { data[position++] = (byte)value; data[position++] = (byte)(value >> 8); } /// /// Writes a /// /// Value public void WriteInt32(int value) { Debug.Assert(this.position + 4 <= data.Length); var position = this.position; fixed (byte* p = data) *(int*)(p + position) = value; this.position = position + 4; } /// /// Writes a /// /// Value public void WriteUInt32(uint value) { Debug.Assert(this.position + 4 <= data.Length); var position = this.position; fixed (byte* p = data) *(uint*)(p + position) = value; this.position = position + 4; } /// /// Writes a /// /// Value public void WriteInt64(long value) { Debug.Assert(this.position + 8 <= data.Length); var position = this.position; fixed (byte* p = data) *(long*)(p + position) = value; this.position = position + 8; } /// /// Writes a /// /// Value public void WriteUInt64(ulong value) { Debug.Assert(this.position + 8 <= data.Length); var position = this.position; fixed (byte* p = data) *(ulong*)(p + position) = value; this.position = position + 8; } /// /// Writes a /// /// Value public void WriteSingle(float value) { Debug.Assert(this.position + 4 <= data.Length); var position = this.position; fixed (byte* p = data) *(float*)(p + position) = value; this.position = position + 4; } /// /// Writes a /// /// Value public void WriteDouble(double value) { Debug.Assert(this.position + 8 <= data.Length); var position = this.position; fixed (byte* p = data) *(double*)(p + position) = value; this.position = position + 8; } /// /// Writes bytes /// /// Bytes public void WriteBytes(byte[] source) => WriteBytes(source, 0, source.Length); /// /// Writes bytes /// /// Bytes /// Source index /// Number of bytes to write public void WriteBytes(byte[] source, int index, int length) { Array.Copy(source, index, data, position, length); position += length; } } }