/// <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()); }
/// <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); }
/// <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("};"); }