obfuz/Plugins/dnlib/DotNet/Pdb/Managed/PdbAddress.cs

145 lines
4.8 KiB
C#
Raw Normal View History

// dnlib: See LICENSE.txt for more info
using System;
using System.Diagnostics;
using dnlib.IO;
namespace dnlib.DotNet.Pdb.Managed {
/// <summary>
/// An address in the image
/// </summary>
[DebuggerDisplay("{Section}:{Offset}")]
readonly struct PdbAddress : IEquatable<PdbAddress>, IComparable<PdbAddress> {
/// <summary>
/// Section
/// </summary>
public readonly ushort Section;
/// <summary>
/// Offset in <see cref="Section"/>
/// </summary>
public readonly uint Offset;
/// <summary>
/// Constructor
/// </summary>
/// <param name="section">Section</param>
/// <param name="offset">Offset in <paramref name="section"/></param>
public PdbAddress(ushort section, int offset) {
Section = section;
Offset = (uint)offset;
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="section">Section</param>
/// <param name="offset">Offset in <paramref name="section"/></param>
public PdbAddress(ushort section, uint offset) {
Section = section;
Offset = offset;
}
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is less than or equal to <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator <=(PdbAddress a, PdbAddress b) => a.CompareTo(b) <= 0;
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is less than <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator <(PdbAddress a, PdbAddress b) => a.CompareTo(b) < 0;
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is greater than or equal to <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator >=(PdbAddress a, PdbAddress b) => a.CompareTo(b) >= 0;
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is greater than <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator >(PdbAddress a, PdbAddress b) => a.CompareTo(b) > 0;
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is equal to <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator ==(PdbAddress a, PdbAddress b) => a.Equals(b);
/// <summary>
/// Returns <c>true</c> if <paramref name="a"/> is not equal to <paramref name="b"/>
/// </summary>
/// <param name="a">First <see cref="PdbAddress"/></param>
/// <param name="b">Second <see cref="PdbAddress"/></param>
/// <returns></returns>
public static bool operator !=(PdbAddress a, PdbAddress b) => !a.Equals(b);
/// <summary>
/// Compares this instance with <paramref name="other"/> and returns less than 0 if it's
/// less than <paramref name="other"/>, 0 if it's equal to <paramref name="other"/> and
/// greater than 0 if it's greater than <paramref name="other"/>
/// </summary>
/// <param name="other">Other instance</param>
/// <returns></returns>
public int CompareTo(PdbAddress other) {
if (Section != other.Section)
return Section.CompareTo(other.Section);
return Offset.CompareTo(other.Offset);
}
/// <summary>
/// Compares this to another instance
/// </summary>
/// <param name="other">The other one</param>
/// <returns><c>true</c> if they're equal</returns>
public bool Equals(PdbAddress other) => Section == other.Section && Offset == other.Offset;
/// <summary>
/// Compares this to another instance
/// </summary>
/// <param name="obj">The other one</param>
/// <returns><c>true</c> if they're equal</returns>
public override bool Equals(object obj) {
if (!(obj is PdbAddress))
return false;
return Equals((PdbAddress)obj);
}
/// <summary>
/// Gets the hash code
/// </summary>
/// <returns>Hash code</returns>
public override int GetHashCode() => (Section << 16) ^ (int)Offset;
/// <summary>
/// ToString() override
/// </summary>
/// <returns></returns>
public override string ToString() => $"{Section:X4}:{Offset:X8}";
/// <summary>
/// Reads a 32-bit offset followed by a 16-bit section and creates a new <see cref="PdbAddress"/>
/// </summary>
/// <param name="reader">Reader</param>
/// <returns></returns>
public static PdbAddress ReadAddress(ref DataReader reader) {
uint offs = reader.ReadUInt32();
return new PdbAddress(reader.ReadUInt16(), offs);
}
}
}