// 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;
}
}
}