Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.Common.Compatibility4.cs

 
#if FW2 || FW3

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;

            Tuple<T1> 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;

            Tuple<T1> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2> tuple = other as Tuple<T1,T2>;

            if (tuple == null)
                throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");

            int 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;

            Tuple<T1,T2> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3> 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;

            Tuple<T1,T2,T3> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3,T4> 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;

            Tuple<T1,T2,T3,T4> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3,T4,T5> 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;

            Tuple<T1,T2,T3,T4,T5> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3,T4,T5,T6> 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;

            Tuple<T1,T2,T3,T4,T5,T6> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3,T4,T5,T6,T7> 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;

            Tuple<T1,T2,T3,T4,T5,T6,T7> 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()
        {
            StringBuilder 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;

            Tuple<T1,T2,T3,T4,T5,T6,T7,TRest> 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;

            Tuple<T1,T2,T3,T4,T5,T6,T7,TRest> 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)
        {
            ITuple 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()
        {
            StringBuilder 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);
        }
    }
}

#endif
 
© 2010 www.bltoolkit.net
support@bltoolkit.net