/// <summary>
        /// Generates the Enumeration serializer code
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for enums</returns>
        private string GenerateSerializerSignature(XerusEnumType dataType)
        {
            string name = dataType.Name;
            var    tb   = new TextBuilder();

            tb.AppendLine(string.Format(@"/** Serializer for data type {0}
*  @param input Data type
*  @param data Buffer for the serialized data
*  @return Length of the serialized data in bytes
*/", name));
            tb.AppendLine("static uint16 {0}_To_Bytes(const {0} input, uint8 *const data);", name);
            return(tb.ToString());
        }
        /// <summary>
        /// Generates the deserializer code for an enum.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Derializer code for enums</returns>
        private string GenerateDeserializerSignature(XerusEnumType dataType)
        {
            string name = dataType.Name;

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(@"/** Deserializer for data type {0}
*  @param data Buffer with the serialized data
*  @param output Data type
*  @return  Length of the data in bytes
*/", name));
            tb.AppendLine("static uint16 Bytes_To_{0}(const uint8 *const data, {0}& output );", name);
            return(tb.ToString());
        }
        /// <summary>
        /// Generates the serializer code for an enum
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for enums</returns>
        private string GenerateSerializerDefinition(XerusEnumType dataType, string serializerName)
        {
            string name = dataType.Name;

            int maxValue = 0;

            foreach (var xerusEnumMemberType in dataType.Members)
            {
                if (xerusEnumMemberType.DefinedValue > maxValue)
                {
                    maxValue = xerusEnumMemberType.DefinedValue;
                }
            }

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Serializer for data type {0}
*  @param input Data type
*  @param data Buffer for the serialized data
*  @return Length of the serialized data in bytes
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::{0}_To_Bytes(const {0} input, uint8 *const data)", name);
            tb.AppendLine("{");
            tb.PushIndent();

            if (maxValue > 65535)
            {
                tb.AppendLine("uint32_To_Bytes((const uint32)input, data);");
                tb.AppendLine("return 4;");
            }
            else if (maxValue > 255)
            {
                tb.AppendLine("uint16_To_Bytes((const uint16)input, data);");
                tb.AppendLine("return 2;");
            }
            else
            {
                tb.AppendLine("data[0] = input;");
                tb.AppendLine("return 1;");
            }
            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
        /// <summary>
        /// Generates the deserializer code for an enum.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Derializer code for enums</returns>
        private string GenerateDeserializerDefinition(XerusEnumType dataType, string serializerName)
        {
            string name = dataType.Name;

            int maxValue = 0;

            foreach (var xerusEnumMemberType in dataType.Members)
            {
                if (xerusEnumMemberType.DefinedValue > maxValue)
                {
                    maxValue = xerusEnumMemberType.DefinedValue;
                }
            }

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Deserializer for data type {0}
*  @param data Buffer with the serialized data
*  @return Deserialized data type
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::Bytes_To_{0}(const uint8 *const data, {0}& output )", name);
            tb.AppendLine("{");
            tb.PushIndent();

            if (maxValue > 65535)
            {
                tb.AppendLine("return Bytes_To_uint32(data, (uint32&) output);", name);
            }
            else if (maxValue > 255)
            {
                tb.AppendLine("return Bytes_To_uint16(data, (uint16&) output);", name);
            }
            else
            {
                tb.AppendLine("return Bytes_To_uint8(data, (uint8&) output);", name);
            }

            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
Beispiel #5
0
        /// <summary>
        /// Creates the model.
        /// </summary>
        /// <returns>The model</returns>
        private static IXerusModel CreateModelOutOfAssembly(Assembly assembly)
        {
            IXerusModel model = new XerusModel();

            var builder = new ContainerBuilder();

            builder.RegisterAssemblyTypes(assembly)
            .Where(t => typeof(IModelDefinition).IsAssignableFrom(t)).AsSelf().As <IModelDefinition>().SingleInstance();
            var container = builder.Build();


            foreach (var type in assembly.DefinedTypes)
            {
                if (type.IsEnum)
                {
                    foreach (var attribute in type.CustomAttributes)
                    {
                        if (attribute.AttributeType == typeof(XerusEnumAttribute))
                        {
                            model.AddDataType(XerusEnumType.CreateFromEnum(type));
                        }
                    }
                }
                if (typeof(IXerusDataType).IsAssignableFrom(type))
                {
                    var instance = Activator.CreateInstance(type) as IXerusDataType;
                    model.AddDataType(instance);
                }
            }

            var modelDefinitions = container.Resolve <IEnumerable <IModelDefinition> >();

            foreach (var modelDefinition in modelDefinitions)
            {
                modelDefinition.Define(model);
            }


            return(model);
        }
Beispiel #6
0
        /// <summary>
        /// Creates the the type definition for specified enumeration data type.
        /// </summary>
        /// <param name="enumDataType">Type of the enumeration data type.</param>
        private void Create(XerusEnumType enumDataType)
        {
            this.AddMultiLineDescription(enumDataType.Description);
            this.AppendLine("enum " + enumDataType.Name);
            this.AppendLine("{");
            this.PushIndent();
            for (var i = 0; i < enumDataType.Members.Count; i++)
            {
                var member = enumDataType.Members[i];
                var last   = i == enumDataType.Members.Count - 1;
                this.Append(member.Name + " = " + member.DefinedValue);
                if (!last)
                {
                    this.Append(",");
                }

                this.AddSingleLineDescription(member.Description);
                this.AppendLine();
            }
            this.PopIndent();
            this.AppendLine("};");
        }