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