Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;

namespace System
{
    internal interface ITuple
    {
        // Methods
        int GetHashCode(IEqualityComparer comparer);
        string ToString(StringBuilder sb);

        // Properties
        int Size { get; }
    }


    public interface IStructuralEquatable
    {
        // Methods
        bool Equals(object other, IEqualityComparer comparer);
        int GetHashCode(IEqualityComparer comparer);
    }

    public interface IStructuralComparable
    {
        // Methods
        int CompareTo(object other, IComparer comparer);
    }

    public static class Tuple
{
    // Methods
    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, 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);
    }

}


[Serializable]
public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
{
    // Fields
    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;

    // Methods
    public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
    {
        this.m_Item1 = item1;
        this.m_Item2 = item2;
        this.m_Item3 = item3;
        this.m_Item4 = item4;
        this.m_Item5 = item5;
        this.m_Item6 = item6;
        this.m_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("ArgumentException_TupleIncorrectType");
        }
        int num = 0;
        num = comparer.Compare(this.m_Item1, tuple.m_Item1);
        if (num != 0)
        {
            return num;
        }
        num = comparer.Compare(this.m_Item2, tuple.m_Item2);
        if (num != 0)
        {
            return num;
        }
        num = comparer.Compare(this.m_Item3, tuple.m_Item3);
        if (num != 0)
        {
            return num;
        }
        num = comparer.Compare(this.m_Item4, tuple.m_Item4);
        if (num != 0)
        {
            return num;
        }
        num = comparer.Compare(this.m_Item5, tuple.m_Item5);
        if (num != 0)
        {
            return num;
        }
        num = comparer.Compare(this.m_Item6, tuple.m_Item6);
        if (num != 0)
        {
            return num;
        }
        return comparer.Compare(this.m_Item7, tuple.m_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(this.m_Item1, tuple.m_Item1) && comparer.Equals(this.m_Item2, tuple.m_Item2)) && (comparer.Equals(this.m_Item3, tuple.m_Item3) && comparer.Equals(this.m_Item4, tuple.m_Item4))) && (comparer.Equals(this.m_Item5, tuple.m_Item5) && comparer.Equals(this.m_Item6, tuple.m_Item6))) && comparer.Equals(this.m_Item7, tuple.m_Item7));
    }

    int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
    {
        return Tuple.CombineHashCodes(comparer.GetHashCode(this.m_Item1), comparer.GetHashCode(this.m_Item2), comparer.GetHashCode(this.m_Item3), comparer.GetHashCode(this.m_Item4), comparer.GetHashCode(this.m_Item5), comparer.GetHashCode(this.m_Item6), comparer.GetHashCode(this.m_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(this.m_Item1);
        sb.Append(", ");
        sb.Append(this.m_Item2);
        sb.Append(", ");
        sb.Append(this.m_Item3);
        sb.Append(", ");
        sb.Append(this.m_Item4);
        sb.Append(", ");
        sb.Append(this.m_Item5);
        sb.Append(", ");
        sb.Append(this.m_Item6);
        sb.Append(", ");
        sb.Append(this.m_Item7);
        sb.Append(")");
        return sb.ToString();
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("(");
        return ((ITuple) this).ToString(sb);
    }

    // Properties
    public T1 Item1
    {
        get
        {
            return this.m_Item1;
        }
    }

    public T2 Item2
    {
        get
        {
            return this.m_Item2;
        }
    }

    public T3 Item3
    {
        get
        {
            return this.m_Item3;
        }
    }

    public T4 Item4
    {
        get
        {
            return this.m_Item4;
        }
    }

    public T5 Item5
    {
        get
        {
            return this.m_Item5;
        }
    }

    public T6 Item6
    {
        get
        {
            return this.m_Item6;
        }
    }

    public T7 Item7
    {
        get
        {
            return this.m_Item7;
        }
    }

    int ITuple.Size
    {
        get
        {
            return 7;
        }
    }
}

}