protected void GenEqualsAndHash(StreamWriter sw) { int bitfields = 0; bool need_field = true; StringBuilder hashcode = new StringBuilder(); StringBuilder equals = new StringBuilder(); hashcode.Append("this.GetType ().FullName.GetHashCode ()"); equals.Append("true"); foreach (StructField field in fields) { if (field.IsPadding) { continue; } if (field.IsBitfield) { if (need_field) { equals.Append(" && _bitfield"); equals.Append(bitfields); equals.Append(".Equals (other._bitfield"); equals.Append(bitfields); equals.Append(")"); hashcode.Append(" ^ "); hashcode.Append("_bitfield"); hashcode.Append(bitfields++); hashcode.Append(".GetHashCode ()"); need_field = false; } } else { need_field = true; equals.Append(" && "); equals.Append(field.EqualityName); equals.Append(".Equals (other."); equals.Append(field.EqualityName); equals.Append(")"); hashcode.Append(" ^ "); hashcode.Append(field.EqualityName); hashcode.Append(".GetHashCode ()"); } } if (!Elem.GetAttributeAsBoolean("noequals")) { sw.WriteLine("\t\tpublic bool Equals ({0} other)", Name); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\treturn {0};", equals.ToString()); sw.WriteLine("\t\t}"); sw.WriteLine(); } sw.WriteLine("\t\tpublic override bool Equals (object other)"); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\treturn other is {0} && Equals (({0}) other);", Name); sw.WriteLine("\t\t}"); sw.WriteLine(); if (Elem.GetAttributeAsBoolean("nohash")) { return; } sw.WriteLine("\t\tpublic override int GetHashCode ()"); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\treturn {0};", hashcode.ToString()); sw.WriteLine("\t\t}"); sw.WriteLine(); }