using System; using System.Collections.Generic; namespace PaintDotNet { [Serializable] public struct Triple { private T first; private U second; private V third; public T First { get { return this.first; } } public U Second { get { return this.second; } } public V Third { get { return this.third; } } public override int GetHashCode() { int firstHash; int secondHash; int thirdHash; if (object.ReferenceEquals(this.first, null)) { firstHash = 0; } else { firstHash = this.first.GetHashCode(); } if (object.ReferenceEquals(this.second, null)) { secondHash = 0; } else { secondHash = this.second.GetHashCode(); } if (object.ReferenceEquals(this.third, null)) { thirdHash = 0; } else { thirdHash = this.third.GetHashCode(); } return firstHash ^ secondHash ^ thirdHash; } public override bool Equals(object obj) { return ((obj != null) && (obj is Triple) && (this == (Triple)obj)); } public static bool operator ==(Triple lhs, Triple rhs) { bool firstEqual; bool secondEqual; bool thirdEqual; if (object.ReferenceEquals(lhs.First, null) && object.ReferenceEquals(rhs.First, null)) { firstEqual = true; } else if (object.ReferenceEquals(lhs.First, null) || object.ReferenceEquals(rhs.First, null)) { firstEqual = false; } else { firstEqual = lhs.First.Equals(rhs.First); } if (object.ReferenceEquals(lhs.Second, null) && object.ReferenceEquals(rhs.Second, null)) { secondEqual = true; } else if (object.ReferenceEquals(lhs.Second, null) || object.ReferenceEquals(rhs.Second, null)) { secondEqual = false; } else { secondEqual = lhs.Second.Equals(rhs.Second); } if (object.ReferenceEquals(lhs.Third, null) && object.ReferenceEquals(rhs.Third, null)) { thirdEqual = true; } else if (object.ReferenceEquals(lhs.Third, null) || object.ReferenceEquals(rhs.Third, null)) { thirdEqual = false; } else { thirdEqual = lhs.Third.Equals(rhs.Third); } return firstEqual && secondEqual && thirdEqual; } public static bool operator !=(Triple lhs, Triple rhs) { return !(lhs == rhs); } public Triple(T first, U second, V third) { this.first = first; this.second = second; this.third = third; } private sealed class TripleComparer : IEqualityComparer> { private IEqualityComparer tComparer; private IEqualityComparer uComparer; private IEqualityComparer vComparer; public TripleComparer(IEqualityComparer tComparer, IEqualityComparer uComparer, IEqualityComparer vComparer) { this.tComparer = tComparer; this.uComparer = uComparer; this.vComparer = vComparer; } public bool Equals(Triple x, Triple y) { return this.tComparer.Equals(x.First, y.First) && this.uComparer.Equals(x.Second, y.Second) && this.vComparer.Equals(x.Third, y.Third); } public int GetHashCode(Triple obj) { return this.tComparer.GetHashCode(obj.First) ^ this.uComparer.GetHashCode(obj.Second) ^ this.vComparer.GetHashCode(obj.Third); } } public static IEqualityComparer> CreateComparer( IEqualityComparer tComparer, IEqualityComparer uComparer, IEqualityComparer vComparer) { return new TripleComparer( tComparer ?? EqualityComparer.Default, uComparer ?? EqualityComparer.Default, vComparer ?? EqualityComparer.Default); } } }