using System; using System.Collections.Generic; namespace Unity.UIWidgets.foundation { public abstract class Key { protected Key() { } public static Key key(string value) { return new ValueKey(value); } public static bool operator ==(Key left, Key right) { return Equals(left, right); } public static bool operator !=(Key left, Key right) { return !Equals(left, right); } } public abstract class LocalKey : Key { protected LocalKey() { } } public class ValueKey : LocalKey, IEquatable> { public ValueKey(T value) { this.value = value; } public readonly T value; public bool Equals(ValueKey other) { if (ReferenceEquals(null, other)) { return false; } if (ReferenceEquals(this, other)) { return true; } return EqualityComparer.Default.Equals(this.value, other.value); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { return false; } if (ReferenceEquals(this, obj)) { return true; } if (obj.GetType() != this.GetType()) { return false; } return this.Equals((ValueKey) obj); } public override int GetHashCode() { return EqualityComparer.Default.GetHashCode(this.value); } public static bool operator ==(ValueKey left, ValueKey right) { return Equals(left, right); } public static bool operator !=(ValueKey left, ValueKey right) { return !Equals(left, right); } public override string ToString() { string valueString = typeof(T) == typeof(string) ? "<\'" + this.value + "\'>" : "<" + this.value + ">"; if (this.GetType() == typeof(ValueKey)) { return $"[{valueString}]"; } return $"[{this.GetType()} {valueString}]"; } } }