ok = false;
}
if (!ok)
- throw new ArgumentException ("The last element of an eight element tuple must be a Tuple.");
+ throw new ArgumentException ("rest", "The last element of an eight element tuple must be a Tuple.");
}
}
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ return comparer.Compare (item1, t.item1);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1);
}
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ return comparer.Compare (item2, t.item2);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2);
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- return h;
+ int h0;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ return comparer.Compare (item3, t.item3);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- return h;
+ int h0;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item3);
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3, T4>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ res = comparer.Compare (item3, t.item3);
+ if (res != 0) return res;
+ return comparer.Compare (item4, t.item4);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3, T4>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- h = (h << 5) - h + comparer.GetHashCode (item4);
- return h;
+ int h0, h1;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h1 = comparer.GetHashCode (item3);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item4);
+ h0 = (h0 << 5) + h0 ^ h1;
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3, T4, T5>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ res = comparer.Compare (item3, t.item3);
+ if (res != 0) return res;
+ res = comparer.Compare (item4, t.item4);
+ if (res != 0) return res;
+ return comparer.Compare (item5, t.item5);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3, T4, T5>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- h = (h << 5) - h + comparer.GetHashCode (item4);
- h = (h << 5) - h + comparer.GetHashCode (item5);
- return h;
+ int h0, h1;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h1 = comparer.GetHashCode (item3);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item4);
+ h0 = (h0 << 5) + h0 ^ h1;
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item5);
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3, T4, T5, T6>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ res = comparer.Compare (item3, t.item3);
+ if (res != 0) return res;
+ res = comparer.Compare (item4, t.item4);
+ if (res != 0) return res;
+ res = comparer.Compare (item5, t.item5);
+ if (res != 0) return res;
+ return comparer.Compare (item6, t.item6);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3, T4, T5, T6>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- h = (h << 5) - h + comparer.GetHashCode (item4);
- h = (h << 5) - h + comparer.GetHashCode (item5);
- h = (h << 5) - h + comparer.GetHashCode (item6);
- return h;
+ int h0, h1;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h1 = comparer.GetHashCode (item3);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item4);
+ h0 = (h0 << 5) + h0 ^ h1;
+ h1 = comparer.GetHashCode (item5);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item6);
+ h0 = (h0 << 5) + h0 ^ h1;
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ res = comparer.Compare (item3, t.item3);
+ if (res != 0) return res;
+ res = comparer.Compare (item4, t.item4);
+ if (res != 0) return res;
+ res = comparer.Compare (item5, t.item5);
+ if (res != 0) return res;
+ res = comparer.Compare (item6, t.item6);
+ if (res != 0) return res;
+ return comparer.Compare (item7, t.item7);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- h = (h << 5) - h + comparer.GetHashCode (item4);
- h = (h << 5) - h + comparer.GetHashCode (item5);
- h = (h << 5) - h + comparer.GetHashCode (item6);
- h = (h << 5) - h + comparer.GetHashCode (item7);
- return h;
+ int h0, h1;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h1 = comparer.GetHashCode (item3);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item4);
+ h0 = (h0 << 5) + h0 ^ h1;
+ h1 = comparer.GetHashCode (item5);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item6);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item7);
+ h0 = (h0 << 5) + h0 ^ h1;
+ return h0;
}
public override string ToString ()
return ((IStructuralComparable) this).CompareTo (obj, Comparer<object>.Default);
}
- [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)
+ int IStructuralComparable.CompareTo (object other, IComparer comparer)
{
- throw new NotImplementedException ();
+ var t = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
+ if (t == null) {
+ if (other == null) return 1;
+ throw new ArgumentException ("other");
+ }
+
+ int res = comparer.Compare (item1, t.item1);
+ if (res != 0) return res;
+ res = comparer.Compare (item2, t.item2);
+ if (res != 0) return res;
+ res = comparer.Compare (item3, t.item3);
+ if (res != 0) return res;
+ res = comparer.Compare (item4, t.item4);
+ if (res != 0) return res;
+ res = comparer.Compare (item5, t.item5);
+ if (res != 0) return res;
+ res = comparer.Compare (item6, t.item6);
+ if (res != 0) return res;
+ res = comparer.Compare (item7, t.item7);
+ if (res != 0) return res;
+ return comparer.Compare (rest, t.rest);
}
public override bool Equals (object obj)
bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)
{
var t = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
- if (t == null) {
- if (other == null) return false;
- throw new ArgumentException ();
- }
+ if (t == null)
+ return false;
return comparer.Equals (item1, t.item1) &&
comparer.Equals (item2, t.item2) &&
int IStructuralEquatable.GetHashCode (IEqualityComparer comparer)
{
- int h = comparer.GetHashCode (item1);
- h = (h << 5) - h + comparer.GetHashCode (item2);
- h = (h << 5) - h + comparer.GetHashCode (item3);
- h = (h << 5) - h + comparer.GetHashCode (item4);
- h = (h << 5) - h + comparer.GetHashCode (item5);
- h = (h << 5) - h + comparer.GetHashCode (item6);
- h = (h << 5) - h + comparer.GetHashCode (item7);
- h = (h << 5) - h + comparer.GetHashCode (rest);
- return h;
+ int h0, h1, h2;
+ h0 = comparer.GetHashCode (item1);
+ h0 = (h0 << 5) + h0 ^ comparer.GetHashCode (item2);
+ h1 = comparer.GetHashCode (item3);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item4);
+ h0 = (h0 << 5) + h0 ^ h1;
+ h1 = comparer.GetHashCode (item5);
+ h1 = (h1 << 5) + h1 ^ comparer.GetHashCode (item6);
+ h2 = comparer.GetHashCode (item7);
+ h2 = (h2 << 5) + h2 ^ comparer.GetHashCode (rest);
+ h1 = (h1 << 5) + h1 ^ h2;
+ h0 = (h0 << 5) + h0 ^ h1;
+ return h0;
}
public override string ToString ()
Console.WriteLine ("\t\t}");
Console.WriteLine ();
- Console.WriteLine ("\t\t[MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer)");
+ Console.WriteLine ("\t\tint IStructuralComparable.CompareTo (object other, IComparer comparer)");
Console.WriteLine ("\t\t{");
- Console.WriteLine ("\t\t\tthrow new NotImplementedException ();");
- Console.WriteLine ("\t\t}");
+ Console.WriteLine ("\t\t\tvar t = other as {0};", type_name);
+ Console.WriteLine ("\t\t\tif (t == null) {");
+ Console.WriteLine ("\t\t\t\tif (other == null) return 1;");
+ Console.WriteLine ("\t\t\t\tthrow new ArgumentException (\"other\");");
+ Console.WriteLine ("\t\t\t}");
+ Console.WriteLine ();
+
+ for (int i = 1; i < arity; ++i) {
+ Console.Write ("\t\t\t");
+ if (i == 1)
+ Console.Write ("int ");
+
+ Console.WriteLine ("res = comparer.Compare ({0}, t.{0});", GetItemName (i));
+ Console.WriteLine ("\t\t\tif (res != 0) return res;");
+ }
+ Console.WriteLine ("\t\t\treturn comparer.Compare ({0}, t.{0});", GetItemName (arity));
+ Console.WriteLine ("\t\t}");
Console.WriteLine ();
Console.WriteLine ("\t\tpublic override bool Equals (object obj)");
Console.WriteLine ("\t\tbool IStructuralEquatable.Equals (object other, IEqualityComparer comparer)");
Console.WriteLine ("\t\t{");
Console.WriteLine ("\t\t\tvar t = other as {0};", type_name);
- Console.WriteLine ("\t\t\tif (t == null) {");
- Console.WriteLine ("\t\t\t\tif (other == null) return false;");
- Console.WriteLine ("\t\t\t\tthrow new ArgumentException ();");
- Console.WriteLine ("\t\t\t}");
+ Console.WriteLine ("\t\t\tif (t == null)");
+ Console.WriteLine ("\t\t\t\treturn false;");
Console.WriteLine ();
Console.Write ("\t\t\treturn");
Console.WriteLine ();
Console.WriteLine ("\t\tpublic override int GetHashCode ()");
Console.WriteLine ("\t\t{");
- Console.WriteLine ("\t\t\treturn GetHashCode (EqualityComparer<object>.Default);");
+ Console.WriteLine ("\t\t\treturn ((IStructuralEquatable) this).GetHashCode (EqualityComparer<object>.Default);");
Console.WriteLine ("\t\t}");
Console.WriteLine ();
if (arity == 1) {
Console.WriteLine ("\t\t\treturn comparer.GetHashCode ({0});", GetItemName (arity));
} else {
- Console.WriteLine ("\t\t\tint h = comparer.GetHashCode ({0});", GetItemName (1));
- for (int i = 2; i <= arity; ++i)
- Console.WriteLine ("\t\t\th = (h << 5) - h + comparer.GetHashCode ({0});", GetItemName (i));
- Console.WriteLine ("\t\t\treturn h;");
+ int varnum = IntLog2(arity);
+ Console.Write ("\t\t\tint h0");
+ for (int i = 1; i < varnum; ++i)
+ Console.Write (", h{0}", i);
+ Console.WriteLine (";");
+
+ WriteHash(0, 1, arity);
+
+ Console.WriteLine ("\t\t\treturn h0;");
}
Console.WriteLine ("\t\t}");
}
}
+ static int IntLog2 (int n)
+ {
+ int r = -1;
+
+ while (n != 0) {
+ n >>= 1;
+ r++;
+ }
+
+ return r;
+ }
+
+ static void WriteHash (int destVar, int start, int count)
+ {
+ if (count == 1) {
+ Console.WriteLine ("\t\t\th{0} = comparer.GetHashCode ({1});", destVar, GetItemName (start));
+ } else {
+ int subCount = 1 << IntLog2(count-1);
+ computeHash(destVar, start, subCount);
+ start += subCount;
+ count -= subCount;
+ if (count == 1) {
+ Console.WriteLine ("\t\t\th{0} = (h{0} << 5) + h{0} ^ comparer.GetHashCode ({1});", destVar, GetItemName (start));
+ } else {
+ WriteHash(destVar+1, start, count);
+ Console.WriteLine ("\t\t\th{0} = (h{0} << 5) + h{0} ^ h{1};", destVar, destVar+1);
+ }
+ }
+ }
+
static string GetTypeName (int arity)
{
StringBuilder sb = new StringBuilder ();