コード例 #1
0
    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));
    }
コード例 #2
0
ファイル: StructTypeModel.cs プロジェクト: Cubeage/FlatSharp
        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)));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
    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)));
    }
コード例 #5
0
    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);
    }
コード例 #6
0
        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
            });
        }
コード例 #7
0
        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)));
        }
コード例 #8
0
ファイル: StringTypeModel.cs プロジェクト: IoTSharp/FlatSharp
 public override CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context)
 {
     return(new CodeGeneratedMethod($"{context.SpanWriterVariableName}.{nameof(SpanWriterExtensions.WriteString)}({context.SpanVariableName}, {context.ValueVariableName}, {context.OffsetVariableName}, {context.SerializationContextVariableName});"));
 }
コード例 #9
0
 public abstract CodeGeneratedMethod CreateSerializeMethodBody(SerializationCodeGenContext context);