// dnlib: See LICENSE.txt for more info
using System;
using System.Diagnostics;
using dnlib.DotNet.Writer;
using dnlib.IO;
namespace dnlib.DotNet.MD {
///
/// Info about one column in a MD table
///
[DebuggerDisplay("{offset} {size} {name}")]
public sealed class ColumnInfo {
readonly byte index;
byte offset;
readonly ColumnSize columnSize;
byte size;
readonly string name;
///
/// Gets the column index
///
public int Index => index;
///
/// Returns the column offset within the table row
///
public int Offset {
get => offset;
internal set => offset = (byte)value;
}
///
/// Returns the column size
///
public int Size {
get => size;
internal set => size = (byte)value;
}
///
/// Returns the column name
///
public string Name => name;
///
/// Returns the ColumnSize enum value
///
public ColumnSize ColumnSize => columnSize;
///
/// Constructor
///
/// Column index
/// The column name
/// Column size
public ColumnInfo(byte index, string name, ColumnSize columnSize) {
this.index = index;
this.name = name;
this.columnSize = columnSize;
}
///
/// Constructor
///
/// Column index
/// The column name
/// Column size
/// Offset of column
/// Size of column
public ColumnInfo(byte index, string name, ColumnSize columnSize, byte offset, byte size) {
this.index = index;
this.name = name;
this.columnSize = columnSize;
this.offset = offset;
this.size = size;
}
///
/// Reads the column
///
/// A reader positioned on this column
/// The column value
public uint Read(ref DataReader reader) =>
size switch {
1 => reader.ReadByte(),
2 => reader.ReadUInt16(),
4 => reader.ReadUInt32(),
_ => throw new InvalidOperationException("Invalid column size"),
};
internal uint Unsafe_Read24(ref DataReader reader) {
Debug.Assert(size == 2 || size == 4);
return size == 2 ? reader.Unsafe_ReadUInt16() : reader.Unsafe_ReadUInt32();
}
///
/// Writes a column
///
/// The writer position on this column
/// The column value
public void Write(DataWriter writer, uint value) {
switch (size) {
case 1: writer.WriteByte((byte)value); break;
case 2: writer.WriteUInt16((ushort)value); break;
case 4: writer.WriteUInt32(value); break;
default: throw new InvalidOperationException("Invalid column size");
}
}
internal void Write24(DataWriter writer, uint value) {
Debug.Assert(size == 2 || size == 4);
if (size == 2)
writer.WriteUInt16((ushort)value);
else
writer.WriteUInt32(value);
}
}
}