diff options
Diffstat (limited to 'src/mscorlib/src/System/Tuple.cs')
-rw-r--r-- | src/mscorlib/src/System/Tuple.cs | 729 |
1 files changed, 519 insertions, 210 deletions
diff --git a/src/mscorlib/src/System/Tuple.cs b/src/mscorlib/src/System/Tuple.cs index 037b2ceee8..bb0dbcad6f 100644 --- a/src/mscorlib/src/System/Tuple.cs +++ b/src/mscorlib/src/System/Tuple.cs @@ -7,161 +7,206 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; +using System.Runtime.CompilerServices; // // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it. // -namespace System { +namespace System +{ /// <summary> /// Helper so we can call some tuple methods recursively without knowing the underlying types. /// </summary> - internal interface ITuple { + internal interface ITupleInternal : ITuple + { string ToString(StringBuilder sb); int GetHashCode(IEqualityComparer comparer); - int Size { get; } - } - public static class Tuple { - public static Tuple<T1> Create<T1>(T1 item1) { + public static class Tuple + { + public static Tuple<T1> Create<T1>(T1 item1) + { return new Tuple<T1>(item1); } - public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) { + public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) + { return new Tuple<T1, T2>(item1, item2); } - public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) { + public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) + { return new Tuple<T1, T2, T3>(item1, item2, item3); } - public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) { + public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) + { return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4); } - public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) { + public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) + { return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5); } - public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) { + public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) + { return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6); } - public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) { + public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) + { return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7); } - public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8) { + public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8) + { return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8)); } // From System.Web.Util.HashCodeCombiner - internal static int CombineHashCodes(int h1, int h2) { + internal static int CombineHashCodes(int h1, int h2) + { return (((h1 << 5) + h1) ^ h2); } - internal static int CombineHashCodes(int h1, int h2, int h3) { + internal static int CombineHashCodes(int h1, int h2, int h3) + { return CombineHashCodes(CombineHashCodes(h1, h2), h3); } - internal static int CombineHashCodes(int h1, int h2, int h3, int h4) { + internal static int CombineHashCodes(int h1, int h2, int h3, int h4) + { return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4)); } - internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5) { + internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5) + { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5); } - internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6) { + internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6) + { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6)); } - internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7) { + internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7) + { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7)); } - internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8) { + internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8) + { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8)); } } [Serializable] - public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; public T1 Item1 { get { return m_Item1; } } - public Tuple(T1 item1) { + public Tuple(T1 item1) + { m_Item1 = item1; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default); + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1> objTuple = other as Tuple<T1>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1> objTuple = other as Tuple<T1>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } return comparer.Compare(m_Item1, objTuple.m_Item1); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { return comparer.GetHashCode(m_Item1); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(")"); return sb.ToString(); } - int ITuple.Size { - get { - return 1; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 1; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + if (index != 0) + { + throw new IndexOutOfRangeException(); + } + return Item1; } } } [Serializable] - public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -169,38 +214,45 @@ namespace System { public T1 Item1 { get { return m_Item1; } } public T2 Item2 { get { return m_Item2; } } - public Tuple(T1 item1, T2 item2) { + public Tuple(T1 item1, T2 item2) + { m_Item1 = item1; m_Item2 = item2; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2> objTuple = other as Tuple<T1, T2>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2> objTuple = other as Tuple<T1, T2>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -212,24 +264,29 @@ namespace System { return comparer.Compare(m_Item2, objTuple.m_Item2); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -237,15 +294,34 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 2; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 2; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -255,39 +331,46 @@ namespace System { public T2 Item2 { get { return m_Item2; } } public T3 Item3 { get { return m_Item3; } } - public Tuple(T1 item1, T2 item2, T3 item3) { + public Tuple(T1 item1, T2 item2, T3 item3) + { m_Item1 = item1; m_Item2 = item2; m_Item3 = item3; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -303,24 +386,29 @@ namespace System { return comparer.Compare(m_Item3, objTuple.m_Item3); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -330,15 +418,36 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 3; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 3; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -350,40 +459,47 @@ namespace System { public T3 Item3 { get { return m_Item3; } } public T4 Item4 { get { return m_Item4; } } - public Tuple(T1 item1, T2 item2, T3 item3, T4 item4) { + public Tuple(T1 item1, T2 item2, T3 item3, T4 item4) + { m_Item1 = item1; m_Item2 = item2; m_Item3 = item3; m_Item4 = item4; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -403,24 +519,29 @@ namespace System { return comparer.Compare(m_Item4, objTuple.m_Item4); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -432,15 +553,38 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 4; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 4; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + case 3: + return Item4; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -454,7 +598,8 @@ namespace System { public T4 Item4 { get { return m_Item4; } } public T5 Item5 { get { return m_Item5; } } - public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) { + public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) + { m_Item1 = item1; m_Item2 = item2; m_Item3 = item3; @@ -462,33 +607,39 @@ namespace System { m_Item5 = item5; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -512,24 +663,29 @@ namespace System { return comparer.Compare(m_Item5, objTuple.m_Item5); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 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)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -543,15 +699,40 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 5; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 5; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + case 3: + return Item4; + case 4: + return Item5; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -567,7 +748,8 @@ namespace System { public T5 Item5 { get { return m_Item5; } } public T6 Item6 { get { return m_Item6; } } - public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) { + public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) + { m_Item1 = item1; m_Item2 = item2; m_Item3 = item3; @@ -576,33 +758,39 @@ namespace System { m_Item6 = item6; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -630,24 +818,29 @@ namespace System { return comparer.Compare(m_Item6, objTuple.m_Item6); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 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)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -663,15 +856,42 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 6; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 6; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + case 3: + return Item4; + case 4: + return Item5; + case 5: + return Item6; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -689,7 +909,8 @@ namespace System { public T6 Item6 { get { return m_Item6; } } public T7 Item7 { get { return m_Item7; } } - public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) { + public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) + { m_Item1 = item1; m_Item2 = item2; m_Item3 = item3; @@ -699,33 +920,39 @@ namespace System { m_Item7 = item7; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6) && comparer.Equals(m_Item7, objTuple.m_Item7); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -757,24 +984,29 @@ namespace System { return comparer.Compare(m_Item7, objTuple.m_Item7); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 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)); } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -792,15 +1024,44 @@ namespace System { return sb.ToString(); } - int ITuple.Size { - get { - return 7; + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length => 7; + + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + case 3: + return Item4; + case 4: + return Item5; + case 5: + return Item6; + case 6: + return Item7; + default: + throw new IndexOutOfRangeException(); + } } } } [Serializable] - public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple { + public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple + { private readonly T1 m_Item1; private readonly T2 m_Item2; @@ -820,8 +1081,10 @@ namespace System { public T7 Item7 { get { return m_Item7; } } public TRest Rest { get { return m_Rest; } } - public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) { - if (!(rest is ITuple)) { + public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) + { + if (!(rest is ITupleInternal)) + { throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleLastArgumentNotATuple")); } @@ -835,33 +1098,39 @@ namespace System { m_Rest = rest; } - public override Boolean Equals(Object obj) { - return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);; + public override Boolean Equals(Object obj) + { + return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<Object>.Default); ; } - Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) { + Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) + { if (other == null) return false; Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>; - if (objTuple == null) { + if (objTuple == null) + { return false; } return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6) && comparer.Equals(m_Item7, objTuple.m_Item7) && comparer.Equals(m_Rest, objTuple.m_Rest); } - Int32 IComparable.CompareTo(Object obj) { - return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default); + Int32 IComparable.CompareTo(Object obj) + { + return ((IStructuralComparable)this).CompareTo(obj, Comparer<Object>.Default); } - Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) { + Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) + { if (other == null) return 1; Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>; - if (objTuple == null) { - throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), nameof(other)); + if (objTuple == null) + { + throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other"); } int c = 0; @@ -897,47 +1166,53 @@ namespace System { return comparer.Compare(m_Rest, objTuple.m_Rest); } - public override int GetHashCode() { - return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default); + public override int GetHashCode() + { + return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<Object>.Default); } - Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { + Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple - ITuple t = (ITuple) m_Rest; - if(t.Size >= 8) { return t.GetHashCode(comparer); } - + ITupleInternal t = (ITupleInternal)m_Rest; + if (t.Length >= 8) { return t.GetHashCode(comparer); } + // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest - int k = 8 - t.Size; - switch(k) { + int k = 8 - t.Length; + switch (k) + { case 1: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 2: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 3: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 4: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 5: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 6: - return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); + return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer)); case 7: - 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), t.GetHashCode(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), t.GetHashCode(comparer)); } Debug.Assert(false, "Missed all cases for computing Tuple hash code"); return -1; } - Int32 ITuple.GetHashCode(IEqualityComparer comparer) { - return ((IStructuralEquatable) this).GetHashCode(comparer); + Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) + { + return ((IStructuralEquatable)this).GetHashCode(comparer); } - public override string ToString() { + public override string ToString() + { StringBuilder sb = new StringBuilder(); sb.Append("("); - return ((ITuple)this).ToString(sb); + return ((ITupleInternal)this).ToString(sb); } - string ITuple.ToString(StringBuilder sb) { + string ITupleInternal.ToString(StringBuilder sb) + { sb.Append(m_Item1); sb.Append(", "); sb.Append(m_Item2); @@ -952,12 +1227,46 @@ namespace System { sb.Append(", "); sb.Append(m_Item7); sb.Append(", "); - return ((ITuple)m_Rest).ToString(sb); + return ((ITupleInternal)m_Rest).ToString(sb); + } + + /// <summary> + /// The number of positions in this data structure. + /// </summary> + int ITuple.Length + { + get + { + return 7 + ((ITupleInternal)Rest).Length; + } } - int ITuple.Size { - get { - return 7 + ((ITuple)m_Rest).Size; + /// <summary> + /// Get the element at position <param name="index"/>. + /// </summary> + object ITuple.this[int index] + { + get + { + switch (index) + { + case 0: + return Item1; + case 1: + return Item2; + case 2: + return Item3; + case 3: + return Item4; + case 4: + return Item5; + case 5: + return Item6; + case 6: + return Item7; + } + + return ((ITupleInternal)Rest)[index - 7]; } } } |