summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Tuple.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Tuple.cs')
-rw-r--r--src/mscorlib/src/System/Tuple.cs958
1 files changed, 958 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Tuple.cs b/src/mscorlib/src/System/Tuple.cs
new file mode 100644
index 0000000000..8ed8425fe7
--- /dev/null
+++ b/src/mscorlib/src/System/Tuple.cs
@@ -0,0 +1,958 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using System;
+using System.Text;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
+
+namespace System {
+
+ /// <summary>
+ /// Helper so we can call some tuple methods recursively without knowing the underlying types.
+ /// </summary>
+ internal interface ITuple {
+ string ToString(StringBuilder sb);
+ int GetHashCode(IEqualityComparer comparer);
+ int Size { get; }
+
+ }
+
+ 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) {
+ return new Tuple<T1, T2>(item1, item2);
+ }
+
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ return (((h1 << 5) + h1) ^ h2);
+ }
+
+ 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) {
+ return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));
+ }
+
+ 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) {
+ 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) {
+ 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) {
+ return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+
+ public T1 Item1 { get { return m_Item1; } }
+
+ public Tuple(T1 item1) {
+ m_Item1 = item1;
+ }
+
+ public override Boolean Equals(Object obj) {
+ return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);
+ }
+
+ Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
+ if (other == null) return false;
+
+ Tuple<T1> objTuple = other as Tuple<T1>;
+
+ 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 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()), "other");
+ }
+
+ return comparer.Compare(m_Item1, objTuple.m_Item1);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
+ return comparer.GetHashCode(m_Item1);
+ }
+
+ Int32 ITuple.GetHashCode(IEqualityComparer comparer) {
+ return ((IStructuralEquatable) this).GetHashCode(comparer);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 1;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_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);;
+ }
+
+ Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
+ if (other == null) return false;
+
+ Tuple<T1, T2> objTuple = other as Tuple<T1, T2>;
+
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item2, objTuple.m_Item2);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 2;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_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);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item3, objTuple.m_Item3);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 3;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+ private readonly T4 m_Item4;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_Item3; } }
+ public T4 Item4 { get { return m_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);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item3, objTuple.m_Item3);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item4, objTuple.m_Item4);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(", ");
+ sb.Append(m_Item4);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 4;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+ private readonly T4 m_Item4;
+ private readonly T5 m_Item5;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_Item3; } }
+ 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) {
+ m_Item1 = item1;
+ m_Item2 = item2;
+ m_Item3 = item3;
+ m_Item4 = item4;
+ m_Item5 = item5;
+ }
+
+ public override Boolean Equals(Object obj) {
+ return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item3, objTuple.m_Item3);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item4, objTuple.m_Item4);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item5, objTuple.m_Item5);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(", ");
+ sb.Append(m_Item4);
+ sb.Append(", ");
+ sb.Append(m_Item5);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 5;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+ private readonly T4 m_Item4;
+ private readonly T5 m_Item5;
+ private readonly T6 m_Item6;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_Item3; } }
+ public T4 Item4 { get { return m_Item4; } }
+ 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) {
+ m_Item1 = item1;
+ m_Item2 = item2;
+ m_Item3 = item3;
+ m_Item4 = item4;
+ m_Item5 = item5;
+ m_Item6 = item6;
+ }
+
+ public override Boolean Equals(Object obj) {
+ return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item3, objTuple.m_Item3);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item4, objTuple.m_Item4);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item5, objTuple.m_Item5);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item6, objTuple.m_Item6);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(", ");
+ sb.Append(m_Item4);
+ sb.Append(", ");
+ sb.Append(m_Item5);
+ sb.Append(", ");
+ sb.Append(m_Item6);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 6;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+ private readonly T4 m_Item4;
+ private readonly T5 m_Item5;
+ private readonly T6 m_Item6;
+ private readonly T7 m_Item7;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_Item3; } }
+ public T4 Item4 { get { return m_Item4; } }
+ public T5 Item5 { get { return m_Item5; } }
+ 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) {
+ m_Item1 = item1;
+ m_Item2 = item2;
+ m_Item3 = item3;
+ m_Item4 = item4;
+ m_Item5 = item5;
+ m_Item6 = item6;
+ m_Item7 = item7;
+ }
+
+ public override Boolean Equals(Object obj) {
+ return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item3, objTuple.m_Item3);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item4, objTuple.m_Item4);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item5, objTuple.m_Item5);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item6, objTuple.m_Item6);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Item7, objTuple.m_Item7);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(", ");
+ sb.Append(m_Item4);
+ sb.Append(", ");
+ sb.Append(m_Item5);
+ sb.Append(", ");
+ sb.Append(m_Item6);
+ sb.Append(", ");
+ sb.Append(m_Item7);
+ sb.Append(")");
+ return sb.ToString();
+ }
+
+ int ITuple.Size {
+ get {
+ return 7;
+ }
+ }
+ }
+
+ [Serializable]
+ public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple {
+
+ private readonly T1 m_Item1;
+ private readonly T2 m_Item2;
+ private readonly T3 m_Item3;
+ private readonly T4 m_Item4;
+ private readonly T5 m_Item5;
+ private readonly T6 m_Item6;
+ private readonly T7 m_Item7;
+ private readonly TRest m_Rest;
+
+ public T1 Item1 { get { return m_Item1; } }
+ public T2 Item2 { get { return m_Item2; } }
+ public T3 Item3 { get { return m_Item3; } }
+ public T4 Item4 { get { return m_Item4; } }
+ public T5 Item5 { get { return m_Item5; } }
+ public T6 Item6 { get { return m_Item6; } }
+ 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)) {
+ throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleLastArgumentNotATuple"));
+ }
+
+ m_Item1 = item1;
+ m_Item2 = item2;
+ m_Item3 = item3;
+ m_Item4 = item4;
+ m_Item5 = item5;
+ m_Item6 = item6;
+ m_Item7 = item7;
+ m_Rest = rest;
+ }
+
+ public override Boolean Equals(Object obj) {
+ return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
+ }
+
+ 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) {
+ 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 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()), "other");
+ }
+
+ int c = 0;
+
+ c = comparer.Compare(m_Item1, objTuple.m_Item1);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item2, objTuple.m_Item2);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item3, objTuple.m_Item3);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item4, objTuple.m_Item4);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item5, objTuple.m_Item5);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item6, objTuple.m_Item6);
+
+ if (c != 0) return c;
+
+ c = comparer.Compare(m_Item7, objTuple.m_Item7);
+
+ if (c != 0) return c;
+
+ return comparer.Compare(m_Rest, objTuple.m_Rest);
+ }
+
+ public override int GetHashCode() {
+ return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
+ }
+
+ 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); }
+
+ // 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) {
+ case 1:
+ 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));
+ case 3:
+ 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));
+ 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));
+ 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));
+ 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));
+ }
+ Contract.Assert(false, "Missed all cases for computing Tuple hash code");
+ return -1;
+ }
+
+ Int32 ITuple.GetHashCode(IEqualityComparer comparer) {
+ return ((IStructuralEquatable) this).GetHashCode(comparer);
+ }
+ public override string ToString() {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("(");
+ return ((ITuple)this).ToString(sb);
+ }
+
+ string ITuple.ToString(StringBuilder sb) {
+ sb.Append(m_Item1);
+ sb.Append(", ");
+ sb.Append(m_Item2);
+ sb.Append(", ");
+ sb.Append(m_Item3);
+ sb.Append(", ");
+ sb.Append(m_Item4);
+ sb.Append(", ");
+ sb.Append(m_Item5);
+ sb.Append(", ");
+ sb.Append(m_Item6);
+ sb.Append(", ");
+ sb.Append(m_Item7);
+ sb.Append(", ");
+ return ((ITuple)m_Rest).ToString(sb);
+ }
+
+ int ITuple.Size {
+ get {
+ return 7 + ((ITuple)m_Rest).Size;
+ }
+ }
+ }
+}