예제 #1
0
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write("using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Toe.SPIRV.Spv\r\n{\r\n " +
                       "   public partial class ");

            #line 13 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" : ValueEnum\r\n    {\r\n        [Flags]\r\n        public enum Enumerant\r\n        {\r\n");

            #line 18 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                foreach (var capability in kv.capabilities ?? new List <string>())
                {
            #line default
            #line hidden
                    this.Write("            [Capability(Capability.Enumerant.");

            #line 24 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(capability));

            #line default
            #line hidden
                    this.Write(")]\r\n");

            #line 25 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }


            #line default
            #line hidden
                this.Write("            ");

            #line 28 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                this.Write(" = ");

            #line 28 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(kv.value));

            #line default
            #line hidden
                this.Write(",\r\n");

            #line 29 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            }


            #line default
            #line hidden
            this.Write("        }\r\n\r\n        public ");

            #line 34 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("(Enumerant value)\r\n        {\r\n            Value = value;\r\n        }\r\n");

            #line 38 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                var  paramId     = ViewUtils.GetParameterId(_operand, kv.enumerant);
                var  parameters  = kv.parameters ?? new List <Parameter>();
                bool addIndex    = (parameters.Count != 1);
                var  parameterKv = parameters.Select((parameter, index) => new KeyValuePair <string, string>(addIndex?(paramId + (index + 1)):paramId, ViewUtils.GetTypeName(System.Enum.Parse <SpirvOperandKind>(parameter.kind))));


            #line default
            #line hidden
                this.Write("\r\n        public static ");

            #line 47 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                this.Write(" Create");

            #line 47 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(paramId));

            #line default
            #line hidden
                this.Write("(");

            #line 47 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                Write(string.Join(", ", parameterKv.Select(parameter => $"{parameter.Value} {ViewUtils.ToVarName(parameter.Key)}")));

            #line default
            #line hidden
                this.Write(")\r\n        {\r\n            return new ");

            #line 49 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                this.Write("(Enumerant.");

            #line 49 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(paramId));

            #line default
            #line hidden
                this.Write(")\r\n            {\r\n");

            #line 51 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

                foreach (var parameter in parameterKv)
                {
            #line default
            #line hidden
                    this.Write("                ");

            #line 55 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Key));

            #line default
            #line hidden
                    this.Write(" = ");

            #line 55 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(parameter.Key)));

            #line default
            #line hidden
                    this.Write(",\r\n");

            #line 56 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }


            #line default
            #line hidden
                this.Write("            };\r\n        }\r\n\r\n        public ");

            #line 62 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                this.Write(" Also");

            #line 62 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(paramId));

            #line default
            #line hidden
                this.Write("(");

            #line 62 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                Write(string.Join(", ", parameterKv.Select(parameter => $"{parameter.Value} {ViewUtils.ToVarName(parameter.Key)}")));

            #line default
            #line hidden
                this.Write(")\r\n        {\r\n            Value |= Enumerant.");

            #line 64 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(paramId));

            #line default
            #line hidden
                this.Write(";\r\n");

            #line 65 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

                foreach (var parameter in parameterKv)
                {
            #line default
            #line hidden
                    this.Write("            this.");

            #line 69 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Key));

            #line default
            #line hidden
                    this.Write(" = ");

            #line 69 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(parameter.Key)));

            #line default
            #line hidden
                    this.Write(";\r\n");

            #line 70 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }


            #line default
            #line hidden
                this.Write("            return this;\r\n        }\r\n");

            #line 75 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            }


            #line default
            #line hidden
            this.Write("\r\n\r\n        public static implicit operator ");

            #line 80 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("(");

            #line 80 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(".Enumerant value)\r\n        {\r\n            switch (value)\r\n            {\r\n");

            #line 84 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            var visitedOperands = new HashSet <object>();
            foreach (var kv in _operand.Enumerants)
            {
                if (!visitedOperands.Add(kv.value))
                {
                    continue;
                }
                if (kv.parameters != null && kv.parameters.Count > 0)
                {
                    var enName = ViewUtils.GetParameterId(_operand, kv.enumerant);


            #line default
            #line hidden
                    this.Write("                case Enumerant.");

            #line 93 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write(": throw new InvalidOperationException(\"Can\'t cast ");

            #line 93 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write(" because it requires additional arguments.\");\r\n");

            #line 94 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("                default:\r\n                    return new ");

            #line 99 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("(value);\r\n            }\r\n        }\r\n\r\n        public Enumerant Value { get; priva" +
                       "te set; }\r\n");

            #line 104 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                if (kv.parameters != null && kv.parameters.Count > 0)
                {
                    bool addIndex = (kv.parameters.Count != 1);
                    var  enName   = ViewUtils.GetParameterId(_operand, kv.enumerant);
                    for (int i = 0; i < kv.parameters.Count; ++i)
                    {
                        var paramName = enName; if (addIndex)
                        {
                            paramName += (i + 1);
                        }


            #line default
            #line hidden
                        this.Write("\r\n        public ");

            #line 116 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetTypeName(System.Enum.Parse <SpirvOperandKind>(kv.parameters[i].kind))));

            #line default
            #line hidden
                        this.Write(" ");

            #line 116 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(paramName));

            #line default
            #line hidden
                        this.Write(" { get; set; }\r\n");

            #line 117 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    }
                }
            }


            #line default
            #line hidden
            this.Write("\r\n        public static ");

            #line 123 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" Parse(WordReader reader, uint wordCount)\r\n        {\r\n            var end = reade" +
                       "r.Position+wordCount;\r\n            var id = (Enumerant) reader.ReadWord();\r\n    " +
                       "        var value = new ");

            #line 127 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("(id);\r\n");

            #line 128 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                if (kv.parameters != null && kv.parameters.Count > 0)
                {
                    bool addIndex = (kv.parameters.Count != 1);
                    var  enName   = ViewUtils.GetParameterId(_operand, kv.enumerant);


            #line default
            #line hidden
                    this.Write("            if (Enumerant.");

            #line 136 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write(" == (id & Enumerant.");

            #line 136 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write("))\r\n            {\r\n");

            #line 138 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

                    for (int i = 0; i < kv.parameters.Count; ++i)
                    {
                        var paramName = enName; if (addIndex)
                        {
                            paramName += (i + 1);
                        }


            #line default
            #line hidden
                        this.Write("                value.");

            #line 143 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(paramName));

            #line default
            #line hidden
                        this.Write(" = Spv.");

            #line 143 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(kv.parameters[i].kind));

            #line default
            #line hidden
                        this.Write(".Parse(reader, wordCount - 1);\r\n");

            #line 144 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            }\r\n");

            #line 148 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("            value.PostParse(reader, wordCount - 1);\r\n            return value;\r\n " +
                       "       }\r\n\r\n        public static ");

            #line 156 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" ParseOptional(WordReader reader, uint wordCount)\r\n        {\r\n            if (wor" +
                       "dCount == 0) return null;\r\n            return Parse(reader, wordCount);\r\n       " +
                       " }\r\n\r\n        public static IList<");

            #line 162 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("> ParseCollection(WordReader reader, uint wordCount)\r\n        {\r\n            var " +
                       "end = reader.Position + wordCount;\r\n            var res = new PrintableList<");

            #line 165 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(@">();
            while (reader.Position < end)
            {
                res.Add(Parse(reader, end-reader.Position));
            }
            return res;
        }

        public override string ToString()
        {
            return Value.ToString();
        }

        public virtual uint GetWordCount()
        {
            uint wordCount = 1;
");

            #line 181 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                if (kv.parameters != null && kv.parameters.Count > 0)
                {
                    bool addIndex = (kv.parameters.Count != 1);
                    var  enName   = ViewUtils.GetParameterId(_operand, kv.enumerant);


            #line default
            #line hidden
                    this.Write("            if (Enumerant.");

            #line 189 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write(" == (Value & Enumerant.");

            #line 189 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write("))\r\n            {\r\n");

            #line 191 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

                    for (int i = 0; i < kv.parameters.Count; ++i)
                    {
                        var paramName = enName; if (addIndex)
                        {
                            paramName += (i + 1);
                        }


            #line default
            #line hidden
                        this.Write("                wordCount += ");

            #line 196 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(paramName));

            #line default
            #line hidden
                        this.Write(".GetWordCount();\r\n");

            #line 197 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            }\r\n");

            #line 201 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("            return wordCount;\r\n        }\r\n\r\n        public void Write(WordWriter " +
                       "writer)\r\n        {\r\n             writer.WriteWord((uint)Value);\r\n");

            #line 211 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                if (kv.parameters != null && kv.parameters.Count > 0)
                {
                    bool addIndex = (kv.parameters.Count != 1);
                    var  enName   = ViewUtils.GetParameterId(_operand, kv.enumerant);


            #line default
            #line hidden
                    this.Write("            if (Enumerant.");

            #line 219 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write(" == (Value & Enumerant.");

            #line 219 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enName));

            #line default
            #line hidden
                    this.Write("))\r\n            {\r\n");

            #line 221 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"

                    for (int i = 0; i < kv.parameters.Count; ++i)
                    {
                        var paramName = enName; if (addIndex)
                        {
                            paramName += (i + 1);
                        }


            #line default
            #line hidden
                        this.Write("                ");

            #line 226 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(paramName));

            #line default
            #line hidden
                        this.Write(".Write(writer);\r\n");

            #line 227 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            }\r\n");

            #line 231 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\FlagTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("        }\r\n    }\r\n}");
            return(this.GenerationEnvironment.ToString());
        }
예제 #2
0
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write("using System;\r\nusing System.Collections.Generic;\r\n\r\nnamespace Toe.SPIRV.Spv\r\n{\r\n " +
                       "   public abstract partial class ");

            #line 13 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" : ValueEnum\r\n    {\r\n        public enum Enumerant\r\n        {\r\n");

            #line 17 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                foreach (var capability in kv.capabilities ?? new List <string>())
                {
            #line default
            #line hidden
                    this.Write("            [Capability(Capability.Enumerant.");

            #line 23 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(capability));

            #line default
            #line hidden
                    this.Write(")]\r\n");

            #line 24 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                }


            #line default
            #line hidden
                this.Write("            ");

            #line 27 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                this.Write(" = ");

            #line 27 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(kv.value));

            #line default
            #line hidden
                this.Write(",\r\n");

            #line 28 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            }


            #line default
            #line hidden
            this.Write("        }\r\n");

            #line 32 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

            foreach (var kv in _operand.Enumerants)
            {
                var enumerantId   = ViewUtils.GetParameterId(_operand, kv.enumerant);
                var enumerantType = enumerantId + "Impl";
                var parameters    = kv.parameters ?? new List <Parameter>();
                var parameterKv   = parameters.Select(parameter => new KeyValuePair <string, string>(ViewUtils.GetParameterName(enumerantType, parameter), ViewUtils.GetTypeName(System.Enum.Parse <SpirvOperandKind>(parameter.kind))))
                                    .ToList();
                {
            #line default
            #line hidden
                    this.Write("\r\n        #region ");

            #line 43 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantId));

            #line default
            #line hidden
                    this.Write("\r\n        public static ");

            #line 44 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                    this.Write(" ");

            #line 44 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantId));

            #line default
            #line hidden
                    this.Write("(");

            #line 44 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    Write(string.Join(", ", parameterKv.Select(parameter => $"{parameter.Value} {ViewUtils.ToVarName(parameter.Key)}")));

            #line default
            #line hidden
                    this.Write(")\r\n        {\r\n");

            #line 46 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                    if (parameters.Count == 0)
                    {
            #line default
            #line hidden
                        this.Write("            return ");

            #line 50 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write(".Instance;\r\n");

            #line 51 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    }
                    else
                    {
            #line default
            #line hidden
                        this.Write("            return new ");

            #line 56 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("(");

            #line 56 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                        Write(string.Join(", ", parameterKv.Select(parameter => $"{ViewUtils.ToVarName(parameter.Key)}")));


            #line default
            #line hidden
                        this.Write(");\r\n");

            #line 59 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            \r\n        }\r\n\r\n        public class ");

            #line 64 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                    this.Write(": ");

            #line 64 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                    this.Write("\r\n        {\r\n");

            #line 66 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                    if (parameters.Count == 0)
                    {
            #line default
            #line hidden
                        this.Write("            public static readonly ");

            #line 70 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write(" Instance = new ");

            #line 70 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("();\r\n        \r\n            private  ");

            #line 72 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("()\r\n            {\r\n            }\r\n");

            #line 75 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    } //end of if (parameters.Count == 0)
                    else
                    {
            #line default
            #line hidden
                        this.Write("            public ");

            #line 80 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("()\r\n            {\r\n            }\r\n\r\n            public ");

            #line 84 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("(");

            #line 84 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        Write(string.Join(", ", parameterKv.Select(parameter => $"{parameter.Value} {ViewUtils.ToVarName(parameter.Key)}")));

            #line default
            #line hidden
                        this.Write(")\r\n            {\r\n");

            #line 86 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                        foreach (var parameter in parameterKv)
                        {
            #line default
            #line hidden
                            this.Write("                this.");

            #line 90 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Key));

            #line default
            #line hidden
                            this.Write(" = ");

            #line 90 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(parameter.Key)));

            #line default
            #line hidden
                            this.Write(";\r\n");

            #line 91 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        }


            #line default
            #line hidden
                        this.Write("            }\r\n");

            #line 95 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    } //end of if (parameters.Count == 0) else


            #line default
            #line hidden
                    this.Write("            public override Enumerant Value => ");

            #line 98 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                    this.Write(".Enumerant.");

            #line 98 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantId));

            #line default
            #line hidden
                    this.Write(";\r\n");

            #line 99 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                    foreach (var parameter in parameterKv)
                    {
            #line default
            #line hidden
                        this.Write("            public ");

            #line 103 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture((parameter.Key == enumerantId)?"new ":""));

            #line default
            #line hidden

            #line 103 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Value));

            #line default
            #line hidden
                        this.Write(" ");

            #line 103 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Key));

            #line default
            #line hidden
                        this.Write(" { get; set; }\r\n");

            #line 104 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            public new static ");

            #line 107 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                    this.Write(" Parse(WordReader reader, uint wordCount)\r\n            {\r\n");

            #line 109 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                    if (parameters.Count == 0)
                    {
            #line default
            #line hidden
                        this.Write("                return Instance;\r\n");

            #line 114 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    }
                    else
                    {
            #line default
            #line hidden
                        this.Write("                var end = reader.Position+wordCount;\r\n                var res = n" +
                                   "ew ");

            #line 120 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                        this.Write("();\r\n");

            #line 121 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                        foreach (var parameter in parameters)
                        {
            #line default
            #line hidden
                            this.Write("                res.");

            #line 125 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterName(enumerantType, parameter)));

            #line default
            #line hidden
                            this.Write(" = Spv.");

            #line 125 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(parameter.kind));

            #line default
            #line hidden
                            this.Write(".Parse(reader, end-reader.Position);\r\n");

            #line 126 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        }


            #line default
            #line hidden
                        this.Write("                return res;\r\n");

            #line 130 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    }


            #line default
            #line hidden
                    this.Write("            }\r\n");

            #line 134 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                    if (parameters.Count > 0)
                    {
            #line default
            #line hidden
                        this.Write("            public override uint GetWordCount()\r\n            {\r\n                u" +
                                   "int wordCount = base.GetWordCount();\r\n");

            #line 141 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                        foreach (var parameter in parameters)
                        {
            #line default
            #line hidden
                            this.Write("                wordCount += ");

            #line 145 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterName(enumerantType, parameter)));

            #line default
            #line hidden
                            this.Write(".GetWordCount();\r\n");

            #line 146 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        }


            #line default
            #line hidden
                        this.Write("                return wordCount;\r\n            }\r\n\r\n            public override v" +
                                   "oid Write(WordWriter writer)\r\n            {\r\n                base.Write(writer);" +
                                   "\r\n");

            #line 155 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

                        foreach (var parameter in parameters)
                        {
            #line default
            #line hidden
                            this.Write("                ");

            #line 159 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                            this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterName(enumerantType, parameter)));

            #line default
            #line hidden
                            this.Write(".Write(writer);\r\n");

            #line 160 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                        }


            #line default
            #line hidden
                        this.Write("            }\r\n");

            #line 164 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    } // if (parameters.Count > 0)


            #line default
            #line hidden
                    this.Write("\r\n            /// <summary>Returns a string that represents the ");

            #line 168 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                    this.Write(" object.</summary>\r\n            /// <returns>A string that represents the ");

            #line 169 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantType));

            #line default
            #line hidden
                    this.Write(" object.</returns>\r\n            /// <filterpriority>2</filterpriority>\r\n         " +
                               "   public override string ToString()\r\n            {\r\n                return $\" ");

            #line 173 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
                    this.Write(".");

            #line 173 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantId));

            #line default
            #line hidden
                    this.Write("(");

            #line 173 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", parameterKv.Select(_ => "{" + _.Key + "}"))));

            #line default
            #line hidden
                    this.Write(")\";\r\n            }\r\n        }\r\n        #endregion //");

            #line 176 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(enumerantId));

            #line default
            #line hidden
                    this.Write("\r\n");

            #line 177 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("\r\n        public abstract Enumerant Value { get; }\r\n\r\n        public static ");

            #line 184 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" Parse(WordReader reader, uint wordCount)\r\n        {\r\n            var id = (Enume" +
                       "rant) reader.ReadWord();\r\n            switch (id)\r\n            {\r\n");

            #line 189 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"

            var visitedEnumerants = new HashSet <object>();
            foreach (var kv in _operand.Enumerants)
            {
                if (visitedEnumerants.Add(kv.value))
                {
            #line default
            #line hidden
                    this.Write("                case Enumerant.");

            #line 196 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                    this.Write(" :\r\n                    return ");

            #line 197 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                    this.Write("Impl.Parse(reader, wordCount - 1);\r\n");

            #line 198 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                }
                else
                {
            #line default
            #line hidden
                    this.Write("                //");

            #line 203 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                    this.Write(" has the same id as another value in enum.\r\n                //case Enumerant.");

            #line 204 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                    this.Write(" :\r\n                //    return ");

            #line 205 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                    this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.GetParameterId(_operand, kv.enumerant)));

            #line default
            #line hidden
                    this.Write(".Parse(reader, wordCount - 1);\r\n");

            #line 206 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
                }
            }


            #line default
            #line hidden
            this.Write("                default:\r\n                    throw new IndexOutOfRangeException(" +
                       "\"Unknown ");

            #line 211 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" \"+id);\r\n            }\r\n        }\r\n        \r\n        public static ");

            #line 215 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(" ParseOptional(WordReader reader, uint wordCount)\r\n        {\r\n            if (wor" +
                       "dCount == 0) return null;\r\n            return Parse(reader, wordCount);\r\n       " +
                       " }\r\n\r\n        public static IList<");

            #line 221 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write("> ParseCollection(WordReader reader, uint wordCount)\r\n        {\r\n            var " +
                       "end = reader.Position + wordCount;\r\n            var res = new PrintableList<");

            #line 224 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\EnumTemplate.tt"
            this.Write(this.ToStringHelper.ToStringWithCulture(_operand.Name));

            #line default
            #line hidden
            this.Write(@">();
            while (reader.Position < end)
            {
                res.Add(Parse(reader, end-reader.Position));
            }
            return res;
        }

        public override string ToString()
        {
            return Value.ToString();
        }

        public virtual uint GetWordCount()
        {
            return 1;
        }

        public virtual void Write(WordWriter writer)
        {
            writer.WriteWord((uint)Value);
        }
    }
}");
            return(this.GenerationEnvironment.ToString());
        }