diff Source/Common/Compatibility4.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Compatibility4.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,987 @@
+namespace System
+{
+	using Collections;
+	using Collections.Generic;
+	using Text;
+
+	public delegate void Action<T1,T2,T3,T4,T5>                                                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
+	public delegate void Action<T1,T2,T3,T4,T5,T6>                                              (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7>                                           (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8>                                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9>                                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>                                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>                             (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>                         (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>             (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>         (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
+
+	public delegate TResult Func<T1,T2,T3,T4,T5,TResult>                                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,TResult>                                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,TResult>                                  (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,TResult>                               (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,TResult>                            (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,TResult>                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,TResult>                    (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,TResult>                (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,TResult>            (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,TResult>        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,TResult>    (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
+
+	#region Tuple
+
+	interface ITuple
+	{
+		int    GetHashCode(IEqualityComparer comparer);
+		string ToString   (StringBuilder sb);
+
+		int Size { get; }
+	}
+
+	public static class Tuple
+	{
+		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)); }
+
+		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));
+		}
+	}
+
+	[Serializable]
+	public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+
+		public Tuple(T1 item1)
+		{
+			_item1 = item1;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			return comparer.Compare(_item1, tuple._item1);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1>;
+
+			if (tuple == null)
+				return false;
+
+			return comparer.Equals(_item1, tuple._item1);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return comparer.GetHashCode(_item1);
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb.Append(_item1).Append(")");
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+
+		int ITuple.Size { get { return 2; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+
+		public Tuple(T1 item1, T2 item2)
+		{
+			_item1 = item1;
+			_item2 = item2;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			var num = comparer.Compare(_item1, tuple._item1);
+			if (num == 0)
+				return num;
+			return comparer.Compare(_item2, tuple._item2);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return Tuple.CombineHashCodes(comparer.GetHashCode(_item1), comparer.GetHashCode(_item2));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+
+		int ITuple.Size { get { return 2; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+
+		public Tuple(T1 item1, T2 item2, T3 item3)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+
+			return comparer.Compare(_item3, tuple._item3);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+
+		int ITuple.Size { get { return 3; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+
+			return comparer.Compare(_item4, tuple._item4);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+
+		int ITuple.Size { get { return 4; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+
+			return comparer.Compare(_item5, tuple._item5);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+
+		int ITuple.Size { get { return 5; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+		readonly T6 _item6;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+
+			return comparer.Compare(_item6, tuple._item6);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5),
+					comparer.GetHashCode(_item6));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+		public T6 Item6 { get { return _item6; } }
+
+		int ITuple.Size { get { return 6; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6,T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+		readonly T6 _item6;
+		readonly T7 _item7;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+			_item7 = item7;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+			num = comparer.Compare(_item6, tuple._item6); if (num != 0) return num;
+
+			return comparer.Compare(_item7, tuple._item7);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6) &&
+				comparer.Equals(_item7, tuple._item7);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5),
+					comparer.GetHashCode(_item6),
+					comparer.GetHashCode(_item7));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(", ")
+				.Append(_item7).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+		public T6 Item6 { get { return _item6; } }
+		public T7 Item7 { get { return _item7; } }
+
+		int ITuple.Size { get { return 7; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6,T7,TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1    _item1;
+		readonly T2    _item2;
+		readonly T3    _item3;
+		readonly T4    _item4;
+		readonly T5    _item5;
+		readonly T6    _item6;
+		readonly T7    _item7;
+		readonly TRest _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("Argument 'rest' is not a tuple", "rest");
+
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+			_item7 = item7;
+			_rest  = rest;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+			num = comparer.Compare(_item6, tuple._item6); if (num != 0) return num;
+			num = comparer.Compare(_item7, tuple._item7); if (num != 0) return num;
+
+			return comparer.Compare(_rest, tuple._rest);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6) &&
+				comparer.Equals(_item7, tuple._item7) &&
+				comparer.Equals(_rest,  tuple._rest);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			var rest = (ITuple)_rest;
+
+			if (rest.Size >= 8)
+				return rest.GetHashCode(comparer);
+
+			switch (8 - rest.Size)
+			{
+				case 1: return Tuple.CombineHashCodes(comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 2: return Tuple.CombineHashCodes(comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 3: return Tuple.CombineHashCodes(comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 4: return Tuple.CombineHashCodes(comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 5: return Tuple.CombineHashCodes(comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 6: return Tuple.CombineHashCodes(comparer.GetHashCode(_item2), comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 7: return Tuple.CombineHashCodes(comparer.GetHashCode(_item1), comparer.GetHashCode(_item2), comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+			}
+
+			return -1;
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(", ")
+				.Append(_item7).Append(", ");
+
+			return ((ITuple)_rest).ToString(sb);
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple)this).ToString(sb);
+		}
+
+		public T1    Item1 { get { return _item1; } }
+		public T2    Item2 { get { return _item2; } }
+		public T3    Item3 { get { return _item3; } }
+		public T4    Item4 { get { return _item4; } }
+		public T5    Item5 { get { return _item5; } }
+		public T6    Item6 { get { return _item6; } }
+		public T7    Item7 { get { return _item7; } }
+		public TRest Rest  { get { return _rest;  } }
+
+		int ITuple.Size { get { return 7 + ((ITuple)_rest).Size; } }
+	}
+
+	#endregion
+
+	namespace Collections
+	{
+		public interface IStructuralEquatable
+		{
+			bool Equals     (object other, IEqualityComparer comparer);
+			int  GetHashCode(IEqualityComparer comparer);
+		}
+
+		public interface IStructuralComparable
+		{
+			int CompareTo(object other, IComparer comparer);
+		}
+	}
+}