Exemple #1
0
        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();
        }