/// <summary> /// Generates the struct deserializer code. /// </summary> /// <param name="dataType">Type of the data.</param> /// <returns>Serializer code for structs</returns> private string GenerateDeserializerSignature(XerusStruct 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 struct serializer code. /// </summary> /// <param name="dataType">Type of the data.</param> /// <returns>Serializer code for structs</returns> private string GenerateSerializerSignature(XerusStruct 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> /// 转换为字符串 /// </summary> /// <returns></returns> public override string ToString() { var builder = new TextBuilder(); const string timeFormat = "yyyy-MM-dd HH:mm:ss.fff"; if (this.HasRequest == true) { builder .AppendLine($"[REQUEST]{this.RequestTime.ToString(timeFormat)}") .AppendIfNotNull(this.RequestHeaders) .AppendLineIfNotNull(this.RequestContent); } if (this.HasResponse == true) { builder .AppendLineIfHasValue() .AppendLine($"[RESPONSE]{this.ResponseTime.ToString(timeFormat)}") .AppendIfNotNull(this.ResponseHeaders) .AppendLineIfNotNull(this.ResponseContent); } if (this.Exception != null) { builder .AppendLineIfHasValue() .AppendLine($"[EXCEPTION]") .AppendLine(this.Exception.ToString()); } return(builder .AppendLineIfHasValue() .Append($"[ELAPSED]{this.ResponseTime.Subtract(this.RequestTime)}") .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()); }
private void DoTabComplete(bool incremental) { if (_hasTabCompleteResults) { string firstMatch = _tabCompleteMatches[_tabCompleteMatchIndex].Match; //_textBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompleteLength; if (_tabCompletePrevLength > 0) { TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompletePrevLength; for (int i = 0; i < _tabCompletePrevLength; i++) { TextBuilder.RemoveCharacter(); } } else { TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompleteLength; for (int i = 0; i < _tabCompleteLength; i++) { TextBuilder.RemoveCharacter(); } } TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart; TextBuilder.AppendLine(firstMatch); _tabCompletePrevLength = firstMatch.Length; if (incremental) { if (_tabCompleteMatchIndex + 1 >= _tabCompleteMatches.Length) { _tabCompleteMatchIndex = 0; } else { _tabCompleteMatchIndex++; } } else { if (_tabCompleteMatchIndex - 1 < 0) { _tabCompleteMatchIndex = _tabCompleteMatches.Length - 1; } else { _tabCompleteMatchIndex--; } } return; } }
/// <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 deserializer for the specified data type. /// </summary> /// <param name="dataType">Type of the data.</param> /// <returns>Serializer code for base types</returns> private string GenerateDeserializerDefinition(XerusBaseType dataType, string serializerName) { string name = dataType.GetType().XerusTypeName(TargetLanguage.Cpp); 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(); var languageSpecificTypeDefinition = dataType.GetType().TypeDefinition(TargetLanguage.Cpp); tb.AppendLine("output = ( *((const {0}*)(data)) );", name); tb.AppendLine("return {0};", languageSpecificTypeDefinition.NumberOfBytes); tb.PopIndent(); tb.AppendLine("}"); return(tb.ToString()); }
/// <summary> /// Creates serializer for the specified data type. /// </summary> /// <param name="dataType">Type of the data.</param> /// <returns>Serializer code for base types</returns> private string GenerateSerializerDefinition(XerusBaseType dataType, string serializerName) { string name = dataType.GetType().XerusTypeName(TargetLanguage.Cpp); 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(); var languageSpecificTypeDefinition = dataType.GetType().TypeDefinition(TargetLanguage.Cpp); tb.AppendLine("*(({0}*)(data)) = input;", name); tb.AppendLine("return {0};", languageSpecificTypeDefinition.NumberOfBytes); tb.PopIndent(); tb.AppendLine("}"); return(tb.ToString()); }
public void AppendLine(string str) => builder.AppendLine(str);
/// <summary> /// Generates the struct deserializer code. /// </summary> /// <param name="dataType">Type of the data.</param> /// <returns>Serializer code for structs</returns> private string GenerateDeserializerDefinition(XerusStruct dataType, string serializerName) { string name = dataType.Name; var tb = new TextBuilder(); tb.AppendLine(string.Format( @"/** Deserializer for data type {0} * @param input Data type * @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(); tb.AppendLine("int offset = 0;"); foreach (var memberInfo in dataType.GetType().GetFields()) { var fieldType = memberInfo.FieldType; if (fieldType.IsArray) { var arrayRank = fieldType.GetArrayRank(); var value = memberInfo.GetValue(dataType); if (value == null) { throw new ModelValidationException(string.Format("The dimension of the array {0}.{1} has to be specifed. e.g. DataType[,] Member1 = new DataType[5,2]", dataType.Name, memberInfo.Name)); } var array = value as Array; var indexString = new StringBuilder(); for (int currentRank = 0; currentRank < arrayRank; currentRank++) { tb.AppendLine("for (int index{0} = 0; index{0} < {1}; index{0}++)", currentRank, array.GetLength(currentRank)); tb.AppendLine("{"); tb.PushIndent(); indexString.Append(string.Format("[index{0}]", currentRank)); } tb.AppendLine("offset+=Bytes_To_{0}(data+offset, output.{1}{2});", fieldType.XerusTypeName(TargetLanguage.Cpp), memberInfo.Name, indexString.ToString()); for (int currentRank = 0; currentRank < arrayRank; currentRank++) { tb.PopIndent(); tb.AppendLine("}"); } } else { tb.AppendLine("offset+=Bytes_To_{0}(data+offset, output.{1});", fieldType.XerusTypeName(TargetLanguage.Cpp), memberInfo.Name); } } tb.AppendLine("return offset;"); tb.PopIndent(); tb.AppendLine("}"); return(tb.ToString()); }