/**
         * Returns true if the type has a map field of a particular name, key, and value type.
         */
        protected bool HasMapField(PatternBufferType type, string fieldName, object keyType, object valueType)
        {
            bool has = true;
            PatternBufferField field = this.GetField <MapFieldType>(type, fieldName);

            if (field != null)
            {
                if (keyType is PrimitiveType && field.FieldType is PrimitiveFieldType)
                {
                    has = has && (((PrimitiveFieldType)field.FieldType).PrimitiveType == (PrimitiveType)keyType);
                }
                else if (keyType is string && field.FieldType is ReferenceFieldType)
                {
                    has = has && (((ReferenceFieldType)field.FieldType).ReferrableName == (string)keyType);
                }
                if (valueType is PrimitiveType && field.FieldType is PrimitiveFieldType)
                {
                    has = has && (((PrimitiveFieldType)field.FieldType).PrimitiveType == (PrimitiveType)valueType);
                }
                else if (keyType is string && field.FieldType is ReferenceFieldType)
                {
                    has = has && (((ReferenceFieldType)field.FieldType).ReferrableName == (string)valueType);
                }
            }
            return(has);
        }
        /**
         * Returns true if the type has a list field containing a specific primitive type.
         */
        protected bool HasPrimitiveListField(PatternBufferType type, string fieldName, PrimitiveType primitiveType)
        {
            PatternBufferField field       = this.GetField <ListFieldType>(type, fieldName);
            IFieldType         elementType = ((ListFieldType)field.FieldType).ElementType;

            return
                (elementType is PrimitiveFieldType &&
                 ((PrimitiveFieldType)elementType).PrimitiveType == primitiveType);
        }
        /**
         * Returns true if the type has a set field containing a specific reference type.
         */
        protected bool HasReferenceSetField(PatternBufferType type, string fieldName, String referrableName)
        {
            PatternBufferField field       = this.GetField <SetFieldType>(type, fieldName);
            IFieldType         elementType = ((SetFieldType)field.FieldType).ElementType;

            return
                (elementType is ReferenceFieldType &&
                 ((ReferenceFieldType)elementType).ReferrableName.Equals(referrableName));
        }
        /**
         * Appends optiona bit flag bytes into the output.
         */
        public static void AppendWriteOptionalFieldFlags(ref string code, PatternBufferType type, string varName)
        {
            List <PatternBufferField> optionalFields = GetAllOptionalFields(type);

            if (optionalFields.Count > 0)
            {
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            // you know what do this in the main field serialization loop it already checks nulls\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            //\r\n";
                code += "            \r\n";
                code += "            // OPTIONAL FIELD FLAGS\r\n";
                code += "            index--;\r\n";
                int place = 7;
                for (int b = 0; b < optionalFields.Count; b++)
                {
                    if (b % 8 == 0)
                    {
                        code += "            bytes[++index] = 0;\r\n";
                        place = 7;
                    }
                    PatternBufferField optionalField = optionalFields[b];
                    //code += "            if (" + varName + "." + ToCSharpPropertyName(optionalField.Name) + " != null) {\r\n";
                    //code += "                bytes[index] |= (byte)(1 << " + place + ");\r\n";
                    //code += "            }\r\n";
                    code += "            bytes[index] |= (byte)((" + varName + "." + ToCSharpPropertyName(optionalField.Name) + " != null ? 1 : 0) << " + place + ");\r\n";
                    place--;
                }
                code += "            index++;\r\n";
            }
        }
        /**
         * Returns true if the type has a reference field of a particular type.
         */
        protected bool HasReferenceField(PatternBufferType type, string fieldName, String referrableName)
        {
            PatternBufferField field = this.GetField <ReferenceFieldType>(type, fieldName);

            return(((ReferenceFieldType)field.FieldType).ReferrableName.Equals(referrableName));
        }
        /**
         * Returns true if the type has a field of a prticular type.
         */
        protected bool HasPrimitiveField(PatternBufferType type, string fieldName, PrimitiveType primitiveType)
        {
            PatternBufferField field = this.GetField <PrimitiveFieldType>(type, fieldName);

            return(((PrimitiveFieldType)field.FieldType).PrimitiveType == primitiveType);
        }