From 583a5367d853e5a15f23b39fae3461aef92af1d4 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 17 Nov 2020 13:06:08 +0100 Subject: [PATCH] Don't use interfaces for sharing Tuple implementation methods (#44684) --- .../System.Private.CoreLib/src/System/Tuple.cs | 260 +++++++++++++++++---- 1 file changed, 214 insertions(+), 46 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Tuple.cs b/src/libraries/System.Private.CoreLib/src/System/Tuple.cs index bb523a7..d6e8700 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Tuple.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Tuple.cs @@ -114,11 +114,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -131,11 +136,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -148,27 +158,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return comparer.GetHashCode(m_Item1!); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + + private int GetHashCode(IEqualityComparer comparer) + { + return comparer.GetHashCode(m_Item1!); + } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(')'); return sb.ToString(); @@ -213,11 +234,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -230,11 +256,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -251,27 +282,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!)); + } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -317,11 +359,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -334,11 +381,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -359,27 +411,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!)); + } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -431,11 +494,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -448,11 +516,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -477,27 +550,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!)); + } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -555,11 +639,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -572,11 +661,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -605,27 +699,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); + } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!)); } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -689,11 +794,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -706,11 +816,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -743,27 +858,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!)); + } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -833,11 +959,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -855,6 +986,11 @@ namespace System int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -891,27 +1027,38 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!)); + return GetHashCode(comparer); } int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); + } + + private int GetHashCode(IEqualityComparer comparer) + { + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!)); } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -992,11 +1139,16 @@ namespace System public override bool Equals(object? obj) { - return ((IStructuralEquatable)this).Equals(obj, EqualityComparer.Default); + return Equals(obj, EqualityComparer.Default); } bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer) { + return Equals(other, comparer); + } + + private bool Equals(object? other, IEqualityComparer comparer) + { if (other == null) return false; if (!(other is Tuple objTuple)) @@ -1009,11 +1161,16 @@ namespace System int IComparable.CompareTo(object? obj) { - return ((IStructuralComparable)this).CompareTo(obj, Comparer.Default); + return CompareTo(obj, Comparer.Default); } int IStructuralComparable.CompareTo(object? other, IComparer comparer) { + return CompareTo(other, comparer); + } + + private int CompareTo(object? other, IComparer comparer) + { if (other == null) return 1; if (!(other is Tuple objTuple)) @@ -1054,11 +1211,16 @@ namespace System public override int GetHashCode() { - return ((IStructuralEquatable)this).GetHashCode(EqualityComparer.Default); + return GetHashCode(EqualityComparer.Default); } int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + return GetHashCode(comparer); + } + + private int GetHashCode(IEqualityComparer comparer) + { // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple ITupleInternal t = (ITupleInternal)m_Rest; if (t.Length >= 8) { return t.GetHashCode(comparer); } @@ -1088,17 +1250,23 @@ namespace System int ITupleInternal.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable)this).GetHashCode(comparer); + return GetHashCode(comparer); } + public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('('); - return ((ITupleInternal)this).ToString(sb); + return ToString(sb); } string ITupleInternal.ToString(StringBuilder sb) { + return ToString(sb); + } + + private string ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); -- 2.7.4