using System; namespace ARMeilleure.CodeGen.Linking { /// /// Represents a symbol. /// readonly struct Symbol { private readonly ulong _value; /// /// Gets the of the . /// public SymbolType Type { get; } /// /// Gets the value of the . /// /// is public ulong Value { get { if (Type == SymbolType.None) { ThrowSymbolNone(); } return _value; } } /// /// Initializes a new instance of the structure with the specified and value. /// /// Type of symbol /// Value of symbol public Symbol(SymbolType type, ulong value) { (Type, _value) = (type, value); } /// /// Determines if the specified instances are equal. /// /// First instance /// Second instance /// if equal; otherwise public static bool operator ==(Symbol a, Symbol b) { return a.Equals(b); } /// /// Determines if the specified instances are not equal. /// /// First instance /// Second instance /// if not equal; otherwise public static bool operator !=(Symbol a, Symbol b) { return !(a == b); } /// /// Determines if the specified is equal to this instance. /// /// Other instance /// if equal; otherwise public bool Equals(Symbol other) { return other.Type == Type && other._value == _value; } /// public override bool Equals(object obj) { return obj is Symbol sym && Equals(sym); } /// public override int GetHashCode() { return HashCode.Combine(Type, _value); } /// public override string ToString() { return $"{Type}:{_value}"; } private static void ThrowSymbolNone() { throw new InvalidOperationException("Symbol refers to nothing."); } } }