public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { string body; if (context.AllFieldContexts.SelectMany(x => x.Value).Any(x => x.SharedString)) { // If we know this schema includes shared strings, add the if statement here. body = $@" if ({context.TableFieldContextVariableName}.{nameof(TableFieldContext.SharedString)}) {{ var sharedStringWriter = {context.SerializationContextVariableName}.{nameof(SerializationContext.SharedStringWriter)}; if (!(sharedStringWriter is null)) {{ sharedStringWriter.{nameof(ISharedStringWriter.WriteSharedString)}( {context.SpanWriterVariableName}, {context.SpanVariableName}, {context.OffsetVariableName}, {context.ValueVariableName}, {context.SerializationContextVariableName}); return; }} }} {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteString)}( {context.SpanVariableName}, {context.ValueVariableName}, {context.OffsetVariableName}, {context.SerializationContextVariableName}); "; } else { // otherwise, we can omit that code entirely. body = $@" {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteString)}( {context.SpanVariableName}, {context.ValueVariableName}, {context.OffsetVariableName}, {context.SerializationContextVariableName}); "; } return(new CodeGeneratedMethod(body)); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { List <string> body = new List <string>(); for (int i = 0; i < this.Members.Count; ++i) { var memberInfo = this.Members[i]; string propertyAccessor = $"{context.ValueVariableName}.{memberInfo.PropertyInfo.Name}"; if (memberInfo.CustomGetter is not null) { propertyAccessor = $"{context.ValueVariableName}.{memberInfo.CustomGetter}"; } var propContext = context.With( offsetVariableName: $"({memberInfo.Offset} + {context.OffsetVariableName})", valueVariableName: $"({propertyAccessor})"); string invocation = propContext.GetSerializeInvocation(memberInfo.ItemTypeModel.ClrType) + ";"; if (!memberInfo.ItemTypeModel.ClrType.IsValueType) { // Force members of structs to be non-null. int start = memberInfo.Offset; int length = memberInfo.Length; invocation = $@" var index{i}Value = {propertyAccessor}; if (index{i}Value is null) {{ {context.SpanVariableName}.Slice({start} + {context.OffsetVariableName}, {length}).Clear(); }} else {{ {invocation} }} "; } body.Add(invocation); } return(new CodeGeneratedMethod(string.Join("\r\n", body))); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { var type = this.ClrType; var itemTypeModel = this.ItemTypeModel; string body = $@" int count = {context.ValueVariableName}.{this.LengthPropertyName}; int vectorOffset = {context.SerializationContextVariableName}.{nameof(SerializationContext.AllocateVector)}({itemTypeModel.PhysicalLayout[0].Alignment}, count, {this.PaddedMemberInlineSize}); {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteUOffset)}({context.SpanVariableName}, {context.OffsetVariableName}, vectorOffset, {context.SerializationContextVariableName}); {context.SpanWriterVariableName}.{nameof(SpanWriter.WriteInt)}({context.SpanVariableName}, count, vectorOffset, {context.SerializationContextVariableName}); vectorOffset += sizeof(int); for (int i = 0; i < count; ++i) {{ var current = {context.ValueVariableName}[i]; {this.GetThrowIfNullStatement("current")} {context.MethodNameMap[itemTypeModel.ClrType]}({context.SpanWriterVariableName}, {context.SpanVariableName}, current, vectorOffset, {context.SerializationContextVariableName}); vectorOffset += {this.PaddedMemberInlineSize}; }}"; return(new CodeGeneratedMethod(body)); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { List <string> body = new List <string>(); body.Add($"Span<byte> scopedSpan = {context.SpanVariableName}.Slice({context.OffsetVariableName}, {this.PhysicalLayout[0].InlineSize});"); FlatSharpInternal.Assert(!this.ClrType.IsValueType, "Value-type struct is unexpected"); body.Add( $@" if ({context.ValueVariableName} is null) {{ scopedSpan.Clear(); return; }} "); for (int i = 0; i < this.Members.Count; ++i) { var memberInfo = this.Members[i]; string propertyAccessor = $"{context.ValueVariableName}.{memberInfo.PropertyInfo.Name}"; if (memberInfo.CustomAccessor is not null) { propertyAccessor = $"{context.ValueVariableName}.{memberInfo.CustomAccessor}"; } var propContext = context with { SpanVariableName = "scopedSpan", OffsetVariableName = $"{memberInfo.Offset}", ValueVariableName = $"{propertyAccessor}" }; string invocation = propContext.GetSerializeInvocation(memberInfo.ItemTypeModel.ClrType) + ";"; body.Add(invocation); } return(new CodeGeneratedMethod(string.Join("\r\n", body))); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { var type = this.ClrType; var itemTypeModel = this.ItemTypeModel; var innerContext = context with { ValueVariableName = "current", OffsetVariableName = "tuple" }; string body = $@" int count = {context.ValueVariableName}.{this.LengthPropertyName}; int discriminatorVectorOffset = {context.SerializationContextVariableName}.{nameof(SerializationContext.AllocateVector)}(sizeof(byte), count, sizeof(byte)); {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteUOffset)}({context.SpanVariableName}, {context.OffsetVariableName}.offset0, discriminatorVectorOffset); {context.SpanWriterVariableName}.{nameof(SpanWriter.WriteInt)}({context.SpanVariableName}, count, discriminatorVectorOffset); discriminatorVectorOffset += sizeof(int); int offsetVectorOffset = {context.SerializationContextVariableName}.{nameof(SerializationContext.AllocateVector)}(sizeof(int), count, sizeof(int)); {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteUOffset)}({context.SpanVariableName}, {context.OffsetVariableName}.offset1, offsetVectorOffset); {context.SpanWriterVariableName}.{nameof(SpanWriter.WriteInt)}({context.SpanVariableName}, count, offsetVectorOffset); offsetVectorOffset += sizeof(int); for (int i = 0; i < count; ++i) {{ var current = {context.ValueVariableName}{this.Indexer("i")}; var tuple = (discriminatorVectorOffset, offsetVectorOffset); {innerContext.GetSerializeInvocation(itemTypeModel.ClrType)}; discriminatorVectorOffset++; offsetVectorOffset += sizeof(int); }}"; return new CodeGeneratedMethod(body); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { var type = this.ClrType; var itemTypeModel = this.ItemTypeModel; string body = $@" int count = {context.ValueVariableName}.{nameof(IIndexedVector<string, string>.Count)}; int vectorOffset = {context.SerializationContextVariableName}.{nameof(SerializationContext.AllocateVector)}({itemTypeModel.PhysicalLayout[0].Alignment}, count, {this.PaddedMemberInlineSize}); {context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteUOffset)}({context.SpanVariableName}, {context.OffsetVariableName}, vectorOffset, {context.SerializationContextVariableName}); {context.SpanWriterVariableName}.{nameof(SpanWriter.WriteInt)}({context.SpanVariableName}, count, vectorOffset, {context.SerializationContextVariableName}); vectorOffset += sizeof(int); foreach (var pair in {context.ValueVariableName}) {{ var key = pair.Key; var current = pair.Value; {context.MethodNameMap[itemTypeModel.ClrType]}({context.SpanWriterVariableName}, {context.SpanVariableName}, current, vectorOffset, {context.SerializationContextVariableName}); vectorOffset += {this.PaddedMemberInlineSize}; }}"; return(new CodeGeneratedMethod { MethodBody = body, IsMethodInline = false }); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { List <string> body = new List <string>(); for (int i = 0; i < this.Members.Count; ++i) { var memberInfo = this.Members[i]; string propertyAccessor = $"{context.ValueVariableName}.{memberInfo.PropertyInfo.Name}"; if (!memberInfo.ItemTypeModel.ClrType.IsValueType) { // Force members of structs to be non-null. propertyAccessor += $" ?? new {CSharpHelpers.GetCompilableTypeName(memberInfo.ItemTypeModel.ClrType)}()"; } var propContext = context.With( offsetVariableName: $"({memberInfo.Offset} + {context.OffsetVariableName})", valueVariableName: $"({propertyAccessor})"); body.Add(propContext.GetSerializeInvocation(memberInfo.ItemTypeModel.ClrType) + ";"); } return(new CodeGeneratedMethod(string.Join("\r\n", body))); }
public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context) { return(new CodeGeneratedMethod($"{context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteString)}({context.SpanVariableName}, {context.ValueVariableName}, {context.OffsetVariableName}, {context.SerializationContextVariableName});")); }
public abstract CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context);