Пример #1
0
        /// <summary>
        /// Generates a bit string type
        /// </summary>
        /// <param name="emitter">The emitter to write to</param>
        /// <param name="typeName">The name of the type</param>
        /// <param name="def">The bitstring definition</param>
        private void _generateBitString(CSharpEmitter emitter, string typeName, string fieldName, BitStringDefinition def)
        {
            typeName = _getDefinitionName(typeName, fieldName, def);
            using (var s = emitter.Struct(typeName))
            {
                using (var bits = emitter.Enum("Bits", "byte"))
                {
                    for (int i = 0; i < def.Bits.Length; i++)
                    {
                        var bit = def.Bits[i];
                        bits.EnumValue(_transformFieldName(bit.Name), bit.Index, i == def.Bits.Length - 1);
                    }
                }

                s.WriteLine();
                s.WriteLine("private BitString56 _bitstring;");

                s.WriteLine();
                s.WriteLineRaw("public byte Length { get { return _bitstring.Length; } }");

                s.WriteLine();
                s.WriteLine("public bool this[Bits bit] {{ get {{ return _bitstring[(int)bit]; }} }}");

                s.WriteLine();
                using (var cons = s.Constructor(typeName, new Parameter[] { new Parameter("BitString56", "bitstring") }))
                {
                    cons.WriteLine("this._bitstring = bitstring;");
                }

                s.WriteLine();
                s.WriteLine("public {0} WithLength(byte length) {{ return new {0}(_bitstring.WithLength(length)); }}", typeName);

                s.WriteLine();
                s.WriteLine("public {0} WithBit(Bits bit, bool set = true) {{ return new {0}(_bitstring.WithBit((int)bit, set)); }}", typeName);

                s.WriteLine();
                s.StaticReadonlyField("Schema", "ISchema", "PrimitiveSchema.BitString56Schema");

                s.WriteLine();
                using (var load = s.StaticMethod("Load", typeName, new Parameter[] { new Parameter("IValueStream", "stream") }))
                {
                    load.WriteLine("var temp = Value<BitString56>.Load(stream);");
                    load.WriteLine("return new {0}(temp);", typeName);
                }

                s.WriteLine();
                using (var save = s.StaticMethod("Save", "void", new Parameter[] { new Parameter("IValueSink", "sink"), new Parameter(typeName, "value") }))
                {
                    save.WriteLine("Value<BitString56>.Save(sink, value._bitstring);");
                }
            }
        }